2016-09-21 12 views
2

私はpytestを使ってテストしたいコマンドラインインターフェイスを持つアプリケーションを開発しています。私の考えは、pytestでは、継承されたテストメソッドが適切なアサーション出力を与えないのはなぜですか?

class TestEchoCmd(Scenario): 
    commands = [ 
     "echo foo" 
    ] 
    stdout = "foo\n" 

のようなテストクラスを定義し、実際のテストを行うためにテストメソッドを持つクラスを使用することでした。

class Scenario: 
    commands = [] 
    stdout = "" 

    def test_scenario(self, capsys): 
     for cmd in self.commands: 
      ret = my_app.execute_command(shlex.split(cmd)) 
      assert ret == 0 
     stdout, stderr = capsys.readouterr() 
     assert stdout == self.stdout 

:他の言葉では、試験方法を定義するのではなく - - 常に同じである(非常に退屈であろう)シナリオを説明すべてのクラスでは、これらのクラスは、Scenarioクラスからテストメソッドを継承しますテストが合格している限り、これは正常に動作します。テストが失敗した場合、pytestはテストメソッドが継承されていない場合とは異なり、追加情報なしでAssertionErrorを出力し、assert ed式を詳細に記述します。アサーションが失敗した理由を正確に伝えることは不可能であるため、これは非生産的です。

これを行う方法はありますか?私は本当にシナリオの記述を可能な限り簡潔にしたいと思っています。 (私は約@pytest.mark.parametrizeを知っているが、私はそれが、この場合には非常に読みやすいコードになりないと思います。)

(のDebian GNU/Linuxが提供されるああ、ちなみに、これはpytest 3.0.2である。)

答えて

1

自分自身で答えを見つけました:PytestはPython ASTのassertステートメントを書き換えて、より明示的な出力を追加するのが好きです。この書き換えは、テストメソッドを含むとみなされるクラス、すなわち、名前がTestで始まるクラスで発生します。テスト方法が、他の方法ではテストとは見なされない別のモジュールのクラスから継承された場合、assertは書き直されないため、虚偽のエラーメッセージは表示されません。

ソリューションは、pytestのドキュメントによると、問題のモジュールをインポートする前に、これが行われなければならない

pytest.register_assert_rewrite("module.name.goes.here") 

を使用して、あまりにも、他のモジュールでassert文をリライトするpytest取得することです。

関連する問題