pytest 測試輸出和結(jié)果-處理測試失敗

2022-03-21 11:46 更新

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

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

失敗時丟棄到 pdb

Python 帶有一個名為 ?pdb的內(nèi)置 Python 調(diào)試器。 pytest 允許通過命令行選項進入 ?pdb提示符:

pytest --pdb

這將在每次失敗(或?KeyboardInterrupt?)時調(diào)用Python調(diào)試器。通常,你可能只希望在第一個失敗的測試中這樣做,以了解特定的失敗情況:

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? 中。 在交互式使用中,這允許人們使用任何調(diào)試工具進行事后調(diào)試。 也可以手動訪問異常信息,例如:

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

在測試開始時刪除到 pdb

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

pytest --trace

這將在每次測試開始時調(diào)用Python調(diào)試器。

設(shè)置斷點

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

  • 其他測試中的輸出捕獲不受影響。
  • 任何先前已經(jīng)被捕獲的測試輸出都將被這樣處理。
  • 輸出捕獲在結(jié)束調(diào)試器會話時恢復(fù)(通過continue命令)。

使用內(nèi)置斷點函數(shù)

Python 3.7 引入了一個內(nèi)置的 ?breakpoint()? 函數(shù)。 Pytest 支持使用具有以下行為的 ?breakpoint()?:

  • 當調(diào)用 ?breakpoint()? 并將 ?PYTHONBREAKPOINT設(shè)置為默認值時,pytest 將使用自定義內(nèi)部PDB跟蹤 UI 而不是系統(tǒng)默認Pdb?。
  • 測試完成后,系統(tǒng)將默認返回系統(tǒng) ?Pdb跟蹤 UI。
  • 將 ?--pdb? 傳遞給 pytest 后,自定義內(nèi)部 ?Pdb跟蹤 UI 將與 ?breakpoint()? 和失敗的測試/未處理的異常一起使用。
  • ?--pdbcls? 可用于指定自定義調(diào)試器類。

故障處理程序

?faulthandler標準模塊可用于在錯誤或超時后轉(zhuǎn)儲 Python 回溯。

該模塊會自動啟用 pytest 運行,除非在命令行上給出 ?-p no:faulthandler?。

如果測試完成時間超過 X 秒(在 Windows 上不可用),?faulthandler_timeout=X? 配置選項也可用于轉(zhuǎn)儲所有線程的回溯。

注意:

此功能已從外部 ?pytest-faulthandler? 插件集成,有兩個小區(qū)別:

  • 要禁用它,請使用 ?-p no:faulthandler? 而不是 ?--no-faulthandler?:前者可以與任何插件一起使用,因此它節(jié)省了一個選項。
  • ?--faulthandler-timeout? 命令行選項已成為 ?faulthandler_timeout? 配置選項。 它仍然可以使用 ?-o faulthandler_timeout=X? 從命令行進行配置。

關(guān)于不可引發(fā)的異常和未處理的線程異常的警告

這些功能僅適用于 Python>=3.8。

未處理的異常是在無法傳播給調(diào)用者的情況下引發(fā)的異常。 最常見的情況是 ?__del__? 實現(xiàn)中引發(fā)的異常。

未處理的線程異常是在 ?Thread中引發(fā)但未處理的異常,導(dǎo)致線程不干凈地終止。

這兩種類型的異常通常都被認為是錯誤,但可能會被忽視,因為它們不會導(dǎo)致程序本身崩潰。 Pytest 檢測到這些情況并發(fā)出在測試運行摘要中可見的警告。

插件會自動啟用 pytest 運行,除非在命令行上給出了 ?-p no:unraisableexception? (用于不可引發(fā)的異常)和 ?-p no:threadexception? (用于線程異常)選項。

可以使用 ?pytest.mark.filterwarnings? 標記選擇性地使警告靜音。 警告類別為 ?pytest.PytestUnraisableExceptionWarning? 和 ?pytest.PytestUnhandledThreadExceptionWarning?。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號