『德不孤』Pytest框架 — 8.Pytest斷言

(1)什么是斷言

對(duì)于測(cè)試來(lái)講欲诺,不管是功能測(cè)試,自動(dòng)化測(cè)試摹蘑,還是單元測(cè)試筹燕,一般都會(huì)預(yù)設(shè)一個(gè)正確的預(yù)期結(jié)果,而在測(cè)試執(zhí)行的過(guò)程中會(huì)得到一個(gè)實(shí)際的結(jié)果衅鹿。

測(cè)試的成功與否就是拿實(shí)際的結(jié)果與預(yù)期的結(jié)果進(jìn)行比較撒踪,這個(gè)比的過(guò)程就是斷言(assert)。

(2)Pytest斷言

  • 與Unittest不同大渤,Pytest使用的是Python自帶的assert關(guān)鍵字來(lái)進(jìn)行斷言制妄。
  • assert關(guān)鍵字后面可以接一個(gè)表達(dá)式,只要表達(dá)式的最終結(jié)果為T(mén)rue泵三,那么斷言通過(guò)耕捞,用例執(zhí)行則為成功衔掸,否則用例執(zhí)行失敗。

(3)Pytest的斷言方式及應(yīng)用場(chǎng)景

1)使用assert語(yǔ)句

Pytest里面的斷言實(shí)際上就是Python里面的assert斷言方法砸脊。

比較大小與是否相等:

  • assert a == b:判斷a等于b
  • assert a !=b:判斷a不等于b

判斷包含或不包含:

  • assert a in b:判斷b包含a
  • assert a not in b:判斷b不包含a

提示:b可以是字符串具篇,可以是列表纬霞,元組等都可以凌埂。

對(duì)類型的判斷:

  • assert isinstance(a,int):判斷a是否是int類型數(shù)據(jù)。

判斷方法或者函數(shù)的返回值是否為真:

  • assert xx:判斷xx結(jié)果為真诗芜。
  • assert not xx:判斷xx結(jié)果不為真瞳抓。

例如

#用于判斷素?cái)?shù)
def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
        return True


# 判斷是否為素?cái)?shù)
def test_true():
    assert is_prime(13)
    # 或者不為素?cái)?shù)
    assert not is_prime(13)

基本上常用的就這么幾種。

2)斷言預(yù)期的異常

將異常信息存儲(chǔ)到一個(gè)變量中伏恐,變量的類型則為異常類孩哑,包含異常的typevaluetraceback等信息

import pytest


def test_exception_value():
    with pytest.raises(ZeroDivisionError) as zero:
        1 / 0  # 此處可以是方法翠桦,也可以是表達(dá)式

    # print(zero) <ExceptionInfo ZeroDivisionError('division by zero') tblen=1>
    # print(zero.tb)# <traceback object at 0x0000021B6068BD48>
    # print(zero.typename)  # 字符串"ZeroDivisionError"
    # print(zero.type)  # 異常類型<class 'ZeroDivisionError'>
    print(zero.traceback)
    assert "division by zero" in str(zero.value)
    assert zero.type == ZeroDivisionError
    assert zero.typename == "ZeroDivisionError"


if __name__ == '__main__':
    pytest.main()

注意:在上下文管理器的作用域中横蜒,raises代碼必須是最后一行,否則其后面的代碼將不會(huì)執(zhí)行销凑。

拓展:

如果我們不知道預(yù)期異常的是什么丛晌,我們可以使用 matchraise 進(jìn)行自定義異常。

pytest.raises()函數(shù)傳遞一個(gè)關(guān)鍵字參數(shù)match斗幼,通過(guò)match設(shè)置的字符串正則表達(dá)式匹配異常信息澎蛛。

Unittest中的TestCase.assertRaisesRegexp方法類似。

示例:

import pytest


# myfunc函數(shù)會(huì)拋出一個(gè)異常蜕窿,
def myfunc():
    raise ValueError("Exception 123 raised")


