前言
setup和teardown能实现在测试用例执行之前或之后做一些操作,但是这种是整个测试脚本全局生效的;
如果我们想实现某些用例执行之前进行登录,某些用例执行之前不需要进行登录,这种场景我们再使用setup和teardown就无法实现了,这时候我们就需要用到fixture功能了。
fixture函数
fixture(scope="function", params=None, autouse=False, ids=None, name=None)
参数说明:
1、scope:fixture函数的作用域;可选值:function(默认)、class、module、session
- function:作用于每个方法或函数,每个方法或函数都运行一次
- class:作用于整个class类,每个class中的所有test只运行一次
- module:作用于整个模块,每个module中的所有test只运行一次
- session:作用于整个session,整个session只运行一次(慎用)
2、params:列表类型;一个可选的参数列表;它将会多次调用被fixture标记的方法和所有用到这个fixture的test测试用例;默认为None;当前调用参数可以用 request.param 来获取。
3、autouse:如果为True,则为所有测试用例激活fixture,运行测试用例的时候会自动运行被fixture标记的方法;如果为False,则需要显示指定来激活fixture,不会自动运行。
4、ids:id字符串列表,与params相对应,因此它们也是测试的一部分。如果没有提供ids,那么将会从params来自动生成。
5、name:fixture的名称。默认为被fixture装饰器标记的函数名。
fixture的使用
1、通过参数引用fixture函数
举例:
# file_name:test_fixture.py
import pytest
class Test_A:
@pytest.fixture()
def before(self):
print("\n--------before fixture has ran--------")
def test_a(self, before): # test_a方法以参数的形式传入了被fixture标记的函数,fixture的名称默认为被fixture标记的函数名
print('-------test_a has ran-------')
assert 1
if __name__ == '__main__':
pytest.main(['-s', 'test_fixture.py'])
运行结果:
从结果中可以看到被fixture标记的函数before会优先于测试用例test_a运行。
2、通过使用name参数来引用fixture函数
①name参数表示fixture的重命名;
②通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名。
举例1:
# file_name:test_fixture.py
import pytest
class Test_A:
@pytest.fixture(name="before_fixture_name")
def before(self):
print("\n--------before fixture has ran--------")
def test_a(self, before_fixture_name): # test_a方法以参数的形式传入了被fixture标记的函数,这里的fixture名称为:before_fixture_na