python之doctest的用法
doctest是python自帶的一個模塊,你可以把它叫做“文檔測試”(doctest)模塊。
doctest的使用有兩種方式:一個是嵌入到python源中。另一個是放到一個獨立文件。
doctest的概念模型:
Module doctest - 一個在docstrings中運行示例的框架。
在最簡單的使用中,結束每個要測試的模塊M:
def _test():
導入doctest
doctest.testmod()
如果__name__ ==“__main__”:
_測試()
然后將該模塊作為腳本運行將導致在
docstrings得到執行和驗證:
python M.py
這將不會顯示任何東西,除非一個例子失敗,在這種情況下
失敗的例子和失敗的原因被打印到標準輸出
(為什么不stderr?因為stderr是一個蹩腳的黑客<0.2.wink>),以及最后的
輸出行是“測試失敗”。
改為使用-v開關運行它:
python M.py -v
并將所有嘗試的示例的詳細報告一起打印到stdout
并在最后提供各種摘要。
您可以通過將“verbose = True”傳遞給testmod來強制詳細模式,或禁止
它通過傳遞“verbose = False”。在任何一種情況下,sys.argv都不是
由testmod檢查。
有多種其他方式可以運行doctests,包括集成
使用unittest框架,并支持運行非Python文本
包含doctests的文件。還有很多方法可以覆蓋零件
doctest的默認行為
doctest潛入源碼中:
例子:
用doctext測試一個Dict類:
#mydit.py
class Dict(dict):
,,,
simple dict but also support access as x.y style.
>>> d1 = Dict()
>>> d1['x'] = 100
>>> d1.x
100
>>> d1.y=200
>>> d1['y']
200
>>> d2 = Dict(a=1,b=2,c='3')
>>> d2.c
'3'
>>> d2['empty']
Traceback (most recent call last):
...
KeyError:'empty'
>>> d2.empty
Traceback(most recent call last):
...
AttributeError: 'Dict' object has no attribute 'empty'
'''
def __init__(self,**kw):
super(Dict,self).__init__(**kw)
def _getattr_(self,key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'"%key)
def _setattr_(self,key,value):
self[key] = value
if __name__=='_main_':
import doctest
docest.testmod()
doctest嚴格按照python交互式命令行的輸入和輸出來判斷測試結果是否正確。只有測試異常的時候,可以用...表示中間的一大段煩人的輸出。
運行python mydict.py:
$ python mydict.py
什么輸出也沒有。這說明我們編寫的doctest運行都是正確的。
獨立文件模式
如果不想或不能把測試用例寫進源代碼里,則還可以使用一個獨立的文本文件來保存測試用例。
將doctest從測試用例:
def multiply(a, b): """ >>> multiply(4, 3) 12 >>> multiply('a', 3) 'aaa' """ return a * b if __name__=='__main__': import doctest doctest.testmod(verbose=
True)
放到test_unnecessary_math.txt文件里。
1 這個例子展示如何將doctest用例放到一個獨立的文件中。
2 '>>>'開頭的行就是doctest測試用例。
3 不帶'>>>'的行就是測試用例的輸出。
4 如果實際運行的結果與期望的不一致,就標記為測試失敗。
>>> from unnecessary_math import mutiply
>>> mutiply(3,4)
12
>>>mutiply('a',3)
'aaa'
注意: from 那一行也要以>>>開頭
在系統的shell中執行:
python -m doctest -v test_unncessary_math.txt
- 上一篇 ?python enumerate用法
- 下一篇 ?python中*號用法總結