unittest斷言方式是用過框架自己實作的,即self.assertEqual()等,當我們使用pytest框架后,這種斷言方式是不可用的,因為測驗類不會再繼承unittest.TestCase類,因此pytest使用的斷言是使用python內置的斷言assert,相對于unittest各種各樣的斷言方法,內置的斷言會更簡潔,它只有一種,詳情如下,
常用斷言
? 關鍵代碼:assert 運算式, 錯誤提示資訊,
def test_login():
# 使用python內置的斷言
assert 1 == 2, '1是不等于2的' # 錯誤資訊也可以不寫
test_login()
? 運行結果:
C:\software\python\python.exe D:/learn/test.py
Traceback (most recent call last):
File "D:/learn/test.py", line 13, in <module>
test_login()
File "D:/learn/test.py", line 11, in test_login
assert 1 == 2, '1是不等于2的'
AssertionError: 1是不等于2的
Process finished with exit code 1
? 常用的斷言表達有以下幾種??:
assert xx:判斷xx為真assert not xx:判斷xx不為真assert a in b:判斷b包含aassert a not in b:判斷b不包含aassert a == b:判斷a等于bassert a != b:判斷a不等于b
例外斷言
? 可以使用pytest.raises作為背景關系管理器,當拋出例外時可以獲取到對應的例外實體,然后斷言它拋出的例外是不是預期的,
# 斷言例外
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
? 如任意一個自然數除以0時,由于0不能作為被除數,執行時就會拋出ZeroDivisionError例外,提示division by 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)
? 注意:斷言type的時候,例外型別是不需要加引號的,斷言value值的時候需轉str型別,
擴展
正則斷言
? 可以將match關鍵字引數傳遞給背景關系管理器,以測驗正則運算式與例外的字串表示形式是否匹配
? 注意:這種方法只能斷言value,不能斷言type
# 自定義訊息
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
? 運行結果:
檢查斷言裝飾器
? 當代碼拋出例外時,如果和raises指定的例外類相匹配,就不會斷言失敗,
? 它相當于一個檢查例外裝飾器,目的是檢查是否有例外(不確定是否有例外),不同使用場景:
with pytest.raise(ZeroDivisionError)對于故意測驗例外代碼的情況,使用可能會更好- 而
@pytest.mark.xfail(raises=ZeroDivisionError)對于檢查未修復的錯誤(即可能會發生例外),使用檢查斷言可能會更好
# 斷言裝飾器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
1 / 0
? 執行結果:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276109.html
標籤:其他
