從小白到測(cè)試專家:掌握Pytest的實(shí)用技巧和優(yōu)秀實(shí)踐

pytest是一個(gè)功能豐富且易于使用的Python測(cè)試框架,它建立在Python標(biāo)準(zhǔn)庫(kù)的unittest模塊之上,提供了更簡(jiǎn)潔、靈活和可讀性強(qiáng)的測(cè)試代碼編寫方式。下面,我將按照步驟引導(dǎo)您學(xué)習(xí)pytest。
步驟1:安裝pytest
首先,您需要安裝pytest。您可以使用pip包管理器來(lái)安裝它。打開(kāi)終端(或命令提示符)并執(zhí)行以下命令:
pip install pytest步驟2:編寫測(cè)試函數(shù)
在學(xué)習(xí)如何編寫測(cè)試之前,讓我們先了解一下pytest測(cè)試的基本結(jié)構(gòu)。
在pytest中,測(cè)試函數(shù)以test_開(kāi)頭,例如test_addition()。這些函數(shù)是用來(lái)測(cè)試代碼的不同部分,每個(gè)測(cè)試函數(shù)應(yīng)該只關(guān)注一個(gè)特定的功能或行為。
讓我們創(chuàng)建一個(gè)簡(jiǎn)單的示例來(lái)說(shuō)明。在您的項(xiàng)目目錄下,創(chuàng)建一個(gè)名為test_calculator.py的文件,并在其中編寫以下代碼:
def add(a, b):
return a + b
def test_addition():
result = add(3, 5)
assert result == 8在上面的示例中,我們定義了一個(gè)add()函數(shù)來(lái)執(zhí)行加法運(yùn)算,并編寫了一個(gè)test_addition()函數(shù)來(lái)測(cè)試這個(gè)加法函數(shù)。在測(cè)試函數(shù)中,我們調(diào)用add(3, 5)并使用assert語(yǔ)句來(lái)驗(yàn)證結(jié)果是否等于8。
步驟3:運(yùn)行測(cè)試
現(xiàn)在,我們已經(jīng)編寫了一個(gè)簡(jiǎn)單的測(cè)試函數(shù),讓我們運(yùn)行它并查看結(jié)果。在終端中,導(dǎo)航到項(xiàng)目目錄,并執(zhí)行以下命令:
pytestpytest將會(huì)自動(dòng)查找項(xiàng)目中以test_開(kāi)頭的測(cè)試函數(shù),并執(zhí)行它們。您應(yīng)該會(huì)看到一個(gè)類似于以下內(nèi)容的輸出:
============================= test session starts ==============================
platform linux -- Python 3.x.y, pytest-x.y.z, py-x.y.z, pluggy-x.y.z
rootdir: /path/to/your/project
collected 1 item
test_calculator.py . [100%]
============================== 1 passed in 0.01s ===============================從上面的輸出中,我們可以看到測(cè)試會(huì)話開(kāi)始并顯示了平臺(tái)信息,然后顯示了一個(gè)進(jìn)度條,最后顯示了測(cè)試結(jié)果。在這種情況下,一個(gè)測(cè)試通過(guò),沒(méi)有任何錯(cuò)誤或失敗。
步驟4:使用更多的斷言
在步驟2中的示例中,我們只使用了一個(gè)簡(jiǎn)單的assert語(yǔ)句來(lái)斷言測(cè)試結(jié)果。然而,pytest提供了許多其他有用的斷言函數(shù),讓我們可以編寫更復(fù)雜的斷言邏輯。
例如,我們可以使用assert語(yǔ)句來(lái)檢查值是否相等、不相等、大于、小于等等。此外,pytest還提供了許多其他的斷言函數(shù),如assert_raises()用于檢查異常,assert_in()用于檢查元素是否在集合中等等。
以下是一些常用的斷言函數(shù)示例:
def test_assertions():
assert 5 == 5 # 檢查相等
assert 10 != 5 # 檢查不相等
assert 3 < 10 # 檢查小于
assert 20 > 10 # 檢查大于
assert 5 <= 5 # 檢查小于等于
assert 10 >= 5 # 檢查大于等于
assert_raises(ValueError, int, 'string') # 檢查是否引發(fā)特定異常
assert 'hello' in 'hello world' # 檢查子字符串是否在字符串中
assert_in(3, [1, 2, 3, 4, 5]) # 檢查元素是否在列表中步驟5:測(cè)試夾具(Fixtures)
測(cè)試夾具是pytest中非常強(qiáng)大且常用的概念。它們提供了一種方便的方式來(lái)準(zhǔn)備測(cè)試環(huán)境、共享測(cè)試數(shù)據(jù)和執(zhí)行重復(fù)的操作。
在pytest中,使用@pytest.fixture裝飾器來(lái)定義測(cè)試夾具。然后,在測(cè)試函數(shù)中通過(guò)參數(shù)來(lái)使用這些夾具。
以下是一個(gè)簡(jiǎn)單的夾具示例:
import pytest
@pytest.fixture
def setup():
# 在測(cè)試之前的準(zhǔn)備工作
data = [1, 2, 3, 4, 5]
return data
def test_fixture_example(setup):
# 使用setup夾具
assert len(setup) == 5
assert 3 in setup在上面的示例中,我們定義了一個(gè)名為setup的夾具。該夾具返回一個(gè)包含5個(gè)元素的列表。然后,我們?cè)趖est_fixture_example()測(cè)試函數(shù)中使用了這個(gè)夾具,并編寫了一些斷言來(lái)驗(yàn)證夾具的功能。
步驟6:使用參數(shù)化測(cè)試
參數(shù)化測(cè)試是pytest的另一個(gè)強(qiáng)大功能。它允許您以一種簡(jiǎn)潔的方式運(yùn)行多個(gè)測(cè)試用例,只需在測(cè)試函數(shù)上應(yīng)用一個(gè)裝飾器。
使用@pytest.mark.parametrize裝飾器,您可以為測(cè)試函數(shù)提供一個(gè)或多個(gè)參數(shù)組合,并定義每個(gè)參數(shù)的值。
以下是一個(gè)參數(shù)化測(cè)試的示例:
import pytest
def add(a, b):
return a + b
@pytest.mark.parametrize('a, b, expected', [
(2, 3, 5),
(4, 5, 9),
(-1, 1, 0),
])
def test_addition(a, b, expected):
result = add(a, b)
assert result == expected在上面的示例中,我們使用@pytest.mark.parametrize裝飾器為test_addition()測(cè)試函數(shù)提供了三個(gè)參數(shù)組合。每個(gè)參數(shù)組合都包含兩個(gè)輸入?yún)?shù)a和b,以及預(yù)期結(jié)果expected。pytest將自動(dòng)為每個(gè)參數(shù)組合運(yùn)行測(cè)試,并使用斷言驗(yàn)證結(jié)果。
步驟7:其他pytest功能
除了上述步驟中提到的功能外,pytest還提供了許多其他強(qiáng)大的功能和插件,以幫助您更好地編寫和組織測(cè)試代碼。
- 標(biāo)記(Markers):您可以使用標(biāo)記來(lái)選擇性地運(yùn)行測(cè)試集合,例如只運(yùn)行特定的標(biāo)記測(cè)試。
- 測(cè)試跳過(guò)和跳過(guò)失敗:您可以使用@pytest.mark.skip裝飾器來(lái)跳過(guò)某些測(cè)試,以及使用@pytest.mark.xfail裝飾器來(lái)標(biāo)記預(yù)期失敗的測(cè)試。
- 測(cè)試覆蓋率:pytest可以與覆蓋率工具集成,以幫助您評(píng)估代碼的測(cè)試覆蓋率。
- 測(cè)試重試:有時(shí)測(cè)試可能會(huì)因?yàn)橥獠恳蛩囟。缇W(wǎng)絡(luò)故障。pytest可以通過(guò)使用@pytest.mark.flaky裝飾器來(lái)自動(dòng)重試測(cè)試,以提高穩(wěn)定性。
這只是pytest的一小部分功能,它還有許多其他功能可以探索和學(xué)習(xí)。通過(guò)閱讀pytest的官方文檔和參考資料,您可以進(jìn)一步了解這些功能并在實(shí)際項(xiàng)目中應(yīng)用它們。




























