有一點首先需要確認的的是,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倉庫
謝謝您的關注,您也可購買我的書籍(出版的書籍已重印),或者購買本人的測試實戰視頻課程,謝謝您的關注!!!