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

2022-03-21 11:46 更新

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

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

失敗時(shí)丟棄到 pdb

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

pytest --pdb

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

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

請(qǐng)注意,在任何失敗時(shí),異常信息都存儲(chǔ)在 ?sys.last_value?、?sys.last_type? 和 ?sys.last_traceback? 中。 在交互式使用中,這允許人們使用任何調(diào)試工具進(jìn)行事后調(diào)試。 也可以手動(dòng)訪問異常信息,例如:

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

在測試開始時(shí)刪除到 pdb

pytest 允許在每個(gè)測試開始時(shí)通過命令行選項(xiàng)立即進(jìn)入pdb提示符:

pytest --trace

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

設(shè)置斷點(diǎn)

要在代碼中設(shè)置斷點(diǎn),請(qǐng)?jiān)诖a中使用原生 ?Python import pdb;pdb.set_trace()? 調(diào)用,pytest 會(huì)自動(dòng)禁用該測試的輸出捕獲:

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

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

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

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

故障處理程序

?faulthandler標(biāo)準(zhǔn)模塊可用于在錯(cuò)誤或超時(shí)后轉(zhuǎn)儲(chǔ) Python 回溯。

該模塊會(huì)自動(dòng)啟用 pytest 運(yùn)行,除非在命令行上給出 ?-p no:faulthandler?。

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

注意:

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

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

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

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

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

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

這兩種類型的異常通常都被認(rèn)為是錯(cuò)誤,但可能會(huì)被忽視,因?yàn)樗鼈儾粫?huì)導(dǎo)致程序本身崩潰。 Pytest 檢測到這些情況并發(fā)出在測試運(yùn)行摘要中可見的警告。

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)