pytest-fixture3种调用方式
Pytest的fixture 3种调用方式
直接进入正题,fixture有以下3种调用方式:
1、传参:将fixture名称作为测试用例函数的输入参数
2、装饰器:在测试用例类或者函数加上装饰器@pytest.mark.usefixtures(fixture_name)
3、autouse:fixture将autouse参数设置True
那么以下直接来一一介绍
方法1:传参:将fixture名称作为测试用例函数的输入参数
可以传多个fixture参数,先执行的在前,后执行的在后
import pytest @pytest.fixture() def login(): print('请输入账号密码') @pytest.fixture() def login2(): print('请输入验证码') def test_01(login,login2): print('登陆成功') def test_02(): print('无需登陆')
输出结果:
从输出打印可以看出,在前fixture的login先执行打印,后fixture的login2再执行打印
方法2:装饰器:在测试用例类或者函数加上装饰器@pytest.mark.usefixtures(fixture_name)
可以设置多个@pytest.mark.usefixtures(),先执行的放底层,后执行的放上层
import pytest @pytest.fixture() def login(): print('请输入账号密码') @pytest.fixture() def login2(): print('请输入验证码') @pytest.mark.usefixtures('login2') @pytest.mark.usefixtures('login') def test_03(): print('用例三:登陆成功')
输出结果:
从输出打印可以看出,在下fixture的login装饰器先执行打印,后fixture的login2装饰器再执行打印
同时pytest.mark.usefixtures装饰器可以设置在测试类上,在测试类声明上加@pytest.mark.usefixtures(),代表这个类里面所有测试用例都会调用该fixture(仅限作用域为function,即scope=function或者默认),如果scope=class,类级别的只调用一次,代码如下:
import pytest @pytest.fixture() def login(): print('请输入账号密码') @pytest.mark.usefixtures('login') class Test_01(): def test_04(self): print('用例4:需要登陆') def test_05(self): print('用例5:不需要登陆')
输出结果:
测试用例test04,test05都执行了login的打印,证明在测试类上设置@pytest.mark.usefixtures()装饰器也能起到作用
方法3:autouse:fixture将autouse参数设置True
当前模块(py)下所有的测试用例都会默认执行该fixture
import pytest @pytest.fixture(autouse=True) def login2(): print('请输入验证码') def test_01(): print('登陆成功') def test_02(): print('无需登陆') class Test_01(): def test_04(self): print('用例4:需要登陆') def test_05(self): print('用例5:不需要登陆')
输出结果:
可以看到不管是类中测试用例还是类外测试用例,只要是当前模块的都执行了fixture(login)
扩展:
1、如果fixture有返回值,用@pytest.mark.usrfixtures()是无法获取到返回值的,会直接提示报错,必须用传参的方式
@pytest.fixture() def login(): print('登陆界面') a = 123 yield a @pytest.mark.usefixtures(login) def test_01(): print(f'返回的数值:{login}')
上面是用@pytest.mark.usrfixtures()调用login,测试用例直接打印login返回的值,输出结果如下:
pytest直接提示error并退出执行,可以看到无法正常调用,那么接下来用传参方式试下:
@pytest.fixture() def login(): print('登陆界面') a = 123 yield a def test_01(login): print(f'返回的数值:{login}')
输出结果:
传参方式调用fixture,返回的参数是可以正常获取到的。这是今后需要值得注意的地方
2、fixture里面可以在调用另一个fixture,调用顺序:先执行内层调用的fixture,后执行外层的fixture
@pytest.fixture() def login(): print('login的调用') @pytest.fixture() def login2(login): print('login2的调用') def test(login2): print('test执行')
输出结果:
以上就是fixture的调用方式,之后对fixture的使用有更好的理解