pytestテストの実行中にipdb.set_trace()を自由に実行する方法


96

テストスイートにpytestを使用しています。複雑なコンポーネント間テストでバグをキャッチしながらimport ipdb; ipdb.set_trace()、コードの途中に配置してデバッグできるようにしたいと考えています。

ただし、pytestはsys.stdin / sys.stdoutをトラップするため、ipdbは失敗します。pytestでテスト中にipdbを使用するにはどうすればよいですか。

障害が発生した後にpdbやipdbにジャンプすることに興味はありませんが、コードの任意の場所にブレークを配置して、障害が発生する前にそこでデバッグできるようにします。

回答:


152

py.testが出力をキャプチャするため、エラーが発生します。

py.testを-sオプション付きで実行する必要があります(キャプチャ出力をオフにします)。例えば:

py.test -s my_test.py

10
Djangoでこれを実行したい場合はaddopts = -spytest.iniファイルに追加します。
Rahul Gupta、2015

39

pytest-ipdbは残念ながらサポートされなくなりました。

解決策は実行することです pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

ヘルプコマンドから:

pytest -h
  --pdb                 start the interactive Python debugger on errors.
  --pdbcls=modulename:classname
                        start a custom interactive Python debugger on errors.
                        For example:
                        --pdbcls=IPython.terminal.debugger:TerminalPdb

違いは、TerminalPdbがエラーをスローするように見えるだけですが、Pdbはスローしないようです(Ipython docs)。


1
TerminalPdbは再び機能し、タブ補完を提供するための推奨ソリューションです。
Uwe

ppdbに気をつけてください、そのipython品質のイントロスペクション
msudder

2

これは私が使うものです

py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s


0

2019-11の時点で、ここでそれを修正する必要があります:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'

1
prompt-toolkit バージョンをインストールすると2.0.10、ipdbは再び正常に動作します。これは、このパッケージの3.0.0への最近の更新が原因で機能しなくなるためです
Pawel Barcik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.