Pytest 測(cè)試框架入門

本文作者:劉春明
原文鏈接:http://blog.csdn.net/liuchunming033/

1野崇、 Pytest 介紹

pytest 是 python 的一種單元測(cè)試框架帝簇,與 python 自帶的 unittest 測(cè)試框架類似,但是比 unittest 框架使用起來更簡(jiǎn)潔侈玄,效率更高。根據(jù) pytest 的官方網(wǎng)站介紹,它具有如下特點(diǎn):

  • 非常容易上手塞淹,入門簡(jiǎn)單玲昧,文檔豐富犯祠,文檔中有很多實(shí)例可以參考

  • 能夠支持簡(jiǎn)單的單元測(cè)試和復(fù)雜的功能測(cè)試

  • 支持參數(shù)化

  • 執(zhí)行測(cè)試過程中可以將某些測(cè)試跳過,或者對(duì)某些預(yù)期失敗的 case 標(biāo)記成失敗

  • 支持重復(fù)執(zhí)行失敗的 case

  • 支持運(yùn)行由 nose , unittest 編寫的測(cè)試 case

  • 具有很多第三方插件酌呆,并且可以自定義擴(kuò)展

  • 方便的和持續(xù)集成工具集成

由于網(wǎng)上 pytest 的中文文檔比較少,自己學(xué)習(xí)過程中搔耕,基本上看的就是英文的官方文檔隙袁,對(duì)于不想看英文的同學(xué)們,本系列文章希望能夠幫大家一馬弃榨。

2菩收、安裝 pytest

與安裝其他的 python 軟件無異,直接使用 pip 安裝鲸睛。

pip install - U pytest

安裝完成后娜饵,可以驗(yàn)證安裝的版本:

py.test - -version

3、一個(gè)實(shí)例

我們可以通過下面的實(shí)例官辈,看看使用 py.test 進(jìn)行測(cè)試是多么簡(jiǎn)單。

## content of test_sample.py

def func(x): ? ?return x + 1
ef
test_func():
? ?assert func(3) == 5

這里我們定義了一個(gè)被測(cè)試函數(shù) func ,該函數(shù)將傳遞進(jìn)來的參數(shù)加1后返回芥炭。我們還定義了一個(gè)測(cè)試函數(shù) test_func 用來對(duì) func 進(jìn)行測(cè)試调榄。 test_func 中我們使用基本的斷言語句 assert 來對(duì)結(jié)果進(jìn)行驗(yàn)證。

下面來運(yùn)行這個(gè)測(cè)試:

$ py.test
== == == == == == == == == == == == == = test session starts == == == == == == == == == == == == == ==
platform linux - - Python 3.4.1 - - py - 1.4.27 - - pytest - 2.7.1rootdir:
 ? ?/tmp / doc - exec - 101, inifile:
collected 1 items
test_sample.py F
== == == == == == == == == == == == == == == == = FAILURES == == == == == == == == == == == == == == == == =
_______________________________ test_answer ________________________________
def test_answer():
> assert func(3) == 5E
assert 4 == 5E + where 4 = func(3) test_sample.py: ? ?5: ? ? ? ?AssertionError == == == == == == == == == == == == = 1 failed in 0.01 seconds == == == == == == == == == == == == =

執(zhí)行測(cè)試的時(shí)候肺魁,我們只需要在測(cè)試文件 test_sample 所在的目錄下电湘,運(yùn)行 py.test 即可。 pytest 會(huì)在當(dāng)前的目錄下鹅经,尋找以 test 開頭的文件(即測(cè)試文件)寂呛,找到測(cè)試文件之后,進(jìn)入到測(cè)試文件中尋找 test_ 開頭的測(cè)試函數(shù)并執(zhí)行瘾晃。

通過上面的測(cè)試輸出贷痪,我們可以看到該測(cè)試過程中,一個(gè)收集到了一個(gè)測(cè)試函數(shù)酗捌,測(cè)試結(jié)果是失敗的(標(biāo)記為 F )呢诬,并且在 FAILURES 部分輸出了詳細(xì)的錯(cuò)誤信息,幫助我們分析測(cè)試原因胖缤,我們可以看到” assert
func(3) == 5”這條語句出錯(cuò)了尚镰,錯(cuò)誤的原因是 func(3)=4,然后我們斷言 func(3) 等于 5哪廓。

4狗唉、再一個(gè)實(shí)例

當(dāng)需要編寫多個(gè)測(cè)試樣例的時(shí)候,我們可以將其放到一個(gè)測(cè)試類當(dāng)中涡真,如:

## content of test_class.py

class TestClass: ? ?def test_one(self): ? ? ? ?x = "this" ? ? ? ?assert 'h' in x ? ?

? ?def test_two(self): ? ? ? ?x = "hello" ? ? ? ?assert hasattr(x, 'check')

我們可以通過執(zhí)行測(cè)試文件的方法分俯,執(zhí)行上面的測(cè)試:

$ py.test - q test_class.py
.F
== == == == == == == == == == == == == == == == = FAILURES == == == == == == == == == == == == == == == == =
____________________________ TestClass.test_two ____________________________
self = <test_class.TestClass object at 0x7fbf54cf5668 >
def test_two(self):x = "hello"> assert hasattr(x, 'check') E assert hasattr('hello', 'check') test_class.py: ? ?8: ? ? ? ?AssertionError1 failed, 1 passed in 0.01 seconds

