doctest 是一個(gè) Python 發(fā)行版自帶的標(biāo)準(zhǔn)模塊。本篇將分別對(duì)使用 doctest 的兩種方式——嵌入到源代碼中和做成獨(dú)立文件做基本介紹。<br />
在 Python 的官方文檔中,對(duì) doctest 的介紹是這樣的:
doctest 模塊會(huì)搜索那些看起來(lái)像交互式會(huì)話的 Python 代碼片段,然后嘗試執(zhí)行并驗(yàn)證結(jié)果
即使從沒(méi)接觸過(guò) doctest,我們也可以從這個(gè)名字中窺到一絲端倪。“它看起來(lái)就像代碼里的文檔字符串(docstring)一樣” 如果你這么想的話,就已經(jīng)對(duì)了一半了。
doctest 的編寫過(guò)程就仿佛你真的在一個(gè)交互式 shell(比如 idle)中導(dǎo)入了要測(cè)試的模塊,然后開始一條條地測(cè)試模塊里的函數(shù)一樣。實(shí)際上有很多人也是這么做的,他們寫好一個(gè)模塊后,就在 shell 里挨個(gè)測(cè)試函數(shù),最后把 shell 會(huì)話復(fù)制粘貼成 doctest 用例。<br />
下面使用的例子是一個(gè)只有一個(gè)函數(shù)的模塊,其中簽入了兩個(gè) doctest 的測(cè)試用例。
unnecessary_math.py:
lang:python"""這里也可以寫"""def multiply(a,b): """ >>> multiply(2,3) 6 >>> multiply('baka~',3) 'baka~baka~baka~' """ return a*bif __name__ == '__main__': import doctest doctest.testmod(verbose=True)注意測(cè)試代碼的位置,前面說(shuō)過(guò) doctest 的測(cè)試用例就像文檔字符串一樣,這句話的內(nèi)涵在于:測(cè)試用例的位置必須放在整個(gè)模塊文件的開頭,或者緊接著對(duì)象聲明語(yǔ)句的下一行。也就是可以被__doc__ 這個(gè)屬性引用到的地方。并非像普通注釋一樣寫在哪里都可以。另:verbose 參數(shù)用于控制是否輸出詳細(xì)信息,默認(rèn)為False,如果不寫,那么運(yùn)行時(shí)不會(huì)輸出任何東西,除非測(cè)試 fail。
示例的運(yùn)行輸出為:
Trying: multiply(2,3)Expecting: 6okTrying: multiply('baka~',3)Expecting: 'baka~baka~baka~'ok1 items had no tests: __main__1 items passed all tests: 2 tests in __main__.multiply2 tests in 2 items.2 passed and 0 failed.Test passed.上例中啟動(dòng)測(cè)試的方式是在 __main__ 函數(shù)里調(diào)用了 doctest.testmod() 函數(shù)。這對(duì)于純?nèi)萜餍湍K文件來(lái)說(shuō)是一個(gè)好辦法——正常使用時(shí)只做導(dǎo)入用,直接運(yùn)行文件則進(jìn)行測(cè)試。而對(duì)于__main__ 函數(shù)另有他用的情況,則還可以通過(guò)命令行來(lái)啟動(dòng)測(cè)試:
這里 -m 表示引用一個(gè)模塊,-v 等價(jià)于 verbose=True。運(yùn)行輸出與上面基本一樣。<br />
如果不想(或不能)把測(cè)試用例寫進(jìn)源代碼里,則還可以使用一個(gè)獨(dú)立的文本文件來(lái)保存測(cè)試用例。
lang:python可選的一些解釋性內(nèi)容...>>> from test import multiply>>> multiply(2,3)6>>> multiply('baka~',3)'baka~baka~baka~'幾乎同樣的格式。運(yùn)行方法可以分為在 Python shell 里運(yùn)行或者在系統(tǒng) shell 里運(yùn)行:
lang:python>>> import doctest>>> doctest.testfile('example.txt')bash/cmd.exe:
$ python -m doctest -v example.txt新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注