大家好呀,我是在禿頭路上不斷前行的小編。
今天來(lái)給想入門(mén) Python 測(cè)試卻又還在門(mén)外徘徊不斷、猶豫不決的小伙伴們聊聊 pytest,拿好小本本,認(rèn)真記。
我們先了解下 pytest 這么一個(gè)測(cè)試框架:
pytest 可謂是 Python 測(cè)試框架中的元老了,十分完善成熟,其主要有以下 6 個(gè)特點(diǎn):
- 簡(jiǎn)單靈活,容易上手,文檔豐富;
- 支持參數(shù)化,可以細(xì)粒度地控制要測(cè)試的測(cè)試用例;
- 能夠支持簡(jiǎn)單的單元測(cè)試和復(fù)雜的功能測(cè)試,還可以用來(lái)做 selenium / appnium 等自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試(pytest+requests);
- pytest 具有很多第三方插件,并且可以自定義擴(kuò)展,比較好用的如 pytest-selenium(集成 selenium )、pytest-html(完美html 測(cè)試報(bào)告生成)、pytest-rerunfailures(失敗 case 重復(fù)執(zhí)行)、pytest-xdist(多 CPU 分發(fā))等;
- 測(cè)試用例的 skip 和 xfail 處理;
- 可以很好的和 CI 工具結(jié)合,例如 jenkins
那么如何使用 pytest 呢 ?不要急,且聽(tīng)我一一講解。
第一步:安裝和簡(jiǎn)單使用
安裝:
pip install pytest
簡(jiǎn)單使用:
新建一個(gè)test_sample.py文件,輸入以下代碼:
def input_number(i):
return i + 1
def test_answer():
assert inc(2) == 3
在 test_sample.py 文件中,點(diǎn)擊執(zhí)行 pytest 命令,pytest 將運(yùn)行當(dāng)前目錄及其子目錄下所有名稱(chēng)為“test_.py” 或 “_test.py”的文件。
上述代碼中我們使用了 assert 語(yǔ)句來(lái)驗(yàn)證測(cè)試期望值,pytest 中有一種斷言反思機(jī)制,能智能地報(bào)告 assert 表達(dá)式的中間值,這個(gè)測(cè)試返回了一個(gè)失敗報(bào)告,因?yàn)?input_number(2) 沒(méi)有返回 4 。
第二步:配置文件
pytest 配置文件可以改變 pytest 的運(yùn)行方式,它是一個(gè)固定的文件 pytest.ini 文件,讀取配置信息,按指定的方式去運(yùn)行。
[pytest]
# 添加命令行參數(shù)
addopts = -s
# 文件搜索路徑
testpaths = ./scripts
# 文件名稱(chēng)
python_files = test_*.py
# 類(lèi)名稱(chēng)
python_classes = Test*
# 方法名稱(chēng)
python_functions = test_*
addopts 參數(shù)可以更改默認(rèn)命令行選項(xiàng),這個(gè)當(dāng)我們?cè)?cmd 輸入指令去執(zhí)行用例的時(shí)候,會(huì)用到,比如我想測(cè)試完生成報(bào)告,指令比較長(zhǎng)
pytest -s —html=report.html
每次輸入這么多,不太好記住,于是可以加到 pytest.ini 里
在配置文件中修改 addopts = -s —html = report.html
這樣我下次打開(kāi) cmd,直接輸入 pytest,它就能默認(rèn)帶上這些參數(shù)了
testpaths
默認(rèn)的情況下,pytest將會(huì)進(jìn)入到當(dāng)前目錄下的目錄和文件中,去收集測(cè)試用例(test_開(kāi)頭的函數(shù))。但是很多時(shí)候我們只想搜索固定的某一個(gè)文件夾,比如項(xiàng)目目錄下的scripts文件夾。這樣的話,我們可以通過(guò)配置文件來(lái)是想這個(gè)功能。
testpaths = ./scripts
python_files
pytest 默認(rèn)會(huì)找 test 開(kāi)頭的 py 文件,如果我們想指定某個(gè)文件或者指定某些有規(guī)律的文件名可以使用這個(gè)參數(shù)來(lái)進(jìn)行修改
python_files = test_*.py
python_classes
pytest 默認(rèn)會(huì)找 Test 開(kāi)頭的類(lèi),如果我們想指定某個(gè)類(lèi)或者指定某些有規(guī)律的類(lèi)名可以使用這個(gè)參數(shù)來(lái)進(jìn)行修改
python_classes = Test*
python_functions
pytest 默認(rèn)會(huì)找 test 開(kāi)頭的函數(shù),如果我們想指定某個(gè)函數(shù)或者指定某些有規(guī)律的函數(shù)名可以使用這個(gè)參數(shù)來(lái)進(jìn)行修改
python_functions = test_*
第三步:斷言
斷言是一種除錯(cuò)機(jī)制,用于驗(yàn)證代碼是否符合編碼人員的預(yù)期。編碼人員在開(kāi)發(fā)期間應(yīng)該對(duì)函數(shù)的參數(shù)、代碼中間執(zhí)行結(jié)果合理地使用斷言機(jī)制,確保程序的缺陷盡量在測(cè)試階段被發(fā)現(xiàn)。
簡(jiǎn)單地講,斷言就是對(duì)某種假設(shè)條件進(jìn)行檢查。
assert 預(yù)期結(jié)果 == 實(shí)際結(jié)果
def test_cut(self):
a = 5
b = 5
cut_num = a - b
assert 10 == cut_num
assert 后面的 10 是一個(gè)期望的值,cut_num 是實(shí)際得出的值,pytest 框架會(huì)自行判斷二者的關(guān)系是否等價(jià)(==),當(dāng)條件成立時(shí),則斷言成功,腳本通過(guò)。條件不成立時(shí),則斷言失敗,腳本不通過(guò)。
總結(jié):
pytest 作為 Python 測(cè)試框架中的元老,其用途是非常廣泛的,比如 fixture,以及各式各樣的第三方插件。
以上就是小編今天給大家講解的 pytest 簡(jiǎn)單的入門(mén)。如果再學(xué)習(xí)到更多的相關(guān)知識(shí)。我們就可以結(jié)合上面的內(nèi)容來(lái)做基本的自動(dòng)化測(cè)試了。
推薦好課:Python 自動(dòng)化管理、Python 自動(dòng)化辦公。