序文
- Unittest とは異なり、pytest は Python に付属のassert キーワードを使用してアサートします。
- 式の最終結果が True である限り、assert キーワードの後に式を続けることができます。その場合、アサーションは合格し、ユース ケースは正常に実行されます。それ以外の場合、ユース ケースの実行は失敗します。
小さな栗を主張する
例外がスローされた後に何らかのプロンプト情報を出力したい、実行後に理由を確認するのに便利
# 异常信息
def f():
return 3
def test_function():
a = f()
assert a % 2 == 0, "判断 a 为偶数,当前 a 的值为:%s" % a
の結果
共通の主張
pytest のアサーションは、実際には Python のアサーション アサーション メソッドであり、一般的に使用されるメソッドは次のとおりです。
- xxをアサート:xxが真であると判断する
- assert not xx: xxが真ではないと判断する
- a を b にアサートする : b に a が含まれると判断します
- assign a == b : a が b に等しいと判断します
- assert a != b : a が b に等しくないことを判断します
例外アサーション
pytest.raises をコンテキスト マネージャーとして使用でき、例外がスローされたときに対応する例外インスタンスを取得できます。
# 断言异常
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
アサーション シーン:スローする例外が予期されたものであるかどうかをアサートします。
コード実行: 1/0
予期される結果:スローされる例外は ZeroDivisionError: ゼロによる除算です。
アサート方法:通常はアサーション例外のタイプと値
具体的な方法:ここでは、1/0 の例外タイプは ZeroDivisionError で、例外の値はゼロ除算です。
# 详细断言异常
def test_zero_division_long():
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
注:型をアサートする場合、例外の型を引用符で囲む必要はありません。また、値 value をアサートする場合は、str に変換する必要があります。
拡張 1: 一致
match キーワード引数をコンテキスト マネージャーに渡して、正規表現が例外の文字列表現と一致するかどうかをテストできます。
注:このメソッドは値のみをアサートでき、型はアサートできません。
# 自定义消息
def test_zero_division_long():
with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
1 / 0
match メソッドの regexp パラメータは re.search 関数と一致するため、上記の例の match='zero' も機能します。
拡張 2: アサーション デコレータを確認する
# 断言装饰器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
1 / 0
の結果
知識ポイント
- コードは例外をスローしますが、raises で指定された例外クラスと一致するため、アサーションの失敗はありません
- これは、チェック例外デコレータと同等です。機能:例外があるかどうかを確認します。例外があるかどうかはわかりません。
- pytest.raise(ZeroDivisionError) を使用すると、例外コードが意図的にテストされる場合に pytest.raise(ZeroDivisionError) を使用した方がよい場合があります。
而@pytest.mark.xfail(raises=ZeroDivisionError)
未修正のバグ (つまり、例外が発生する可能性) をチェックするには、チェックされたアサーションを使用する方がよい場合があります。