2013-04-15 34 views
50

私のテストスイートにはpytestが使用されています。複雑なコンポーネント間テストでバグを検出しているうちに、デバッグできるように私のコードの中にimport ipdb; ipdb.set_trace()を配置したいと思います。pytestテストの実行中にipdb.set_trace()を実行する方法

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

私は失敗後にpdbまたはipdbにジャンプするのではなく、コードのどこにでもブレークを配置し、エラーが発生する前にそこでデバッグできるようにすることに興味があります。

答えて

78

py.testキャプチャ出力のためにエラーが発生しました。

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

py.test -s my_test.py 
+7

Djangoでこれを行う場合は、 'pytest.ini'ファイルに' addopts = -s'を追加してください。 –

20

pytest-ipdbプラグインをインストールしてから

pytest.set_trace() 
+7

'pytest-ipdb'はもはや維持されておらず、代わりに[' pdbpp'](https://pypi.python.org/pypi/pdbpp/)を提案しています。しかし、pytestは[pytest.set_trace()ショートカットをネイティブにサポートしています(http://doc.pytest.org/en/latest/usage.html?highlight=set_trace#setting-a-breakpoint-aka-set- trace)、[3.0以降](http://doc.pytest.org/en/latest/changelog.html#id7)では、 '--pdbcls = IPython.core.debugger:Pdbのようなカスタムデバッガクラスを渡すことができます'。 – tutuDajuju

10

pytest-ipdbが、残念ながらもうサポートされていません使用します。

ソリューションはhelpコマンドから 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がerrosを投げるように見えるだけのことですが、Pdbのない(Ipython docs)。