doctest 是一個 Python 發行版自帶的標準模塊。本篇將分別對使用 doctest 的兩種方式——嵌入到源代碼中和做成獨立文件做基本介紹。 <br /> ##doctest 的概念模型 在 Python 的官方文檔中,對 doctest 的介紹是這樣的: doctest 模塊會搜索那些看起 ...
轉自https://my.oschina.net/lionets/blog/268542
doctest 是一個 Python 發行版自帶的標準模塊。有兩種模式可供使用。
##1 doctest 的概念模型
在 Python 的官方文檔中,對 doctest 的介紹是這樣的:
doctest 模塊會搜索那些看起來像互動式會話的 Python 代碼片段,然後嘗試執行並驗證結果
即使從沒接觸過 doctest,我們也可以從這個名字中窺到一絲端倪。“它看起來就像代碼里的文檔字元串(docstring)一樣” 如果你這麼想的話,就已經對了一半了。
doctest 的編寫過程就仿佛你真的在一個互動式 shell(比如 idle)中導入了要測試的模塊,然後開始一條條地測試模塊里的函數一樣。實際上有很多人也是這麼做的,他們寫好一個模塊後,就在 shell 里挨個測試函數,最後把 shell 會話複製粘貼成 doctest 用例。 舉個例子
下麵使用的例子是一個只有一個函數的模塊,其中簽入了兩個 doctest 的測試用例。
unnecessary_math.py:
lang:python
"""
這裡也可以寫
"""
def multiply(a,b):
"""
>>> multiply(2,3)
6
>>> multiply('baka~',3)
'baka~baka~baka~'
"""
return a*b
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)
註意測試代碼的位置,前面說過 doctest 的測試用例就像文檔字元串一樣,這句話的內涵在於:測試用例的位置必須放在整個模塊文件的開頭,或者緊接著對象聲明語句的下一行。也就是可以被 __doc__
這個屬性引用到的地方。並非像普通註釋一樣寫在哪裡都可以。另:verbose
參數用於控制是否輸出詳細信息,預設為 False
,如果不寫,那麼運行時不會輸出任何東西,除非測試 fail。
示例的運行輸出為:
Trying:
multiply(2,3)
Expecting:
6
ok
Trying:
multiply('baka~',3)
Expecting:
'baka~baka~baka~'
ok
1 items had no tests:
__main__
1 items passed all tests:
2 tests in __main__.multiply
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
上例中啟動測試的方式是在 __main__
函數里調用了 doctest.testmod()
函數。這對於純容器型模塊文件來說是一個好辦法——正常使用時只做導入用,直接運行文件則進行測試。而對於 __main__
函數另有他用的情況,則還可以通過命令行來啟動測試:
$ python -m doctest unnecessary_math.py
$ python -m doctest -v unnecessary_math.py
這裡 -m
表示引用一個模塊,-v
等價於 verbose=True
。運行輸出與上面基本一樣。
##2 獨立文件模式
如果不想(或不能)把測試用例寫進源代碼里,則還可以使用一個獨立的文本文件來保存測試用例。
lang:python
可選的一些解釋性內容...
>>> from test import multiply
>>> multiply(2,3)
6
>>> multiply('baka~',3)
'baka~baka~baka~'
幾乎同樣的格式。運行方法可以分為在 Python shell 里運行或者在系統 shell 里運行:
lang:python
>>> import doctest
>>> doctest.testfile('example.txt')
bash/cmd.exe:
$ python -m doctest -v example.txt