fixture优势
1.firture相对于setup和teardown来说应该有以下几点优势
- 命名方式灵活,不局限于setup和teardown这几个命名
- conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
- scope="module" 可以实现多个.py跨文件共享前置, 每一个.py文件调用一次
- scope="session" 以实现多个.py跨文件使用一个session来完成多个用例
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
arg autouse: 如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture
arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成
arg name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽;
解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。
scope="function" 方法层级,方法每调用login()一次,login()被执行一次;
scope="class" 类层级,类执行一次,login()被执行一次;即使类里面多处调用login(),也只执行一次;
scope="module" 模块层级,模块执行一次,login()被执行一次;即使模块里面多处调用login(),也只执行一次;
scope="session" package/目录 层级,package/目录 被执行一次,login()被执行一次;即使package里面多处调用login(),也只执行一次;
Fixtures可以选择使用yield
语句为测试函数提供它们的值,而不是return
。 在这种情况下,yield
语句之后的代码块作为拆卸代码执行,而不管测试结果如何。fixture功能必须只产生一次
实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录
# 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录 import pytest @pytest.fixture() def login(): print('先登录') def test_01(login): print('============test_01==========') def test_02(): print('============test_02==========') def test_03(login): print('============test_03==========')View Code
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s ================================================= test session starts ================================================= platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0 collected 3 items test_ee.py 先登录 ============test_01========== .============test_02========== .先登录 ============test_03========== . ================================================== 3 passed in 0.03s ================================================== D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>View Code
获取 fixture 的返回值
# -*- coding:utf-8 -*- # @Author: Sky # @Email: 2780619724@qq.com # @Time: 2021/7/18 20:44 # fixture的返回值如何获取到 # 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录 import pytest @pytest.fixture() def login(): print('先登录') result ={ 'code': 200, 'state': 'sucess' } return result def test_01(login): print('============test_01==========') print(login['code']) print(login['state']) def test_02(): print('============test_02==========') def test_03(login): print('============test_03==========')View Code
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s ================================================= test session starts ================================================= platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0 collected 3 items test_ee.py 先登录 ============test_01========== 200 sucess .============test_02========== .先登录 ============test_03========== . ================================================== 3 passed in 0.05s ================================================== D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>View Code
用class写的用例同样适用
# -*- coding:utf-8 -*- # @Author: Sky # @Email: 2780619724@qq.com # @Time: 2021/7/18 20:44 # fixture的返回值如何获取到 # 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录 import pytest @pytest.fixture() def login(): print('先登录') result ={ 'code': 200, 'state': 'sucess' } return result class TestDemo: def test_01(self, login): print('============test_01==========') print(login['code']) print(login['state']) def test_02(self): print('============test_02==========') def test_03(self, login): print('============test_03==========') assert login['code'] == 200 assert login['state'] == 'Fail'View Code
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s =================================================================================== test session starts ==================================================================================== platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0 collected 3 items test_ee.py 先登录 ============test_01========== 200 sucess .============test_02========== .先登录 ============test_03========== F ========================================================================================= FAILURES ========================================================================================= _____________________________________________________________________________________ TestDemo.test_03 _____________________________________________________________________________________ self = <ee.test_ee.TestDemo object at 0x00000244D749A790>, login = {'code': 200, 'state': 'sucess'} def test_03(self, login): print('============test_03==========') assert login['code'] == 200 > assert login['state'] == 'Fail' E AssertionError: assert 'sucess' == 'Fail' E - Fail E + sucess test_ee.py:34: AssertionError ================================================================================= short test summary info ================================================================================== FAILED test_ee.py::TestDemo::test_03 - AssertionError: assert 'sucess' == 'Fail' =============================================================================== 1 failed, 2 passed in 0.20s ================================================================================ D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>View Code
调用多个 fixture
# -*- coding:utf-8 -*- # @Author: Sky # @Email: 2780619724@qq.com # @Time: 2021/7/18 20:44 # fixture的返回值如何获取到 # 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录 import pytest @pytest.fixture() def register(): print('先注册') result = { 'code': 200, 'state': '注册成功' } return result @pytest.fixture() def login(): print('先登录') result = { 'code': 200, 'state': 'sucess' } return result class TestDemo: def test_01(self, login): print('============test_01==========') print(login['code']) print(login['state']) def test_02(self): print('============test_02==========') def test_03(self, login): print('============test_03==========') assert login['code'] == 200 assert login['state'] == 'sucess' # 调用多个fixture def test_04(self, register, login): assert register['state'] == '注册成功' assert login['state'] == 'sucess' print('============test_02==========')View Code
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s =================================================================================== test session starts ==================================================================================== platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0 collected 4 items test_ee.py 先登录 ============test_01========== 200 sucess .============test_02========== .先登录 ============test_03========== .先注册 先登录 ============test_02========== . ==================================================================================== 4 passed in 0.05s ===================================================================================== D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>View Code