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倉庫