pytest是第三方開發(fā)的一個(gè)python測(cè)試模塊,可以輕松地編寫小型測(cè)試朵栖,而且可以擴(kuò)展以支持應(yīng)用程序和庫(kù)的復(fù)雜功能測(cè)試,幫助我們編寫更好的程序。
安裝pytest
先在命令行中運(yùn)行pytest的安裝命令:
$ pip install -U pytest
安裝完成后歌粥,檢查是否安裝了正確的版本:
$ pytest --version
簡(jiǎn)單的測(cè)試
我們從一個(gè)簡(jiǎn)單的測(cè)試?yán)娱_始了解pytest,新建一個(gè)test_sample.py文件拍埠,輸入以下代碼:
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
在test_sample.py文件的目錄下失驶,執(zhí)行pytest
命令,pytest將運(yùn)行當(dāng)前目錄及其子目錄下所有名稱為“test_*.py”或“*_test.py”的文件:
$ pytest
我們使用了assert語句來驗(yàn)證測(cè)試期望值枣购,pytest中有一種斷言反思機(jī)制嬉探,能智能地報(bào)告assert表達(dá)式的中間值,使我們不必再使用傳統(tǒng)的JUnit方法坷虑。這個(gè)測(cè)試返回了一個(gè)失敗報(bào)告甲馋,因?yàn)閕nc(3)沒有返回5,如下圖所示:
斷言引發(fā)異常
使用raises
可以幫助我們斷言某些代碼會(huì)引發(fā)某個(gè)異常迄损,新建一個(gè)test_sysexit.py文件定躏,輸入以下代碼:
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
這樣在出現(xiàn)該異常的時(shí)候,這個(gè)測(cè)試用例也不會(huì)標(biāo)記為失敗,以quiet
報(bào)告模式執(zhí)行測(cè)試功能:
$ pytest -q test_sysexit.py
這個(gè)測(cè)試返回了一個(gè)成功報(bào)告痊远,如下圖所示:
執(zhí)行多個(gè)測(cè)試
當(dāng)我們開發(fā)了多個(gè)測(cè)試時(shí)垮抗,可能會(huì)把它們分組到一個(gè)類中,我們現(xiàn)在可以使用pytest創(chuàng)建一個(gè)包含多個(gè)測(cè)試的類碧聪,新建一個(gè)test_class.py文件冒版,輸入以下代碼:
class TestClass(object):
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
pytest會(huì)發(fā)現(xiàn)所有“test_*”命名的函數(shù),沒有必要繼承任何東西逞姿,我們可以簡(jiǎn)單地通過傳遞它的文件名來運(yùn)行測(cè)試:
$ pytest -q test_class.py
第一個(gè)測(cè)試通過辞嗡,第二個(gè)測(cè)試失敗,我們可以輕松地看到斷言中的中間值滞造,以幫助我們了解失敗的原因续室,如下圖所示:
使用內(nèi)置fixture
fixture是pytest中的一個(gè)特性,fixture可以請(qǐng)求任意資源谒养,用文字不太好理解挺狰,我們就通過實(shí)例來理解吧。首先买窟,通過以下命令可以找出所有pytest內(nèi)置的fixture:
$ pytest --fixtures
我們就以tmpdir
這個(gè)內(nèi)置的fixture來演示丰泊,tmpdir
能返回一個(gè)唯一的臨時(shí)目錄路徑,新建一個(gè)test_tmpdir.py文件始绍,輸入以下代碼:
def test_needsfiles(tmpdir):
print (tmpdir)
assert 0
在測(cè)試函數(shù)的參數(shù)中列出tmpdir
瞳购,pytest將在執(zhí)行測(cè)試函數(shù)之前查找并調(diào)用fixture工廠來創(chuàng)建資源:
$ pytest -q test_tmpdir.py
在測(cè)試運(yùn)行之前,pytest會(huì)創(chuàng)建一個(gè)唯一的疆虚,供每個(gè)測(cè)試調(diào)用的臨時(shí)目錄苛败,如下圖所示: