2016-06-30 11 views
3

テストモジュールではない別のPythonファイルに、私たちのカスタムアサーションをすべて定義しました。例えばpytestを非テストモジュールでアサートする方法

custom_asserts.py

class CustomAsserts(object): 
    def silly_assert(self, foo, bar): 
     assert foo == bar , 'some error message' 

我々はテストで直接assertを使用している場合は、我々は非常に便利ですAssertionErrorが、程度の余分な情報を取得します。直接テストで主張使いの

出力:

>  assert 'foo' == 'bar', 'some error message' 
E  AssertionError: some error message 
E  assert 'foo' == 'bar' 
E   - foo 
E   + bar 

しかし、我々は、我々は別のモジュールで定義されたアサーションメソッドを呼び出した場合、余分な情報が表示されませんことがわかりました。テストの実行後

from custom_asserts import CustomAsserts 
asserts = CustomAsserts() 
def test_silly(): 
    asserts.silly_assert('foo', 'bar') 

出力:

>  assert 'foo' == 'bar', 'some error message' 
E  AssertionError: some error message 

そして、我々はまた、pytestドキュメントでこれを見つけた:Advanced assertion introspection

pytestは、直接そのテスト 収集プロセスによって発見されたテストモジュールを書き換えしたがって、 自身ではないモジュールをサポートしているため、テストモジュールは書き換えられません。

私の質問は、pytestにテストモジュールと同じように同じアサートを他のモジュールに書き直させる方法があるかどうかです。または、それを達成するための何かのハッキーな方法はありますか?

答えて

4

更新:

Pytest 3.0は、この正確な機能を実装するための新しい方法register_assert_rewriteを導入しました。 Pytest 3.0以降を使用している場合は、これを試してください。 register_assert_rewrite

オリジナルの答えは:

一種の自分の質問に答えるために有線だが、私は解決策を見つけたと思うし、共有したいと思います。

このトリックはpytestがテストモジュールをどのように収集するかにあります。 python_filespytest.iniに定義すると、pytestはより多くのモジュールをテストモジュールと見なすことができます。

は例えば、私の場合には、すべての私のカスタムは、モジュールが「アサート」で終わる主張するので、私のpytest.iniは次のとおりです。

[pytest] 
python_files = *asserts.py test_*.py *_test.py 

別のトリッキーなことがconftest.pyです。 conftest.pyにassertsモジュールをインポートする必要はありません。私の想定は、pytestがassertを書き直す技術が実際に書き換えられるのは.pycファイルで、conftest.pyが読み込まれてからassertsモジュールをインポートすると、モジュールの.pycが生成されてしまい、pytestができなくなる可能性があります。再度.pycファイルを書き換えます。

私のconftestです。

@pytest.fixture(autouse=Ture) 
def setup_asserts(request): 
    from custom_asserts import CustomAsserts 
    request.instance.asserts = CustomAsserts() 

そして、私はちょうどテストスクリプトに直接キーワードassertを使用してのような余分なエラー情報を取得します:PY、私は次のようなことを行う必要があります。

+0

[あなた自身の質問に答えるのもいいですし、奨励さえも!](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) Web UIでは、ソフトウェアを開発している間に発見した重要な情報を文書化して共有する方法と同じように、質問を書いてすぐに答えたいと思うかもしれません。 – clacke

関連する問題