700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > pytest你不懂fixture 你没学会pytest!

pytest你不懂fixture 你没学会pytest!

时间:2021-03-05 07:35:14

相关推荐

pytest你不懂fixture 你没学会pytest!

pytest的精髓在这里,可以么说

Pytest之fixturefixtur当做参数传入fixturep完整语法参数说明autouse调用方式1调用方式2fixture之scope详解functionclassmodulesession目录结构conftest.py运行test01文件如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到893694563,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术

Pytest之fixture

fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活按模块化的方式实现,每个fixture都可以互相调用fixture的范围从简单的单元测试到复杂的功能测试,可以对fixture配置参数,或者跨函数function,类class,模块module或整个测试session范围

fixtur当做参数传入

将login函数直接做为参数传入

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest@pytest.fixture()def login():print('登录系统')**直接使用函数名做为参数传入**def test_01(login):print('测试用例一')def test_02():print('测试用例2')def test03():print('测试用例3')

运行结果

只有tes_01调用了login遗留问题来了,如果我这里有10个方法或更多?是不是都需调用login方法?继续看下面的fixture参数

testcase.py::test_01 登录系统测试用例一PASSEDtestcase.py::test_02 测试用例2PASSEDtestcase.py::test03 测试用例3PASSED

fixturep完整语法

# scope有4个作用范围:function(不填则默认)、class、module、sessionfixture(scope='function', params=None, autouse=False, ids=None, name=None)

参数说明

scope:即作用域,function"(默认),“class”,“module”,"session"四个params:可选参数列表,它将导致多个参数调用fixture函数和所有测试使用它。autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixtureids:params测试ID的一部分。如果没有将从params自动生成.name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name。session的作用域:是整个测试会话,即开始执行pytest到结束测试

scope参数作用范围控制fixture的作用范围:session>module>class>function

autouse

平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦。fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了

调用方式1

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest@pytest.fixture()def login():print("打开浏览器")# 直接传入函数名def test1(login):print("test1里的用例")def test2(login):print("test2里的用例")pytest.main(["-s", "day2.py"])

调用方式2

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest# autouse设为True,就能自动调用login的装饰器@pytest.fixture(autouse=True)def login():print("打开浏览器")# autouse=True自动调用装饰器函数login,就不需要单独去传入装饰器函数名def test1():print("test1里的用例")def test2():print("test2里的用例")pytest.main(["-s", "day2.py"])

fixture之scope详解

function

function:作用域为函数socpe默认参数为function所有的方法都调用了login

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest@pytest.fixture(scope='function', autouse=True)def login():print('login方法先执行')def test_01():print('测试用例一')def add():print("这条用例不会执行")pytest.main(["-s", "day2.py"])

运行结果

符合用例名设计的都会调用装饰器add函数不符合用例设计,所以不会执行也不会调用装饰器

day2.py login方法先执行测试用例一

class

class:作用域为类所以TestCase1和TestCase2这两个类都会执行一次login

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest@pytest.fixture(scope='class', autouse=True)def login():print('login方法先执行')class TestCase1:def test_01(self):print('测试用例1')class TestCase2:def test_02(self):print('测试用例2')def test03(self):print('测试用例3')

运行结果

类里所有方法只会调用一次装饰器TestCase2两个方法只执行了一次login方法

login方法先执行测试用例1.login方法先执行测试用例2.测试用例3

module

module:在当前.py脚本里面所有用例开始前只执行一次只要符合用例的设计要求,不管是类里和外边的都会调用

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest@pytest.fixture(scope='module', autouse=True)def login():print("login方法先执行")def test1():print("用例1")class TestCase():def test2(self):print("用例2")def test3(self):print("用例3")pytest.main(["-s", "day2.py"])

运行结果

当前整个文件只调用了一次装饰器

day2.py login方法先执行用例1用例2用例3

session

fixture为session级别是可以跨.py模块调用的使用的时候不需要导入conftest文件当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope=“session”,并写到conftest.py文件里conftest.py文件名称是固定的,pytest会自动识别该文件。放到工程的根目录下,就可以全局调用了如果放到某个package包下,那就只在该package内有效

目录结构

conftest.py

# -*- coding: utf-8 -*-# @Author : 码上开始import pytest@pytest.fixture(scope='session')def login():print('先执行logiin')

运行test01文件

也可以两个文件同时运行,请自行运行

# -*- coding: utf-8 -*-# @Author : 码上开始import pytestclass Testcase1():def test1(self):print("用例1")def test2():print("用例2")pytest.main(["-s", "test01.py"])

运行结果

test01.py 先执行logiin用例1.用例2

如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到893694563,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。