Pytest中conftest.py共享fixture(五)
- 2019 年 10 月 7 日
- 筆記
有一点首先需要确认的的是,pytest中的fixture是pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制。但是我们更加希望的是在一个测试套件中,能够共享fixture的机制,这样所一个测试套件里面的所有测试点都能够共同使用,和我在早期介绍的分离测试固件的思想有点雷同。在pytest中通过conftest.py来共享fixture,如果希望多个测试文件共同使用一个fixture时候,可以在该目录下创建conftest.py文件,但是切记该文件绝对不能倒入使用,这点一定要注意,创建conftest.py文件后,把需要的fixture加入到里面,就可以使用了。先来一个简单的案例,在一个包中,有三个测试模块,每个测试点都显示开始前执行和结束后执行,也就是说,每个测试点执行的时候,先打印测试开始,然后执行测试点,然后最后打印测试结束,见案例代码:

见conftest.py的源码:
#!/usr/bin/python3 #coding:utf-8 import pytest @pytest.fixture(autouse=True) def wuya(): print('开始测试') yield print('结束测试')
执行模块test_001.py 或者 test_002.py的测试代码,见执行后的结果信息:
cachedir: .pytest_cache rootdir: /Applications/code/stack/study/xunit/conftest01, inifile: plugins: allure-adaptor-1.7.10 collected 2 items test_001.py::test_login_001 SETUP F wuya test_001.py::test_login_001 (fixtures used: wuya)PASSED TEARDOWN F wuya test_002.py::test_logout_001 SETUP F wuya test_002.py::test_logout_001 (fixtures used: wuya)PASSED TEARDOWN F wuya
回溯过程使用到的命令为:pytest –setup-show,如上结果信息就是回溯的过程。
fixture也可以传递测试数据,那么也可以写到conftest.py的文件中,还是看一个案例,见conftest.py的最新源码:
#!/usr/bin/python3 #coding:utf-8 import pytest @pytest.fixture(autouse=True) def wuya(): print('开始测试') yield print('结束测试') @pytest.fixture() def login(): return 'adfghjk34567dsfg'
测试代码见如下:
#!/usr/bin/python3 #coding:utf-8 import pytest def test_login(login): if login=='adfghjk34567dsfg': assert True else: assert False
执行如上的测试代码,见执行后的结果信息:
platform darwin -- Python 3.7.4, pytest-4.0.2, py-1.8.0, pluggy-0.12.0 rootdir: /Applications/code/stack/study/xunit/conftest01, inifile: plugins: allure-adaptor-1.7.10 collected 3 items / 2 deselected test_login.py SETUP F wuya SETUP F login test_login.py::test_login (fixtures used: login, wuya). TEARDOWN F login TEARDOWN F wuya
依据如上的测试代码,可以看出在一个conftest.py中,可以编写多个共享fixture的代码。关于cionftest.py共享fixture的几个注意事项,再次总结下,具体如下:
1、conftest.py文件绝对不能当平常的模块来倒入,是绝对不能
2、conftest.py很多时候是被当作pytest一个本地插件库
3、可以 把一个目录下的conftest.py看成是一个供该目录下所有测试用例使用的fixture仓库