Pytest學習(二) - 斷言的使用

久曲健發表於2020-10-20

一、前言

學習pytest總會習慣性的和unittest對比使用,自然就斷言pytest和unittest也是有些區別的。

二、斷言對比

unittest 斷言

assertEqual(a, b)     # 判斷a和b是否相等

assertNotEqual(a, b)     # 判斷a不等於b

assertTrue(a)    # 判斷a是否為Ture

assertFalse(a)    #判斷a是否為False

assertIn(a, b)     # a 包含在b裡面

asserNotIn(a, b)    # a 不包含在b裡面

pytest 斷言

pytest只需要用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示例程式碼

# -*- coding: utf-8 -*-
# @Time    : 2020/10/20 19:37
# @Author  : longrong.lang
# @FileName: test_assert.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang
def f():
    return 5;


def test_f():
    n = f()
    assert n % 3 == 0, "判斷n 是否能被3整除,當前 n 的值為:%s" % n

四、執行結果

五、異常斷言

結合pytest 斷言特點和《Pytest之使用斷言指定異常》,再來一個異常的案例,比如除數不能為零,示例程式碼如下:

# 異常斷言
# 異常斷言
def test_zero_division():
    with pytest.raises(ZeroDivisionError) as exceptionInfo:
        100 / 0
    # 斷言異常型別
    assert exceptionInfo.type == ZeroDivisionError
    # 斷言異常的值
    assert "division by zero" in str(exceptionInfo.value)

知識點:

使用pytest.raises,來捕獲對應的異常示例,exceptionInfo為一個物件示例來接收屬性資訊,通常是斷言異常的 type 和 value 值

1、使用match斷言

  • match 關鍵字是測試正規表示式與異常的字串表示形式是否匹配
  • 這種方法只能斷言value,不能斷言型別

示例程式碼如下:

# match的使用
def test_zero_division_match():
    with pytest.raises(ZeroDivisionError, match=".*zero.*") as exceptionInfo:
        100 / 0
    # 也可以這樣
    with pytest.raises(ZeroDivisionError, match="zero") as exceptionInfo:
        100 / 0

match 方法的regexp引數與 re.search 函式匹配,因此在上面的示例中 match='zero' 也可以使用

2、檢查斷言裝飾器使用

示例程式碼如下:

# 斷言裝飾器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
    1 / 0

個人覺得這個斷言裝飾器,和java的註解類似,相對更輕量快捷

3、執行結果

知識點

程式碼丟擲異常,但是和raises指定的異常類相匹配,所以不會斷言失敗
它相當於一個檢查異常裝飾器,功能:檢查是否有異常,不確定是否有異常
with pytest.raise(ZeroDivisionError) 對於故意測試異常程式碼的情況,使用可能會更好
而@pytest.mark.xfail(raises=ZeroDivisionError) 對於檢查未修復的錯誤(即,可能會發生異常),使用檢查斷言可能會更好

裝飾器這部分還沒學習,後續繼續更新,先放一放

系列參考文章:
https://www.cnblogs.com/poloyy/category/1690628.html

相關文章