《pytest測試實戰》筆記 二

2021-10-06 21:45:50 字數 3772 閱讀 5945

pytest與unittest對比:

pytest

unittest

assert something

asserttrue(something)

assert a == b

assertequal(a,b)

assert a <= b

assertlessequal(a,b)

pytest有乙個重要的功能,它可以重寫assert關鍵字。pytest會截斷對原生assert的呼叫,替換為pytest定義的assert,從而提供更多的失敗資訊和細節。

增加乙個執行失敗的測試用例:

def

test_failure()

:"""使用assert"""

t1 =

'a' t2 =

'b'assert t1 == t2

執行結果如下:

失敗的測試用例在行首都用乙個》號來表示。以e開頭的行是pytest提供的額外判定資訊,用於幫助我們了解異常的具體情況。

定義乙個task型別資料,並增加乙個會引起typeerror異常的測試用例:

task = namedtuple(

'task',[

'summary'

,'owner'

,'dine'

,'id'])

task.__new__.__delattr__ =

(none

,none

,false

,none

)def

test_task()

: task = task(

);

執行結果如下:

在原本基礎上,增加with pytest.raises(typeerror):

def

test_task()

:with pytest.raises(typeerror)

: task = task(

);

再次執行,執行結果如下:

測試用例test_task()中有with pytest.raises(typeerror)宣告,意味著無論with中的內容是什麼,都至少會發生typeerror異常。如果測試通過,說明確實發生來我們預期的typeerror異常;如果測試失敗,說明丟擲的是與我們所預期不一致的異常。

另外,可以通過as excinfo語句來獲取異常訊息的值。

with pytest.raises(typeerror)

as excinfo:

pytest提供了標記機制,允許你使用marker對測試函式做標記。乙個測試函式可以有多個marker,乙個marker也可以用勒標記多個測試函式。

例如,為了吧選定的測試用例加入冒煙測試,可以對它們新增統一的標識,如:@pytest.mark.smoke。

執行時,通過引數-m來指定:

pytest -m smoke
ps:-m具體用法可檢視:《pytest測試實戰》筆記:一

另外,帶有相同標記的測試用例即使存放在不同檔案下,也會被一起執行。

pytest自身內建了一些標記:skip、skipif、xfail。

skip、skipif允許你跳過不希望執行的測試。

要跳過某個測試用例,只需簡單地在測試函式上新增@pytest.mark.skip()裝飾器即可。

實際上,可以給到跳過的測試用例新增理由和條件,比如希望它只在包版本低於0.2.0時才生效,應用skipif替代skip:

@pytest.mark.skipif(tasks.__version__ <

0.2.0

, reason =

'not supported until version 0.2.0'

)

skipif()的判斷條件可以是任何python表示式。

執行時可以通過-rs檢視跳過的原因:

使用skip、skipif標記,測試用例會被直接跳過,不會被執行。使用xfail標記,告訴pytest執行此測試用例,但預期會失敗。

新增兩個測試用例,均使用了xfail來標記,區別在於demo1的assert為false,demo2的assert為true:

@pytest.mark.xfail(

)def

test_demo1()

: t1 =

'a' t2 =

'b'assert t1 == t2

@pytest.mark.xfail(

)def

test_demo2()

: t1 =

'a' t2 =

'b'assert t1 != t2

執行結果如下:

x:xfail,expected to fail,預期失敗,實際上也失敗了

x:xpass,expected to fail but passed,預期失敗,但實際執行並沒有失敗

執行測試子集有很多方式,不但可以選擇執行某個目錄、檔案、類中的測試,還可以選擇執行某乙個測試用例(可能在檔案中,也可能在類中)。

可以使用@pytest.mark.parametrize(argnames, ar**alues)裝飾器達到批量傳送引數的目的。

testdata_add =[(

1,2,

3),(

3.12

,4.12

,7.24),

(-100,

200,

100),(

"a",

"b",

"ab"),

("中文1"

,"中文2"

,"中文1中文2"),

("space"

," "

,"space "),

("null",""

,"null")]

# 執行時會根據資料的數量執行對應條數的用例

@pytest.mark.parametrize(

"num1, num2, expect"

, testdata_add)

deftest_add

(num1, num2, expect)

:# 接收的變數名要和parametrize的一致

"""測試加法運算函式"""

result = add(num1, num2)

assert result == expect

執行結果如下:

也可以為測試類新增parametrize()轉裝飾器,這種情況下,該資料集會被傳遞給該類的所有類方法。

接下來,會在《pytest測試實戰》筆記:三 中介紹如何使用fixture。fixture的作用是將一些非核心測試邏輯,如:測試資料的檢索和生成,從測試函式中分離出來,以便於其他測試函式復用,同時保持這邊邊緣邏輯的一致性。

pytest測試實戰 電子書 pytest測試實戰

第1章 pytest入門 1 1.1 資源獲取 4 1.2 執行pytest 5 1.3 執行單個測試用例 10 1.4 使用命令列選項 10 collect only選項 11 k選項 11 m選項 12 x選項 13 maxfail num 15 s與 capture method 16 lf ...

pytest測試框架 二 fixture介紹

目錄 一 fixture函式的定義 二 fixture函式的呼叫 三 fixture函式的返回 四 conftest.py的使用 五 使用例項 把乙個函式定義為fixture很簡單,只需要在函式宣告之前加上 pytest.fixture 引數如下 fixture scope function par...

pytest韌體功能測試

例項1 conftest.py pytest.fixture def fun1 print run func1 yield print func1 done pytest.fixture def fun2 print run func2 yield print func2 done test db....