pytest中fixture,pytest fixtures
Setup和teardown可以在测试用例执行之前或之后做一些操作,但这是整个测试脚本的全局效果;
如果我们想在一些用例执行前登录,而一些用例执行前不需要登录,这种场景再次使用setup和teardown是无法实现的,这时就需要使用fixture函数。
fixture函数的参数描述(scope= function ,params=none,autouse=false,ids=none,name=none): 1。范围:夹具功能的范围;可选值:函数(默认)、类、模块、会话
函数:作用于每个方法或函数,每个方法或函数运行一次。class:作用于整个类,每个类中的所有测试只运行一次。模块:作用于整个模块,每个模块中的所有测试只运行一次。session:作用于整个会话,整个会话只运行一次(小心)。2.params:列表类型;可选参数列表;它会多次调用fixture标记的方法以及所有使用这个fixture的测试用例;默认值为无;可以使用request.param获取当前调用参数
3.autouse:如果为True,将为所有测试用例激活fixture,测试用例运行时,fixture标记的方法将自动运行;如果为False,您需要显示名称来激活设备,它将不会自动运行。
4.ID:ID字符串列表,对应于params,所以它们也是测试的一部分。如果没有提供ids,它将从参数中自动生成。
5.名称:名称:夹具的名称。默认值是fixture装饰器标记的函数名。
夹具1的使用。通过参数引用夹具功能。示例:
#文件名:测试夹具. py
导入pytest
类测试_A:
@pytest.fixture()
之前定义(自身):
打印( \n -在夹具运行之前-)
Test _ a (self,before):# test _ a方法作为参数传入fixture标记的函数中,fixture的名称默认为fixture标记的函数的名称。
打印(-测试_a已运行-)
断言1
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从结果可以看出,fixture标记的before函数将在测试用例test _ a之前运行。
2.使用名称参数引用夹具功能名称参数表示夹具的重命名;
一般来说,使用fixture的测试函数会将fixture的函数名作为参数传递,但是pytest也允许重命名fixture。
示例1:
#文件名:测试夹具. py
导入pytest
类测试_A:
@ pytest . fixture(name= before _ fixture _ name )
之前定义(自身):
打印( \n -在夹具运行之前-)
Test _ a (self,before_fixture_name):将# test _ a方法作为参数传入fixture标记的函数中,这里的fixture名称为:before _ fixture _ name。如果没有设置name参数,那么默认情况下,fixture的名称将是fixture所标记的函数的名称。
打印(-测试_a已运行-)
断言1
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])例2:重命名一个fixture函数后,不能用fixture函数的函数名调用,只能用fixture函数重命名的新名称调用。
3.以@ pytest . mark . use fixtures( fixture function name )函数的形式引用fixture函数。例如:
#文件名:测试夹具. py
导入pytest
由fixtures标记的@ pytest.fixture () #函数也可以在测试类之外应用,并通过使用@ py test . mark . use fixtures()decorator来引用。
之前定义():
打印( \n -在夹具运行之前-)
@ pytest . mark . usefixtures( before )#通过使用usefixtures()引用fixtures,当use fixtures()函数的参数是fixture函数的函数名时。
类测试_A:
定义测试_a(自身):
打印(-测试_a已运行-)
断言1
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从结果可以看出,fixture标记的before函数将在测试用例test _ a之前运行。
4.通过autouse=True设置夹具功能的默认执行夹具功能的autouse参数等于False默认情况下;
如果fixture函数的autouse参数为真,那么每个测试函数都会自动调用fixture函数,不需要传入fixture函数的名称。
示例:
#文件名:测试夹具. py
导入pytest
@pytest.fixture(autouse=True) #通过参数autouse=True设置fixture的默认操作。
之前定义():
打印( \n -在夹具运行之前-)
类测试_A:
定义测试_a(自身):
打印(-测试_a已运行-)
断言1
定义测试_b(自身):
打印(- test_b已运行-)
断言1
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从结果中可以看出,我们没有指定test_a和test_b使用fixture,但是fixture是在测试用例执行之前执行的。这是因为我们将fixture设置为autouse=True。
5.夹具的范围设置为功能。例如:
#文件名:测试夹具. py
导入pytest
@ pytest . fixture(scope= function ,autouse=True) #作用域设置为function,fixture默认操作由参数autouse=True设置。
之前定义():
打印( \n -在夹具运行之前-)
类测试_A:
定义测试_a(自身):
打印(-测试_a已运行-)
断言1
定义测试_b(自身):
打印(- test_b已运行-)
断言1
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从结果中可以看出,fixture的作用域设置为scope=function后,fixture标记的函数会在每个测试用例执行前执行一次。
并且通过和前面的例子对比,可以看到设置scope=function和不设置scope参数的执行结果是一致的,说明scope参数的默认值是function。
6.fixture的范围被设置为class。例如:
#文件名:测试夹具. py
导入pytest
@ pytest.fixture (scope= class ,autouse=True) #作用域设置为class,fixture的默认操作由参数autouse=True设置。
之前定义():
打印( \n -在夹具运行之前-)
类测试_A:
定义测试_a(自身):
打印(-测试_a已运行-)
断言1
定义测试_b(自身):
打印(- test_b已运行-)
断言1
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从运行结果可以看出,测试类中有两个测试用例,但是fixture只执行一次。
7.使用fixture返回值的例子:
#文件名:测试夹具. py
导入pytest
@pytest.fixture()
def返回数据():
打印( \n -在夹具运行之前-)
2 #返回值
类测试_A:
def test_a(self,return_data):
打印(-测试_a已运行-)
Assert 1==return_data #获取返回值并做断言。
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从结果可以看出,fixture的返回值是2,在测试用例中断言返回值,断言失败。
8.使用夹具的params参数params参数是夹具功能的可选参数表,支持列表输入;
不传递该参数时,默认为无;
每个param值的fixture函数都会被调用执行一次,类似于for循环。
可以和参数id一起使用,作为每个参数的标识,类似于ids在用例参数化中的作用。
示例:
#文件名:测试夹具. py
导入pytest
@pytest.fixture(params=[1,2,3])
DEF _ DATA (request): #传入参数请求,请求系统内置的fixture。
打印( \n -在夹具运行之前-)
Request.param #通过Request.param获取当前传入的参数。
类测试_A:
def test_a(self,return_data):
Print (-test _ a已运行,return _ data的值为:{}-。format (return _ data))
Assert 1==return_data #获取返回值并做断言。
if __name__==__main__ :
Test.main ([-s , test _ fixture.py])运行结果:
从结果中,我们可以看到测试用例被执行了三次。设置params参数会导致fixture标记的函数被多次调用,使用fixture函数的测试用例会被多次执行。
9.夹具的params参数与ids参数相结合。在fixture函数中配置ids参数之前:用例执行后的标识符是传递的params参数。
fixture函数配置ids参数后:用例执行后的ID是传入的ids参数。并与params参数一一对应。
10.fixture函数的相互调用(fixture函数之间的依赖)示例1:
导入pytest
# fixtrue作为参数,调用对方传入
@pytest.fixture()
定义帐户():
a=账户
打印(“第一层夹具”)
返回a
#Fixture的相互调用必须调用测试类中的这一层Fixture,普通函数的单独调用不会生效。
@pytest.fixture()
定义登录(帐户):
打印(“第二层夹具”)
类测试登录:
def test_1(自己,登录):
Print(直接使用二级夹具,返回值为{} 。格式(登录))
def test_2(自身,账户):
Print(只调用account fixture,返回值为{} 。格式(账户))
if __name__==__main__ :
Pytest.main()运行结果1:
2:比如一个fixture函数依赖于另一个fixture函数,此时就不能用@pytest.mark.usefixtures()调用依赖的fixture函数,这种调用方式不会生效。
需要通过函数传递才能生效。
#测试_夹具_02.py
导入pytest
@pytest.fixture()
def login_weibo():
打印(===========登陆微博==========)
@pytest.fixture()
# @ pytest . mark . use fixtures( log in _ Weibo )#这种方式不会生效
Get _ Weibo _ data (login _ Weibo): #此方式生效。
fixture函数依赖于它,它需要传递函数
打印(=========获取微博数据===========)
@pytest.mark.demo
类TestMyCode:
@ pytest . mark . use fixtures( get _ Weibo _ data )
def test_fixture_005(自身):
fixture函数在测试脚本文件“”中
断言1==1运行结果2:
[注意]
尽管fixture函数支持相互调用,但不支持普通函数直接使用fixture。在调用逐步生效之前,必须在测试函数中调用它。
当有多层fixture函数调用时,首先执行最后一层fixture函数,而不是传入测试函数的fixture函数。
上层夹具功能的值不会自动返回。在这里,逻辑类似于函数相互调用。[需要将函数调用值赋给变量并使用]
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。