我所忽視的測試功能——doctest模塊

前言

之前簡單的按照教程打過一遍doctest模塊笼恰,但是并未重視踊沸,再加上自己平常就不用測試案例,所以最近在一本書上再看到這個模塊時心里又有些模糊淡忘了社证。所以這次專門做個筆記逼龟,關(guān)于doctest模塊以及稍微提及下unittest

我們?yōu)槭裁春鲆?/h3>

少廢話追葡,直接看我得日常操作(或許也是大部分人的操作)就能得到原因腺律。

""" Fibonacci Module """

def fib(n):
    """ Calculates the n-th Fibonacci number iteratively """
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a

def fiblist(n):
    """ creates a list of Fibonacci numbers up to the n-th generation """
    fib = [0,1]
    for i in range(1,n):
        fib += [fib[-1]+fib[-2]]
    return fib

上面是一個斐波那契數(shù)列的日常實現(xiàn)。
而我們經(jīng)常直接就這么干了(手動測試)宜肉,這里手動斜眼:

>>> from fibonacci import fib, fiblist
>>> fib(0)
0
>>> fib(1)
1
>>> fib(10)
55
>>> fiblist(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> fiblist(-8)
[0, 1]
>>> fib(-1)
0
>>> fib(0.5)
Traceback (most recent call last):
  File "", line 1, in 
  File "fibonacci.py", line 6, in fib
    for i in range(n):
TypeError: 'float' object cannot be interpreted as an integer
>>> 

知道憑感覺想到了匀钧,輸入一個浮點數(shù)會報錯。
又或者我們會寫一個簡單判斷測試一下谬返,比如我們在文件中加入下面代碼:

if __name__ == "__main__":
    if fib(0) == 0 and fib(10) == 55 and fib(50) == 12586269025:
        print("Test for the fib function was successful!")
    else:
        print("The fib function is returning wrong values!")

# 運行一下
$ python3 fibonacci.py 
Test for the fib function was successful!

如果函數(shù)沒有得到我們事先算好的值之斯,返回"The fib function is returning wrong values!

所以結(jié)論是:doctest好像用不太到啊,我們像上面那么干就夠了啊~~

doctest模塊

什么情況下用doctest
正式項目的測試或者需要優(yōu)雅的方式遣铝,讓逼格變高的測試案例佑刷。
一般有以下因素時盡量要試用下:

  • 大小
    對于集合(string,list,tuple,dict)
    • 空集合
    • 單元素集
    • 最少數(shù)量用例
    • 較多用例
  • 對分
    • 奇數(shù)/偶數(shù)
    • 正/負(fù)
    • 空/滿
  • 邊界
    函數(shù)在接近閾值的時候處理不同,測試閾值酿炸。
  • 順序
    函數(shù)對不同順序的輸入值瘫絮,測試不同的順序。

所以我們可以這么寫

import doctest

def fib(n):
    """ 
    Calculates the n-th Fibonacci number iteratively  

    >>> fib(0)
    0
    >>> fib(1)
    1
    >>> fib(10) #正確值為55
    56            
    >>> fib(15)
    610
    >>> 

    """
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a

if __name__ == "__main__": 
    doctest.testmod(verbose=True)

之后$ python3 fibonacci_doctest.py可得到測試信息填硕,verbose=True為測試通過與未通過都將消息顯示出來,默認(rèn)為False麦萤,只顯示失敗信息。

Trying:
    fib(0)
Expecting:
    0
ok
Trying:
    fib(1)
Expecting:
    1
ok
Trying:
    fib(10) 
Expecting:
    56
**********************************************************************
File "fibonacci_doctest.py", line 11, in __main__.fib
Failed example:
    fib(10) 
Expected:
    56
Got:
    55
Trying:
    fib(15)
Expecting:
    610
ok
1 items had no tests:
    __main__
**********************************************************************
1 items had failures:
   1 of   4 in __main__.fib
4 tests in 2 items.
3 passed and 1 failed.
***Test Failed*** 1 failures.

也有可能你需要在if __name__ == "__main__":下面寫其他函數(shù)而不是測試函數(shù)扁眯。你可以換個方式频鉴。我修改下主函數(shù)。

if __name__ == "__main__":
    print('hello world')

之后$ python3 -m doctest -v fibonacci_doctest.py跟上面測試信息一樣恋拍,并不會輸出hello world,這里-v等同verbose參數(shù)藕甩。

是否需要unittest

unittest是一個單元測試框架施敢,具體教程可去官方文檔查詢,這里不多做介紹狭莱。
有些人用unittest多余doctest僵娃,主要原因是我把測試內(nèi)容寫在函數(shù)中,像函數(shù)注釋一樣腋妙,一旦測試的東西一多默怨,那么可能導(dǎo)致函數(shù)看上去很復(fù)雜,影響美觀骤素,導(dǎo)致不優(yōu)雅匙睹。
但是doctest還有個testfile方法愚屁,將測試文檔寫入一個單獨的文件。這里我寫一下痕檬。

# 盡量與py文件同名或者相近霎槐,好辨認(rèn),然后以txt結(jié)尾
The ``fibonacci_doctest`` module
======================

Using ``fib``
-------------------

First import fib fuction

    >>> from fibonacci_doctest import fib

Now use it
    >>> fib(0)
    0
    >>> fib(1)
    1
    >>> fib(10)  #正確值為55
    56
    >>> fib(15)
    610
# 上面時文件所有內(nèi)容梦谜,及其一些注釋丘跌,最重要的是 >>>后面的內(nèi)容為測試內(nèi)容 

然后我們在fibonacci_doctest.py中主函數(shù)中寫入:

if __name__ == "__main__":
    doctest.testfile("fibonacci_doctest.txt")

得到如下:

**********************************************************************
File "fibonacci_doctest.txt", line 16, in fibonacci_doctest.txt
Failed example:
    fib(10) #正確值為55
Expected:
    56            
Got:
    55
**********************************************************************
1 items had failures:
   1 of   5 in fibonacci_doctest.txt
***Test Failed*** 1 failures.

OK,結(jié)束唁桩。很好用闭树。

總結(jié)

doctest測試模塊時比較基礎(chǔ),容易理解也容易使用荒澡。

之前看見一個大佬說過报辱,大體意思是這樣的:你寫完一個函數(shù),心里就已經(jīng)想好了測試案例仰猖,各種測試因素捏肢,來驗證你寫的這個函數(shù)的準(zhǔn)確性。

說的很對饥侵。

參考資料

https://www.python-course.eu/python3_tests.php
http://blog.csdn.net/u012151283/article/details/77511806
https://docs.python.org/3/library/doctest.html#doctest.testfile

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸵赫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躏升,更是在濱河造成了極大的恐慌辩棒,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膨疏,死亡現(xiàn)場離奇詭異一睁,居然都是意外死亡,警方通過查閱死者的電腦和手機佃却,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門者吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饲帅,你說我怎么就攤上這事复凳。” “怎么了灶泵?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵育八,是天一觀的道長。 經(jīng)常有香客問我赦邻,道長髓棋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮按声,結(jié)果婚禮上膳犹,老公的妹妹穿的比我還像新娘。我一直安慰自己儒喊,他們只是感情好镣奋,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怀愧,像睡著了一般侨颈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芯义,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天哈垢,我揣著相機與錄音,去河邊找鬼扛拨。 笑死耘分,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绑警。 我是一名探鬼主播求泰,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼计盒!你這毒婦竟也來了渴频?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤北启,失蹤者是張志新(化名)和其女友劉穎卜朗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咕村,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡场钉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了懈涛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逛万。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖批钠,靈堂內(nèi)的尸體忽然破棺而出宇植,到底是詐尸還是另有隱情,我是刑警寧澤价匠,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站呛每,受9級特大地震影響踩窖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晨横,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一洋腮、第九天 我趴在偏房一處隱蔽的房頂上張望箫柳。 院中可真熱鬧,春花似錦啥供、人聲如沸悯恍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涮毫。三九已至,卻和暖如春贷屎,著一層夾襖步出監(jiān)牢的瞬間罢防,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工唉侄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咒吐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓属划,卻偏偏與公主長得像恬叹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子同眯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 作者:廖飛全文約 7778 字绽昼,讀完可能需要 15 分鐘。 原文鏈接:http://www.cnblogs.com...
    羅義的夏天閱讀 4,542評論 1 2
  • Startup 單元測試的核心價值在于兩點: 更加精確地定義某段代碼的作用嗽测,從而使代碼的耦合性更低 避免程序員寫出...
    wuwenxiang閱讀 10,083評論 1 27
  • 1.1Python中的模塊介紹和使用 有過C語言編程經(jīng)驗的朋友都知道在C語言中如果要引用sqrt函數(shù)绪励,必須用語句#...
    TENG書閱讀 412評論 0 0
  • 在Python中有一個概念叫做模塊(module),這個和C語言中的頭文件以及Java中的包很類似唠粥,比如在Pyth...
    一只寫程序的猿閱讀 3,980評論 0 3
  • 夜半靜 喚不醒 煙波碎 人已醉 相思苦 心難留 孤只影 淚濕衣 彼岸花 葉已落 粉黛蒼 人哀傷 心已涼...
    夢雙眸閱讀 942評論 3 13