如何處理測試失敗

在第一次(或 N 次)失敗後停止

在第一次 (N) 次失敗後停止測試過程

pytest -x           # stop after first failure
pytest --maxfail=2  # stop after two failures

在 pytest 中使用 pdb — Python 調試器

在失敗時進入 pdb

Python 自帶一個內建的 Python 調試器,稱為 pdbpytest 允許通過命令行選項進入 pdb 提示符

pytest --pdb

這將在每次失敗(或 KeyboardInterrupt)時調用 Python 調試器。通常,您可能只想對第一個失敗的測試執行此操作,以了解特定的失敗情況

pytest -x --pdb   # drop to PDB on first failure, then end test session
pytest --pdb --maxfail=3  # drop to PDB for first three failures

請注意,在任何失敗時,異常信息都存儲在 sys.last_valuesys.last_typesys.last_traceback 中。在交互式使用中,這允許使用任何調試工具進入事後調試。也可以手動訪問異常信息,例如

>>> import sys
>>> sys.last_traceback.tb_lineno
42
>>> sys.last_value
AssertionError('assert result == "ok"',)

在測試開始時進入 pdb

pytest 允許通過命令行選項在每個測試開始時立即進入 pdb 提示符

pytest --trace

這將在每個測試開始時調用 Python 調試器。

設置斷點

要在代碼中設置斷點,請在代碼中使用原生 Python import pdb;pdb.set_trace() 調用,pytest 會自動禁用該測試的輸出捕獲

  • 其他測試中的輸出捕獲不受影響。

  • 任何先前已捕獲的測試輸出都將按原樣處理。

  • 當結束調試器會話時(通過 continue 命令),輸出捕獲將恢復。

使用內建的 breakpoint 函數

Python 3.7 引入了一個內建的 breakpoint() 函數。Pytest 支持使用具有以下行為的 breakpoint()

  • 當調用 breakpoint() 並且 PYTHONBREAKPOINT 設置為默認值時,pytest 將使用自訂的內部 PDB 追蹤 UI,而不是系統默認的 Pdb

  • 當測試完成時,系統將默認返回到系統 Pdb 追蹤 UI。

  • 當將 --pdb 傳遞給 pytest 時,自訂的內部 Pdb 追蹤 UI 將用於 breakpoint() 和失敗的測試/未處理的異常。

  • --pdbcls 可用於指定自訂的調試器類別。

故障處理器

在版本 5.0 中新增。

faulthandler 標準模組可用於在段錯誤或超時後轉儲 Python 回溯。

除非在命令行中給出 -p no:faulthandler,否則該模組會自動為 pytest 運行啟用。

此外,如果測試時間超過 X 秒完成(在 Windows 上不可用),則可以使用 faulthandler_timeout=X 配置選項來轉儲所有線程的回溯。

注意

此功能已從外部 pytest-faulthandler 插件集成,有兩個小的差異

  • 要禁用它,請使用 -p no:faulthandler 而不是 --no-faulthandler:前者可以用於任何插件,因此它節省了一個選項。

  • --faulthandler-timeout 命令行選項已成為 faulthandler_timeout 配置選項。它仍然可以從命令行使用 -o faulthandler_timeout=X 進行配置。

關於無法引發的異常和未處理的線程異常的警告

在版本 6.2 中新增。

未處理的異常是在無法傳播到調用者的情況下引發的異常。最常見的情況是在 __del__ 實現中引發的異常。

未處理的線程異常是在 Thread 中引發但未處理的異常,導致線程不乾淨地終止。

這兩種異常通常被認為是錯誤,但可能被忽略,因為它們不會導致程序本身崩潰。Pytest 檢測到這些情況並發出警告,該警告在測試運行摘要中可見。

除非在命令行中給出 -p no:unraisableexception(對於無法引發的異常)和 -p no:threadexception(對於線程異常)選項,否則這些插件會自動為 pytest 運行啟用。

可以使用 pytest.mark.filterwarnings 標記有選擇地靜音警告。警告類別為 pytest.PytestUnraisableExceptionWarningpytest.PytestUnhandledThreadExceptionWarning