Pytest系列(2) - assert斷言詳細使用


如果你還想從頭學起Pytest,可以看看這個系列的文章哦!

https://www.cnblogs.com/poloyy/category/1690628.html

 

前言

  • 與unittest不同,pytest使用的是python自帶的assert關鍵字來進行斷言
  • assert關鍵字后面可以接一個表達式,只要表達式的最終結果為True,那么斷言通過,用例執行成功,否則用例執行失敗

 

assert小栗子

想在拋出異常之后輸出一些提示信息,執行之后就方便查看是什么原因了
# 異常信息
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

    # 斷言異常類型 type
    assert 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) 對於檢查未修復的錯誤(即,可能會發生異常),使用檢查斷言可能會更好

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM