Fixture的调用方式
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
一,参数详解:
1. SCOPE
(1)用于控制Fixture的作用范围
(2)作用类似于Pytest的setup/teardown
(3)默认取值为function(函数级别),控制范围的排序为:session > module> class > function
(4)两种使用方式:
方式一:作为参数传入(示例为函数级)
函数级会在函数前进行调用:
方式二:fixture的相互调用(示例为类级别)
结果:
a)类级别会在类前面进行调用;
b)此时在类函数进行引用时返回的时一个function,所以如果是需要应用到返回值的,需要用方式一
c)usefixtures与传fixture区别:
如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。
当fixture需要用到return出来的结果时,只能将参数名称直接当参数传入,不需要用到return出来的结果时,两种方式都可以
2. params:
(1)默认None,每个param的值fixture都会去调用执行一次,类似for循环
(2)可与参数ids一起使用,作为每个参数的标识,详见ids
(3)被Fixture装饰的函数要调用是采用:Request.param
结果:
3.ids:
(1)用例标识ID
(2)与params配合使用,一对一关系
示例:
结果:
4.autouse:
(1)默认False
(2)若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名
(3)autouse=False时,函数或类里面方法直接传fixture的函数参数名称,或使用装饰器@pytest.mark.usefixtures()修饰
(4)autouse=True自动调用,无需传仍何参数,作用范围跟着scope走(谨慎使用)
示例:
结果:
5.Name:
fixture的重命名
(1)通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名
(2)如果使用了name,那只能将name传如,函数名不再生效
示例:
调用:
二,Fixture与yield一起使用可以达到setup/teardown相同的效果(示例为模块级)
Ps:yield下面的内容将在模块末尾进行执行;
示例:
模块级别会在模块前进行调用:
三,多个fixture函数
(1)多个fiture函数时,函数调用顺序是从下到上;也是就越靠近越优先;
调用结果:
四,Fixture与addfinalizer一起使用也可以达到yield的效果,不同的是需要注册作为终结器使用的函数
示例:
结果:
五,参数化
@pytest.mark.parametrize('参数名',list)可以实现测试用例参数化
(1)第一个参数是字符串,多个参数中间用逗号隔开
(2)第二个参数是list,多组数据用元祖类型;传三个或更多参数也是这样传。list的每个元素都是一个元组,元组里的每个元素和按参数顺序一一对应
(3)传一个参数 @pytest.mark.parametrize('参数名',list) 进行参数化
(4)传两个参数@pytest.mark.parametrize('参数名1,参数名2',[(参数1_data[0], 参数2_data[0]),(参数1_data[1], 参数2_data[1])]) 进行参数化
示例:
结果: