pytest 15 fixture之autouse=True, usefixture的单个使用和多个使用,以及fixture调用fixture
前言
平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦。
fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了
调用fixture三种方法
-
1.函数或类里面方法直接传fixture的函数参数名称
-
2.使用装饰器@pytest.mark.usefixtures()修饰
-
3.autouse=True自动使用
用例传fixture参数
方法一:先定义start功能,用例全部传start参数,调用该功能
#!/usr/bin/env/python # -*-coding:utf-8-*- import pytest @pytest.fixture(scope="function") def start(request): print('\n-----开始执行function----') def test_a(start): print("-------用例a执行-------") class Test_aaa(): def test_01(self, start): print('-----------用例01--------------') def test_02(self, start): print('-----------用例02------------')
运行结果:
============================= test session starts ============================== platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0 rootdir: /Users/newcomer/gitByMyself, inifile: plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 3 items python_work_apple/pytest_package/fixtureDemo/test_01.py -----开始执行function---- .-------用例a执行------- -----开始执行function---- .-----------用例01-------------- -----开始执行function---- .-----------用例02------------ [100%] =========================== 3 passed in 0.02 seconds ===========================
方法2.多个fixture被同时调用
#!/usr/bin/python # -*- coding: utf-8 -*- # author:xiaomin pei import pytest @pytest.fixture() def test1(): a = 'zzz' print('\n传出a') return a @pytest.fixture() def test2(): b = '123456' print('\n传出b') return b def test_3(test1, test2): u = test1 p = test2 assert u == 'zzz' assert p == '123456' print('传入多个fixture参数正确') if __name__ == '__main__': pytest.main(['-vs', 'test_multi.py'])
装饰器usefixtures
方法二:使用装饰器@pytest.mark.usefixtures() :主要作用就是定义多个fixture,只用其中的一个或多个,传入的还是fixture的名字
#!/usr/bin/python
# -*- coding: utf-8 -*- # author:xiaomin pei import pytest @pytest.fixture(scope="function") def start(): print('\n-----开始执行function----') @pytest.fixture(scope="function") def second(): print('\n-----开始执行second function----') @pytest.mark.usefixtures("start") def test_a(): print("-------用例a执行,用start fixture,不用second-------") @pytest.mark.usefixtures("second") class Test_aaa: def test_01(self): print('-----------用例01--------------') def test_02(self): print('-----------用例02------------') if __name__ == '__main__': pytest.main(['-vs'#!/usr/bin/env/python
运行结果:
test_usefixture.py::test_a -----开始执行function---- -------用例a执行,用start fixture,不用second------- PASSED test_usefixture.py::Test_aaa::test_01 -----开始执行second function---- -----------用例01-------------- PASSED test_usefixture.py::Test_aaa::test_02 -----开始执行second function---- -----------用例02------------ PASSED ============================== 3 passed in 0.18s ==============================
多个userfixture同时使用,用的是就近原则。比如以下用例,
#!/usr/bin/python # -*- coding: utf-8 -*- # author:xiaomin pei import pytest @pytest.fixture(scope="function") def fix1(): print('\n-----开始执行fix1 function----') @pytest.fixture(scope="function") def fix2(): print('\n-----开始执行fix2 function----') @pytest.mark.usefixtures("fix1") @pytest.mark.usefixtures("fix2") def test_1(): print("-------用例1执行,都用一下,先执行2,在执行1,就近原则-------") @pytest.mark.usefixtures("fix2") @pytest.mark.usefixtures("fix1") class Test_case: def test_2(self): print("-------------------用例2执行----------------------") def test_3(self): print("-------------------用例3执行----------------------") if __name__ == '__main__': pytest.main(['-vs', 'test_multi_usefixture.py'])
结果:用例1是先执行的fix2 ,才执行fix1 。
test_multi_usefixture.py::test_1 -----开始执行fix2 function---- -----开始执行fix1 function---- -------用例1执行,都用一下,先执行2,在执行1,就近原则------- PASSED test_multi_usefixture.py::Test_case::test_2 -----开始执行fix1 function---- -----开始执行fix2 function---- -------------------用例2执行---------------------- PASSED test_multi_usefixture.py::Test_case::test_3 -----开始执行fix1 function---- -----开始执行fix2 function---- -------------------用例3执行---------------------- PASSED ============================== 3 passed in
设置autouse=True
方法三、autouse设置为True,自动调用fixture功能
-
start设置scope为module级别,在当前.py用例模块只执行一次,autouse=True自动使用
-
open_home设置scope为function级别,每个用例前都调用一次,自动使用
#!/usr/bin/env/python # -*-coding:utf-8-*- import pytest @pytest.fixture(scope="module", autouse=True) def start(request): print('\n-----开始执行moule----') print('module : %s' % request.module.__name__) print('----------启动浏览器---------') yield print("------------结束测试 end!-----------") @pytest.fixture(scope="function", autouse=True) def open_home(request): print("function:%s \n--------回到首页--------" % request.function.__name__) def test_01(): print('-----------用例01--------------\n') def test_02(): print('-----------用例02------------\n')
运行结果:
============================= test session starts ============================== platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0 rootdir: /Users/newcomer/gitByMyself, inifile: plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 2 items python_work_apple/pytest_package/fixtureDemo/test_03.py -----开始执行moule---- module : test_03 ----------启动浏览器--------- function:test_01 --------回到首页-------- .-----------用例01-------------- function:test_02 --------回到首页-------- .-----------用例02------------ ------------结束测试 end!----------- [100%] =========================== 2 passed in 0.02 seconds ===========================
写在class里面也是一样的
#!/usr/bin/env/python # -*-coding:utf-8-*- import pytest @pytest.fixture(scope="module", autouse=True) def start(request): print('\n-----开始执行moule----') print('module : %s' % request.module.__name__) print('----------启动浏览器---------') yield print("------------结束测试 end!-----------") class Test_aaa(): @pytest.fixture(scope="function", autouse=True) def open_home(self, request): print("function:%s \n--------回到首页--------" % request.function.__name__) def test_01(self): print('-----------用例01--------------\n') def test_02(self): print('-----------用例02------------\n')
运行结果:
============================= test session starts ============================== platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0 rootdir: /Users/newcomer/gitByMyself, inifile: plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 2 items python_work_apple/pytest_package/fixtureDemo/test_04.py -----开始执行moule---- module : test_04 ----------启动浏览器--------- function:test_01 --------回到首页-------- .-----------用例01-------------- function:test_02 --------回到首页-------- .-----------用例02------------ ------------结束测试 end!----------- [100%] =========================== 2 passed in 0.02 seconds =========================== Process finished with exit code 0