簡介

已完成

Pytest 不僅能發現測試並回報斷言結果。 隨著 Python 測試套件的成長,重複的測試邏輯和共用的設定程式碼會讓測試更難讀取、除錯和擴充。 在本單元中,你將學習三個 pytest 功能,幫助保持Python測試的可讀性與維護性:參數化、夾具,以及內建的 monkeypatch 夾具。

本模組假設你可以撰寫 Python 腳本、在終端機執行指令,並在使用 Python 3.10 或更新版本的虛擬環境中執行簡單的 pytest 測試。 如果你需要Windows的設定協助,請參考在 Windows 設定你的Python開發環境。 關於虛擬環境的詳細資訊,請參閱 Python 的 venv 文件

參數化搭配 @pytest.mark.parametrize 會使用多組引數執行相同的測試函式,而 pytest 則會將每個產生的調用作為獨立測試項目收集。 Fixture 是用 pytest 註冊的功能,通常使用 @pytest.fixture 來測試或依名稱要求其他 fixture。 它們可以在必要時傳回可重複使用的值,並在測試或 fixture 範圍結束後執行清除。 monkeypatch fixture 會暫時變更屬性、字典項目、環境變數、sys.path,或目前的工作目錄,然後在要求測試或 fixture 結束後自動還原這些變更。

本模組中的範例為單元式測試,但相同的 pytest 功能也適用於較大型的整合或函式測試套件。 範例中使用 Python 的 assert 陳述;pytest 提供斷言內省,因此故障報告包含表達式中的有用值。

何時使用這些功能

  • 當您在測試中針對輸入進行迴圈,或複製近似重複項測試函式以處理稍微不同的輸入時,可以使用參數化。 參數化將一個測試定義擴展成多個測試項目,因此每個輸入都有自己的通過/失敗報告。
  • 當多個測試需要相同的設定 (例如測試資料、暫存檔案或資料庫連線) 或執行後需要可預測的清除時,才會使用 fixture
  • monkeypatch當測試需要將程式碼與外部狀態隔離時使用——例如環境變數、目前的工作目錄,或呼叫遠端服務的函式——但又不能永久改變該狀態。

你會先用參數化取代迴圈和幾乎重複的測試。 然後您會使用 fixture 共用設定和清除,檢視內建 fixture (如 tmp_pathmonkeypatch),並練習將 xUnit 樣式的設定與終止方法重構成 fixture。

本單元結束時,您將準備好應用這些 pytest 功能,以減少重複、擴大覆蓋範圍,並提升 Python 測試套件中的故障診斷能力。

欲了解更多資訊,請參閱 pytest 文件,內容包括 斷言參數化測試夾具monkeypatch