從測(cè)試結(jié)果中可以看到肾筐,該測(cè)試共執(zhí)行了兩個(gè)測(cè)試樣例,一個(gè)失敗一個(gè)成功缸剪。同樣吗铐,我們也看到失敗樣例的詳細(xì)信息,和執(zhí)行過程中的中間結(jié)果杏节。

5唬渗、如何編寫 pytest 測(cè)試樣例

通過上面2個(gè)實(shí)例,我們發(fā)現(xiàn)編寫 pytest 測(cè)試樣例非常簡(jiǎn)單奋渔,只需要按照下面的規(guī)則:

  • 測(cè)試文件以 test_ 開頭(以 _test 結(jié)尾也可以)

  • 測(cè)試類以 Test 開頭镊逝,并且不能帶有 __init__ 方法

  • 測(cè)試函數(shù)以 test_ 開頭

  • 斷言使用基本的 assert 即可

6、如何執(zhí)行 pytest 測(cè)試樣例

執(zhí)行測(cè)試樣例的方法很多種嫉鲸,上面第一個(gè)實(shí)例是直接執(zhí)行 py.test 撑蒜,第二個(gè)實(shí)例是傳遞了測(cè)試文件給 py.test 。其實(shí) py.test 有好多種方法執(zhí)行測(cè)試:

py.test ? ? ? ? ? ? ? ## run all tests below current dir
py.test test_mod.py ? # run tests in module
py.test somepath ? ? ?# run all tests below somepath
py.test - k stringexpr ?# only run tests with names that match the# the "string expression", e.g. "MyClass and not method"# will select TestMyClass.test_something# but not TestMyClass.test_method_simple
py.test test_mod.py: ? ?: ? ? ? ?test_func ?# only run tests that match the "node ID", ? ? ? ?# e.g "test_mod.py::test_func" will select ? ? ? ?# only test_func in test_mod.py

7玄渗、測(cè)試報(bào)告

pytest 可以方便的生成測(cè)試報(bào)告座菠,即可以生成 HTML 的測(cè)試報(bào)告,也可以生成 XML 格式的測(cè)試報(bào)告用來與持續(xù)集成工具集成捻爷。

生成 HTML 格式報(bào)告:

py.test - -resultlog = path

生成 XML 格式的報(bào)告:

py.test - -junitxml = path

8辈灼、如何獲取幫助信息

py.test - -version ?# shows where pytest was imported from
py.test - -fixtures ?# show available builtin function arguments
py.test - h | --help ?# show help on command line and config file options

9、最佳實(shí)踐

其實(shí)對(duì)于測(cè)試而言也榄,特別是在持續(xù)集成環(huán)境中巡莹,我們的所有測(cè)試最好是在虛擬環(huán)境中。這樣不同的虛擬環(huán)境中的測(cè)試不會(huì)相互干擾的甜紫。

由于我們的實(shí)際工作中降宅,在同一個(gè) Jekins 中,運(yùn)行了好多種不同項(xiàng)目?jī)?cè)的測(cè)試囚霸,因此腰根,各個(gè)測(cè)試項(xiàng)目運(yùn)行在各自的虛擬環(huán)境中。

將 pytest 安裝在虛擬環(huán)境中:

1拓型、將當(dāng)前目錄創(chuàng)建為虛擬環(huán)境

virtualenv . ? ? ? ?# create a virtualenv directory in the current directory

source bin/activate ?# on unix

2额嘿、在虛擬環(huán)境中安裝 pytest :

pip install pytest

點(diǎn)擊閱讀原文,查看更多 Python 教程和資源


閱讀原文:http://mp.weixin.qq.com/s?__biz=MzAwNDc0MTUxMw==&mid=2649639755&idx=1&sn=329ade4a4e48b9671a3fb6230e2d833e&chksm=833dabadb44a22bb37cfa1d542add99c07a9fdea2ab8dc67610ba2be78b23ad084249cd618e3#rd
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劣挫,一起剝皮案震驚了整個(gè)濱河市册养,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌压固,老刑警劉巖球拦,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坎炼,警方通過查閱死者的電腦和手機(jī)愧膀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谣光,“玉大人檩淋,你說我怎么就攤上這事√呀穑” “怎么了狼钮?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捡絮。 經(jīng)常有香客問我,道長(zhǎng)莲镣,這世上最難降的妖魔是什么福稳? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮瑞侮,結(jié)果婚禮上的圆,老公的妹妹穿的比我還像新娘。我一直安慰自己半火,他們只是感情好越妈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钮糖,像睡著了一般梅掠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上店归,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天阎抒,我揣著相機(jī)與錄音,去河邊找鬼消痛。 笑死且叁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秩伞。 我是一名探鬼主播逞带,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼纱新!你這毒婦竟也來了展氓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤怒炸,失蹤者是張志新(化名)和其女友劉穎带饱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勺疼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年教寂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执庐。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酪耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轨淌,到底是詐尸還是另有隱情迂烁,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布递鹉,位于F島的核電站盟步,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躏结。R本人自食惡果不足惜却盘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媳拴。 院中可真熱鬧黄橘,春花似錦、人聲如沸屈溉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽子巾。三九已至帆赢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間线梗,已是汗流浹背匿醒。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缠导,地道東北人廉羔。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像僻造,于是被迫代替她去往敵國(guó)和親憋他。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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