前言
在之前介紹fixture的文章中,我們使用到了conftest.py檔案,那麼conftest.py檔案到底該如何使用呢,下面我們就來詳細瞭解一下conftest.py檔案的特點和使用方法吧
什麼是conftest.py
我們之前瞭解了fixture,fixture可以直接定義在測試指令碼中,但是有些時候,我們希望一個fixture可以被複用,這就需要對fixture進行集中管理,Pytest使用檔案conftest.py
集中管理韌體.在複雜的專案中,可以在不同的目錄層級定義conftest.py,其作用域為其所在的目錄和子目錄,通常情況下,conftest.py
和@pytest.fixture()
會結合使用,來實現全域性的前後置處理。
conftest.py特點
conftest.py
檔案的名稱是固定的,不能修改conftest.py
與執行的用例要在同一個pakage下,並且有__init__.py
檔案- 不需要
import
匯入conftest.py
檔案,pytest用例會自動識別該檔案,放到根目錄下可以全域性目錄呼叫,放在某個package下,那就在該package內有效 - 不同目錄可以有自己的conftest.py,一個專案中可以有多個
conftest.py
- pytest會預設讀取
conftest.py
裡面的所有fixture,所有同目錄測試檔案執行前都會執行conftest.py
檔案
conftest.py用法
在我們實際的測試中,conftest.py檔案需要結合fixture來使用,所以fixture中引數scope也適用conftest.py中fixture的特性,這裡再說明一下
- conftest中fixture的scope引數為session,所有的測試檔案執行前(後)執行一次
conftest.py
檔案中的fixture。- conftest中fixture的scope引數為module,每一個測試.py檔案執行前(後)都會執行一次
conftest.py
檔案中的fixture- conftest中fixture的scope引數為class,每一個測試檔案中的測試類執行前(後)都會執行一次
conftest.py
檔案中的fixture- conftest中fixture的scope引數為function,所有檔案的測試用例執行前(後)都會執行一次
conftest.py
檔案中的fixture
conftest.py實際案例
我們按照這樣的目錄新建一個專案
在根目錄conftestdemo下
根目錄中的conftest.py檔案中,一般寫全域性的fixture,比如登入
conftest.py
import pytest
@pytest.fixture(scope="session")
def login():
print("***登入成功,返回使用者名稱***")
name = "rockche"
yield name
print("***退出登入***")
@pytest.fixture(autouse=True)
def get_name(login):
name = login
print(f"--每個用例都呼叫外層fixiture:列印使用者name:{name}--")
根目錄下的測試用例
test_1.py
def test_get_name(login):
name = login
print("***基礎用例:獲取使用者name***")
print(f"使用者名稱:{name}")
執行conftestdemo下的所有用例
run.py
import pytest
if __name__ == '__main__':
pytest.main(["-s", "../conftestdemo/"])
test_baidu目錄下
配置針對baidu網站的測試用例獨有的fixture
conftest.py
import pytest
@pytest.fixture(scope="module")
def open_baidu(login):
name = login
print(f"使用者 {name} 開啟baidu")
test_case1.py
def test_case2_01(open_baidu):
print("搜尋pytest")
def test_case2_02(open_baidu):
print("搜尋部落格園")
test_cnblogs目錄下
沒有__init__.py
檔案也沒有conftest.py檔案
test_case1.py
def test_no_fixture(login):
print("沒有__init__檔案,直接進入cnblogs", login)
test_taobao目錄下
配置針對taobao網站的測試用例獨有的fixture
conftest.py
import pytest
@pytest.fixture(scope="function")
def open_taobao(login):
name = login
print(f"使用者 {name} 進入淘寶")
test_case1.py
class TestTaobao:
def test_case1_01(self, open_taobao):
print("選購商品")
def test_case1_02(self, open_taobao):
print("進入結算介面")