2024年12月6日 星期五

Pytest - Fixtures (Part 3: Scope)


在編寫測試時,經常需要多個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():

執行順序:
SETUP setup01 > 測試01 > SETUP setup02 > 測試02 > TEARDOWN setup02 > TEARDOWN setup01
setup01和setup02的setup隨模組開始一次性執行,直到模組所有測試結束才清理。

Function-Function 組合

設定setup01和setup02均為函式級別
執行順序:
SETUP setup01 > 測試01 > TEARDOWN setup01 > SETUP setup02 > 測試02 > TEARDOWN setup02
每次測試函式執行前設置並清理。

Module-Function 組合

設定:setup01設置為模組級別,setup02設置為函式級別
執行順序:
SETUP setup01 > 測試01  > SETUP setup02 > 測試02 > TEARDOWN setup02 >  TEARDOWN setup01
setup01初始化一次並在模組結束時清理,而setup02對每個測試函式進行設置和清理。

Function-Module 組合

設定:setup01設置為函式級別,setup02設置為模組級別
執行順序:
SETUP setup01 > 測試01 > TEARDOWN setup01 > SETUP setup02 > 測試02 >  TEARDOWN setup02
setup01為每個函式設置和清理,而setup02為整個模組設置一次並在最後清理。

沒有留言:

張貼留言