導入
- アサーションの点で、pytest フレームワークは他の同様のフレームワーク (unittest など) よりも簡潔で使いやすいことが、自動テスト フレームワークの 1 つとして pytest を選択した理由の 1 つであると思います。
- Pytest のassert キーワードは、Python の組み込みの Assert 式の使用をサポートしています。pytest のアサーションは、python に付属しているassert キーワードを直接使用していることがわかります。
- Assert キーワードの後に式を続けることができます。式の最終結果が True である限り、アサーションは合格し、ユース ケースは正常に実行されます。それ以外の場合、ユース ケースは失敗します。
Assert 共通アサーション
pytest のアサーションは、実際には Python のアサーション アサーション メソッドであり、以下が一般的に使用されます。
- xxをアサート: xxが真かどうかを判断します
- assert not xx: xxが真ではないと判断する
- b で a をアサート: b に a が含まれているかどうかを判断します。
- アサート a == b: a が b に等しいかどうかを判断します
- assert a != b: a が b に等しくないかどうかを判断します
機能: 期待した結果が実際の結果と等しいかどうかを判定すると同時に、例外がスローされた後にプロンプト情報を出力することができ、実行後に理由を確認するのに便利です。
例外アサーションException
コードの通常の動作に関するアサーションをサポートすることに加えて、Pytest は例外および警告についてもアサートして、特定の条件下で特定の例外または警告が発生することを判断できます。機能テストと結合テストでは、これら 2 種類のアサーションはあまり使用されません。
コンテキストマネージャーとして pytest.raises (例外タイプ) を使用すると、例外がスローされたときに、対応する例外インスタンスを取得できます。
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
アサーション シナリオ: スローされる例外が予期されるものであるかどうかをアサートします
コードの実行: 1/0
期待される結果: スローされる例外は ZeroDivisionError: ゼロによる除算です
アサーション方法: 通常、例外の型と値がアサートされます
具体的な方法:ここで 1 /0 の例外タイプは ZeroDivisionError で、例外の値はゼロ除算です。
import pytest
def test_zero_division():
"""断言异常"""
with pytest.raises(ZeroDivisionError) as excinfo:
1 / 0
# 断言异常类型type
assert excinfo.type == ZeroDivisionError
# 断言异常value值
assert "division by zero" in str(excinfo.value)
実行結果:
excinfo: は例外情報インスタンス
主な属性: .type、.value、.traceback
知らせ: 型をアサートする場合、例外の型を引用符で囲む必要はありません。値をアサートする場合、テスト
ケース str に目を向ける必要があります。excinfo.value の内容に文字列のゼロ除算が含まれていることがアサートされます。このとき、特定の例外情報をアサートするために必要です。例外情報として非常に役立ちます。
例外および警告アサーションの詳細については、Pytest の公式ドキュメントを参照してください:
[例外および警告アサーション Pytest の公式ドキュメント]
アサーション プロンプト情報を最適化する
ターミナルに次のように入力できます: pytest -s アサーション ファイル名.py
拡張 1: 一致
match
キーワード引数をコンテキスト マネージャーに渡して、正規表現が例外の文字列表現と一致するかどうかをテストできます。
知らせ: このメソッドは値のみをアサートでき、型はアサートできません。
# 自定义消息
def test_zero_division_long():
with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
1 / 0
match メソッドの regexp パラメータは re.search 関数と一致するため、上記の例では match='zero' も機能します。
# 自定义消息
def test_zero_division_long():
with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
1 / 0
def test_zero_division_long2():
with pytest.raises(ZeroDivisionError, match="zero") as excinfo:
1 / 0
拡張 2: アサーション デコレータを確認する
# 断言装饰器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
1 / 0
実行結果の
ナレッジポイント
- このコードは例外をスローしますが、raises で指定された例外クラスと一致するため、失敗はアサートされません。
- これは、チェック例外デコレーターと同等です。機能: 例外があるかどうかを確認します。例外があるかどうかはわかりません。
with pytest.raise(ZeroDivisionError)
通常とは異なるコードを意図的にテストする場合には、次を使用する方が良いかもしれません。- 未修正のエラー (例外が発生する可能性がある) をチェックする場合は
@pytest.mark.xfail(raises=ZeroDivisionError)
、チェックされたアサーションを使用する方がよい場合があります。