web-dev-qa-db-ja.com

変数イントロスペクションを使用したpytestアサートメッセージのカスタマイズ

pytestドキュメント では、assertが失敗したときに出力メッセージをカスタマイズできると書かれています。 REST APIメソッドをテストするときにassertメッセージをカスタマイズしたいのですが、無効なステータスコードが返されます:

def test_api_call(self, client):
    response = client.get(reverse('api:my_api_call'))
    assert response.status_code == 200

そこで、このようなコードをconftest.pyに入れようとしました

def pytest_assertrepr_compare(op, left, right):
    if isinstance(left, rest_framework.response.Response):
        return left.json()

しかし、問題はleftresponse.status_codeの実際の値であるため、intではなくResponseになります。ただし、デフォルトの出力メッセージは次のようなものをスローします。

Eアサート400 == 201 E +ここで、400 = .status_code

エラー400は、オブジェクトResponseの属性status_codeに起因すると言います。

私のポイントは、評価されている変数の一種の内省があるということです。では、上記の例と同様の出力を取得するために、快適な方法でアサートエラーメッセージをカスタマイズするにはどうすればよいですか?

8
Marc Tudurí

Python組み込み機能を使用して、カスタム例外メッセージを表示できます。

assert response.status_code == 200, "My custom msg: actual status code {}".format(response.status_code)

または、ヘルパーアサート関数を作成できます。

def assert_status(response, status=200):  # you can assert other status codes too
    assert response.status_code == status, \
        "Expected {} actual status {}. Response text {}".format(status, response.status_code, response.text)

# here is how you'd use it
def test_api_call(self, client):
    response = client.get(reverse('api:my_api_call'))
    assert_status(response)

また、チェックアウト: https://wiki.python.org/moin/UsingAssertionsEffectively

10
Dmitry Tokarev