引言
文档测试,其实就是可以将一些测试代码写到注释中去,然后通过doctest模块去自动执行写在注释中的代码上去
当我们编写注释时,如果这样写:
def abs(n):
'''
Function to get absolute value of number.
Example:
>>> abs(1)
1
>>> abs(-1)
1
>>> abs(0)
0
'''
return n if n>=0 else (-n)
这样的注释,无疑明确的告诉了改函数的期待输入和输出
怎么完成文档测试呢?
python中内置的doctest模块可以直接用来提取注释中的代码,并且进行测试
doctest会严格按照python交互式命令行的输入输出来判断测试结果是否正确。只有测试异常的时候,可以用...
表示中间一大段烦人的输出
我们用doctest来测试一下之前编写的Dict类,不过这里我们应该先修改下我们的Dict类
#mydict2.py
class Dict(dict):
'''
Sample 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().__init__(**kw)
def __getattr__(self,key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s' "%s)
def __setattr__(self,key,value):
self[key]=value
if __name__='__main__':
import doctest
if doctest.__file__ == "/path/to/standard/doctest-module":
doctest.testmod()
好了,这样我们就把这个文档测试代码就写的差不多了,我们现在来跑一下,请看
注意如果注释中书写又问的话,会报错测试出现错误,所以一定注意书写正确
我们发现,并没有什么输出,这是因为我们编写的doctest运行都是正确的,如果程序有问题
比如我们现在把 getattr()方法注释掉,我们来看下结果
这样错误就暴露出来了,我们就可以根据暴露出来的错误进行更正了。
所以,我们来总结一下:
当我们写的代码和文档测试都没有问题的话,文档测试不会报出任何错误,如果报出错误说明我们写的文档测试代码或者是我们的模块代码有问题,这个时候我们就应该去修复一下我们的代码了
另外一点需要注意的:
当我们模块别的的调用者正常导入时,doctest不会被执行。
只有在命令行直接运行时,doctest才会被执行,所以不用担心doctest会在非测试环境下执行。
总结
doctest非常有用,不但可以用来测试,还可以直接作为示例代码。
通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctest。