在編寫測試時,經常需要多個fixture共同作用,而這些fixture之間可能會有依賴關係。例如,一個fixture提供測試資源,另一個負責設定該資源。在這種情況下,按正確順序進行設置 (Setup) 和清理 (Teardown) 是避免測試環境混亂或資源衝突的關鍵。
Pytest的作用域 (Scope) 概念
Pytest使用作用域 (Scope) 來控制fixture的設置和清理順序。Scope參數定義了fixture的作用範圍,主要是影響清理的順序,因為無論作用域如何定義,當測試第一次呼叫fixture時,設置部分就會被執行,fixture會被建立:
- function (函式級別):每個測試函數執行前設置,測試結束後立刻清理,為Pytest的預設。
- module (模組級別):每個測試模組執行前設置,模組內所有測試完成後清理。減少重複設置,適合需要共用資源的情境。
- class (類別級別):每個測試類別執行前設置,類別內所有測試完成後清理。常用於測試同類型功能的測試類別。
- session (會話級別):整個測試會話期間設置一次,測試會話結束後清理。適合跨模組或整個測試會話需要共用的資源,如共享的伺服器設定。
Setup/Teardown的執行順序
透過執行指令 pytest --setup-show 可以檢視fixture的設置和清理順序。以下是常見的組合及其執行順序。Module-Module 組合
設定:兩個fixtures都設置為模組級別。
@pytest.fixture(scope="module")def setup01():
@pytest.fixture(scope="module")def setup02():
@pytest.fixture(scope="module")
def setup01():
@pytest.fixture(scope="module")
def setup02():

SETUP setup01 > 測試01 > SETUP setup02 > 測試02 > TEARDOWN setup02 > TEARDOWN setup01setup01和setup02的setup隨模組開始一次性執行,直到模組所有測試結束才清理。
Function-Function 組合
設定:setup01和setup02均為函式級別。
SETUP setup01 > 測試01 > TEARDOWN setup01 > SETUP setup02 > 測試02 > TEARDOWN setup02
執行順序:
SETUP setup01 > 測試01 > SETUP setup02 > 測試02 > TEARDOWN setup02 > TEARDOWN setup01
setup01初始化一次並在模組結束時清理,而setup02對每個測試函式進行設置和清理。
Function-Module 組合
設定:setup01設置為函式級別,setup02設置為模組級別。
沒有留言:
張貼留言