doctest 是一個 Python 發行版自帶的標準模塊。本篇將分別對使用 doctest 的兩種方式——嵌入到源代碼中和做成獨立文件做基本介紹。<br />
在 Python 的官方文檔中,對 doctest 的介紹是這樣的:
doctest 模塊會搜索那些看起來像交互式會話的 Python 代碼片段,然后嘗試執行并驗證結果
即使從沒接觸過 doctest,我們也可以從這個名字中窺到一絲端倪。“它看起來就像代碼里的文檔字符串(docstring)一樣” 如果你這么想的話,就已經對了一半了。
doctest 的編寫過程就仿佛你真的在一個交互式 shell(比如 idle)中導入了要測試的模塊,然后開始一條條地測試模塊里的函數一樣。實際上有很多人也是這么做的,他們寫好一個模塊后,就在 shell 里挨個測試函數,最后把 shell 會話復制粘貼成 doctest 用例。<br />
下面使用的例子是一個只有一個函數的模塊,其中簽入了兩個 doctest 的測試用例。
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)注意測試代碼的位置,前面說過 doctest 的測試用例就像文檔字符串一樣,這句話的內涵在于:測試用例的位置必須放在整個模塊文件的開頭,或者緊接著對象聲明語句的下一行。也就是可以被__doc__
這個屬性引用到的地方。并非像普通注釋一樣寫在哪里都可以。另:verbose
參數用于控制是否輸出詳細信息,默認為False
,如果不寫,那么運行時不會輸出任何東西,除非測試 fail。
示例的運行輸出為:
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.上例中啟動測試的方式是在 __main__
函數里調用了 doctest.testmod()
函數。這對于純容器型模塊文件來說是一個好辦法——正常使用時只做導入用,直接運行文件則進行測試。而對于__main__
函數另有他用的情況,則還可以通過命令行來啟動測試:
這里 -m
表示引用一個模塊,-v
等價于 verbose=True
。運行輸出與上面基本一樣。<br />
如果不想(或不能)把測試用例寫進源代碼里,則還可以使用一個獨立的文本文件來保存測試用例。
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新聞熱點
疑難解答