web-dev-qa-db-ja.com

py.testを何らかの方法で使用しているときにpythonデバッガーでデバッグできますか?

pythonプログラムの単体テストにpy.testを使用しています。 pythonデバッガーを使用して通常の方法でテストコードをデバッグしたいのですが(コードではpdb.set_trace()を意味します)、動作させることはできません。

コードにpdb.set_trace()を入れても機能しません(IOErrorが発生します:出力のキャプチャ中にstdinから読み取ります)。また、オプション--pdbを使用してpy.testを実行しようとしましたが、アサーションの前に何が起こるかを調べたい場合、それはうまくいかないようです。アサーションが失敗すると中断し、その行から先に進むとプログラムが終了します。

誰かがデバッグを取得する方法を知っていますか、またはデバッグとpy.testが一緒になることを意図していませんか?

57
Joel

それは本当に簡単です:コードのデバッグを開始したい場所に_assert 0_を置き、次のようにテストを実行します:

_py.test --pdb 
_

完了:)

あるいは、pytest-2.0.1以降を使用している場合は、テストコードの任意の場所に配置できるpytest.set_trace()ヘルパーもあります。 docs です。 pdbデバッガーのコマンドラインに送信する前に、内部的にキャプチャを無効にするように注意します。

84
hpk42

キャプチャを無効にしてpy.testを実行し、通常どおりpdb.set_trace()を使用できることがわかりました。

> py.test --capture=no
============================= test session starts ==============================
platform linux2 -- Python 2.5.2 -- pytest-1.3.3
test path 1: project/lib/test/test_facet.py

project/lib/test/test_facet.py ...> /home/jaraco/projects/project/lib/functions.py(158)do_something()
-> code_about_to_run('')
(Pdb)
33
Jason R. Coombs

最も簡単な方法は、py.testメカニズムを使用してブレークポイントを作成することです

http://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace

_import pytest
def test_function():
    ...
    pytest.set_trace()    # invoke PDB debugger and tracing
_

または、pytestのデバッガーをワンライナーとして使用する場合は、import pdb; pdb.set_trace()import pytest; pytest.set_trace()に変更します

18
Rach

私はpy.testに精通していないので、unittestに入れて、次のことを行います。たぶんpy.testも同様です:

テストモジュール(mytestmodule.py)で:

if __== "__main__":
    unittest.main(module="mytestmodule")

次に、テストを実行します

python -m pdb mytestmodule.py

インタラクティブなpdbシェルが表示されます。

ドキュメントを見ると、py.testには--pdbコマンドラインオプション:

http://codespeak.net/py/dist/test/features.html

1
Peter Lyons