def test_match():
    # pytest.raises()函數(shù)谋逻,
    # 可以用元組的形式傳遞參數(shù),只需要觸發(fā)其中任意一個(gè)即可桐经。
    # 通過(guò)match可以設(shè)置通過(guò)正則表達(dá)式匹配異常毁兆。
    with pytest.raises((ValueError, RuntimeError), match=r'.* 123 .*') as ve:
        myfunc()  
        # 說(shuō)明:myfunc()拋出的異常被match設(shè)置的字符串匹配到
        # 也就是捕獲到了該異常。
        # 然后下面是斷言阴挣,123是否包含在捕獲異常的說(shuō)明中气堕。

    assert "123" in str(ve.value)


if __name__ == '__main__':
    pytest.main()

(4)優(yōu)化斷言

我們可以在異常的時(shí)候,輸出一些提示信息屯吊,這樣報(bào)錯(cuò)后送巡,可以方便我們來(lái)查看原因。

示例如下:

import pytest

def func():
    return 100

def test_case_666():
    a = func()
    assert a % 3 == 0, "判斷a是否能被3整除盒卸,當(dāng)前a的值為:%s" %a


if __name__ == '__main__':
    pytest.main()

"""
運(yùn)行結(jié)果:

========沒(méi)加注釋的測(cè)試結(jié)果==========
Expected :0
Actual   :1
<Click to see difference>

def test_case_666():
        a = 100
>       assert a % 3 == 0
E       assert 1 == 0

test_01.py:55: AssertionError

Assertion failed


========添加注釋的測(cè)試結(jié)果==========
Expected :0
Actual   :1
<Click to see difference>

def test_case_666():
        a = 100
>       assert a % 3 == 0, "判斷a是否能被3整除骗爆,當(dāng)前a的值為:%s" %a
E       AssertionError: 判斷a是否能被3整除,當(dāng)前a的值為:100
E       assert 1 == 0

test_01.py:53: AssertionError

Assertion failed
"""

(5)使用標(biāo)記檢查異常

@pytest.mark.xfail(raises=ZeroDivisionError)

示例:

import pytest

@pytest.mark.xfail(raises=ZeroDivisionError)
def test_exception_value():
    1 / 0

if __name__ == '__main__':
    pytest.main()
    
# 說(shuō)明代碼:
# 預(yù)期拋出ZeroDivisionError異常蔽介,
# 實(shí)際測(cè)試用例執(zhí)行也拋出了ZeroDivisionError異常摘投。
# 測(cè)試結(jié)果:該用例是xfailed
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末煮寡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犀呼,更是在濱河造成了極大的恐慌幸撕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外臂,死亡現(xiàn)場(chǎng)離奇詭異坐儿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宋光,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)貌矿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人罪佳,你說(shuō)我怎么就攤上這事逛漫。” “怎么了赘艳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酌毡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蕾管,道長(zhǎng)枷踏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任娇掏,我火速辦了婚禮呕寝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婴梧。我一直安慰自己下梢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布塞蹭。 她就那樣靜靜地躺著孽江,像睡著了一般。 火紅的嫁衣襯著肌膚如雪番电。 梳的紋絲不亂的頭發(fā)上岗屏,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音漱办,去河邊找鬼这刷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛娩井,可吹牛的內(nèi)容都是我干的暇屋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洞辣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咐刨!你這毒婦竟也來(lái)了昙衅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤定鸟,失蹤者是張志新(化名)和其女友劉穎而涉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體联予,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啼县,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躯泰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭羔。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖麦向,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情客叉,我是刑警寧澤诵竭,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站兼搏,受9級(jí)特大地震影響卵慰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佛呻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一裳朋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吓著,春花似錦鲤嫡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纺裁,卻和暖如春诫肠,著一層夾襖步出監(jiān)牢的瞬間倒戏,已是汗流浹背粥烁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虚茶,地道東北人谚殊。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓丧鸯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親络凿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骡送,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容