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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

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