如何處理測試失敗¶
在第一次(或 N 次)失敗後停止¶
在第一次 (N) 次失敗後停止測試過程
pytest -x # stop after first failure
pytest --maxfail=2 # stop after two failures
在 pytest 中使用 pdb — Python 調試器¶
在失敗時進入 pdb¶
Python 自帶一個內建的 Python 調試器,稱為 pdb。pytest
允許通過命令行選項進入 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_value
、sys.last_type
和 sys.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.PytestUnraisableExceptionWarning
和 pytest.PytestUnhandledThreadExceptionWarning
。