2017-05-08 11 views
2

IPython内で単一のPython unittestを実行し、アサーションエラーのサイトを調査するのに%debugを使用するにはどうすればよいですか?利用可能%debugを使用してPython unittestの失敗を調べるにはどうすればよいですか?

具体的には、私はこの魔法をしたい...

$ ipython 
In [1]: def broken(): 
    ...:  DOESNOTEXIST 
    ...:  

In [2]: broken() 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-2-38dbcef999e4> in <module>() 
----> 1 broken() 

<ipython-input-1-42074db4a06b> in broken() 
     1 def broken(): 
----> 2  DOESNOTEXIST 
     3 

NameError: name 'DOESNOTEXIST' is not defined 

In [3]: %debug 
> <ipython-input-1-42074db4a06b>(2)broken() 
     1 def broken(): 
----> 2  DOESNOTEXIST 
     3 

ipdb> # Rock on 

...、失敗した場合に、%debugを実行してもかかるだろうunittestの...

In [4]: %run -m unittest some/path/to/brokenness.py 

を...キックオフ私はraiseにいくつかのテストケースに失敗しました。

unittestモジュールが例外を呑み込み、--failfastフラグがそれらを咳止めしないと考えられます。私は、テストオブジェクトをインスタンス化してからsetUp()などを手動で呼び出すことができます。しかし、それはやや愚かで痛みがあるようです。私はブレークポイントを設定したくありません。

+0

私は喜んでも、私は唯一の失敗にIPythonに落とし込む得ることができます解決策を取ると思います。そのため、あなたは別々のファイルを作成せずにセッション内のテストを実行するオプションがあります。 –

+0

もっと嬉しいです。 CLIから簡単に実行して、トリップしたアサーションでIPythonにやさしいデバッガを取得するといいでしょう。 –

+0

ipythonで 'nose'を使ってテストを実行できます。 – pylang

答えて

1

は私がpytest-ipdbプラグインでpytestをインストールすることをお勧めいたしますテストランナー

を使用してください。テストで例外が発生した場合、--ipdbフラグを使用して同様の方法でipdbデバッガにアクセスすることができます。

pip install git+git://github.com/mverteuil/pytest-ipdb.git 

その後

In [1]: %run -m pytest --ipdb some/path/to/brokenness.py 

またはコマンドラインから:

また
py.test --ipdb some/path/to/brokenness.py 

、あなたには、いくつかの理由でpytestが気に入らない場合は、同じ結果が鼻でアーカイブすることができ、 nose-ipdbプラグイン。

1

noseをご覧ください。これは、ipythonまたはjupyterノートブックの中で、コマンドライン経由で別々に実行できます。テストファイルを含むパッケージディレクトリで

> pip install nose 

は、次のコマンドを実行します。これは、自動的にテストモジュールがすべて存在し、サブディレクトリに test_を前に付加います

> nosetests --pdb 

。また、あなたは別々のファイルにそれを実行することができますだけでなくipdbを使用するpluginあり

> nosetests test_filename.py --pdb 

noseは、ipython/jupyterセッション内でテストを実行する場合に特に便利です。

import nose.tools as nt 

def test(): 
    # Some test code 
    return 1 

nt.assert_equal(test(), 2) 

出力

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-16-edbfc78f9c45> in <module>() 
     5  return 1 
     6 
----> 7 nt.assert_equal(test(), 2) 

C:\Anaconda3\envs\betalab\lib\unittest\case.py in assertEqual(self, first, second, msg) 
    818   """ 
    819   assertion_func = self._getAssertEqualityFunc(first, second) 
--> 820   assertion_func(first, second, msg=msg) 
    821 
    822  def assertNotEqual(self, first, second, msg=None): 

C:\Anaconda3\envs\betalab\lib\unittest\case.py in _baseAssertEqual(self, first, second, msg) 
    811    standardMsg = '%s != %s' % _common_shorten_repr(first, second) 
    812    msg = self._formatMessage(msg, standardMsg) 
--> 813    raise self.failureException(msg) 
    814 
    815  def assertEqual(self, first, second, msg=None): 

AssertionError: 1 != 2 
+0

鼻のドキュメンテーションから:「Noseは過去数年間メンテナンスモードに入っており、メンテナンスを引き継ぐために新しい人/チームがいなくても終了する可能性があります新しいプロジェクトではNose2、py.test、または単なるunittest/unittest2 " –

+0

単体テストでうまく動作します。あなたが望むなら 'nose2'を試すことができます。 'pytest'が最適ですが、まだセッションテストをサポートしていません。 – pylang

関連する問題