テストの失敗を処理する方法

最初の (または N) 回の失敗後に停止する

最初の (N) 回の失敗後にテストプロセスを停止するには:

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

pytest で pdb — The Python Debugger を使用する

失敗時に pdb に移行する

Python には pdb という組み込みの Python デバッガーが付属しています。 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_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 コマンドを介して) 、出力キャプチャが再開されます。

組み込みのブレークポイント関数の使用

Python 3.7 では、組み込みの breakpoint() 関数が導入されました。 Pytest は、次の動作で breakpoint() の使用をサポートします:

  • breakpoint() が呼び出され、PYTHONBREAKPOINT がデフォルト値に設定されている場合、pytest はシステムデフォルトの Pdb の代わりにカスタム内部 PDB トレース UI を使用します。

  • テストが完了すると、システムはシステムの Pdb トレース UI に戻ります。

  • --pdb が pytest に渡されると、カスタム内部 Pdb トレース UI が breakpoint() と失敗したテスト/未処理の例外の両方で使用されます。

  • --pdbcls を使用してカスタムデバッガークラスを指定できます。

フォールトハンドラー

Added in version 5.0.

faulthandler 標準モジュールを使用して、セグメンテーションフォールト時やタイムアウト後に Python トレースバックをダンプできます。

コマンドラインで -p no:faulthandler が指定されない限り、モジュールは pytest 実行時に自動的に有効になります。

また、テストが終了するまでに X 秒以上かかる場合、faulthandler_timeout=X 構成オプションを使用してすべてのスレッドのトレースバックをダンプできます (Windows では使用できません) 。

注釈

この機能は、外部の pytest-faulthandler プラグインから統合されており、2 つの小さな違いがあります:

  • これを無効にするには、--no-faulthandler の代わりに -p no:faulthandler を使用します。 前者は任意のプラグインで使用できるため、1 つのオプションを節約できます。

  • --faulthandler-timeout コマンドラインオプションは faulthandler_timeout 構成オプションになりました。 コマンドラインから -o faulthandler_timeout=X を使用して構成することもできます。

発生しない例外と未処理のスレッド例外に関する警告

Added in version 6.2.

未処理の例外は、呼び出し元に伝播できない状況で発生する例外です。 最も一般的なケースは、__del__ 実装で発生する例外です。

未処理のスレッド例外は、Thread で発生するが処理されない例外であり、スレッドが不正に終了する原因となります。

両方のタイプの例外は通常バグと見なされますが、プログラム自体がクラッシュしないため見逃されることがあります。 Pytest はこれらの条件を検出し、テスト実行の概要に表示される警告を発行します。

コマンドラインで -p no:unraisableexception (発生しない例外用) および -p no:threadexception (スレッド例外用) オプションが指定されない限り、プラグインは pytest 実行時に自動的に有効になります。

警告は、pytest.mark.filterwarnings マークを使用して選択的に無効にすることができます。 警告カテゴリは pytest.PytestUnraisableExceptionWarning および pytest.PytestUnhandledThreadExceptionWarning です。