一、前言
用例三要素之一就是對預期結果的斷言。
何為斷言?簡單來說就是實際結果和期望結果去對比,符合預期就測試pass,不符合預期那就測試 failed。斷言內容就是你要的預期結果。斷言包含對接口響應內容做斷言、也包含對落DB的數據做斷言。
pytest可以讓開發者使用Python斷言來驗證測試中的期望值。
話不多說,我們來舉個小例子熟悉一下,一般我們會在拋出異常之后輸出一些提示信息,執行之后就方便查看是什么原因了。
# 異常信息
def f():return 3
def test_function():a = f()assert a % 2 == 0, "判斷 a 為偶數,當前 a 的值為:%s" % a
執行結果
二、常用斷言
pytest 里面斷言實際上就是 python 里面的 assert 斷言方法,常用的有以下幾種
- assert xx :判斷 xx 為真
- assert not xx :判斷 xx 不為真
- assert a in b :判斷 b 包含 a
- assert a == b :判斷 a 等于 b
- assert a != b :判斷 a 不等于 b
三、異常斷言
可以使用 pytest.raises 作為上下文管理器,當拋出異常時可以獲取到對應的異常實例
# 斷言異常
def test_zero_division():with pytest.raises(ZeroDivisionError):1 / 0
斷言場景:斷言它拋的異常是不是預期想要的
代碼執行:1/0
預期結果:拋的異常是ZeroDivisionError: division by zero
如何斷言:通常是斷言異常的 type 和 value 值了
具體方式:這里?1/0 的異常類型是 ZeroDivisionError,異常的 value 值是 divisionby zero
#詳細斷言異常
def test_zero_division_long():with pytest.raises(ZeroDivisionError) as excinfo:1 / 0# 斷言異常類型 typeassert excinfo.type == ZeroDivisionError# 斷言異常 value 值assert "division by zero" in str(excinfo.value)
excinfo?:是一個異常信息實例
主要屬性:?.type?、??.value?、?.traceback?
注意:斷言 type 的時候,異常類型是不需要加引號的,斷言 value值的時候需轉 str
拓展一:match
可以將?match?關鍵字參數傳遞給上下文管理器,以測試正則表達式與異常的字符串表示形式是否匹配
注意:這種方法只能斷言value,不能斷言type
# 自定義消息
def test_zero_division_long():with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:1 / 0
該?match?方法的regexp參數與?re.search??函數匹配,因此在上面的示例中?match='zero'?也可以使用
拓展二:檢查斷言裝飾器
# 斷言裝飾器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():1 / 0
執行結果
知識點
- 代碼拋出異常,但是和raises指定的異常類相匹配,所以不會斷言失敗
- 它相當于一個檢查異常裝飾器,功能:檢查是否有異常,不確定是否有異常
- with pytest.raise(ZeroDivisionError)??對于故意測試異常代碼的情況,使用可能會更好
而@pytest.mark.xfail(raises=ZeroDivisionError)?
對于檢查未修復的錯誤(即,可能會發生異常),使用檢查斷言可能會更好