引言:
doctest是python的一个测试用标准库。
顾名思义,这个模块会寻找程序里面看起来像交互式Python会话的文本片段,然后运行这个会话,来判断实际运行结果和你希望的结果是否一致。
这个模块可以用来进行回归测试,或者在编写教程性的文档时使用
基本使用:
1.通过Docstrings测试
我们先创建一个example.py,代码如下
1 '''
2 docstrings可以放的位置13
4 >>> sum(1, 3)5 46
7 '''
8
9
10 defsum(a, b):11 '''
12 docstrings可以放的位置213 >>> sum(3, 5)14 815
16 >>> sum('a', 'c')17 'ac'18 '''
19 return a +b20
21 if __name__ == "__main__":22 importdoctest23 doctest.testmod()
然后我们在控制台执行命令python example.py -v,则会输出测试的结果如下
$ python example.py -v
Trying:
sum(1, 3)
Expecting:
4
ok
Trying:
sum(3, 5)
Expecting:
8
ok
Trying:
sum('a', 'c')
Expecting:
'ac'
ok
2 items passed all tests:
1 tests in __main__
2 tests in __main__.sum
3 tests in 2 items.
3 passed and 0 failed.
Test passed.
注意,在样例全部通过,没有failed的情况下,“python example.py”是不会输出任何东西的,需要加参数-v打印所有的测试样例。我们可以把examp.py的第5行换成错误的结果99,在执行“python example.py”,那么会显示没有通过的样例,如下。
$ python example.py**********************************************************************File"example.py", line 4, in __main__Failed example:
sum(1, 3)
Expected:99Got:4
**********************************************************************
1items had failures:1 of 1 in __main__
***Test Failed*** 1 failures.
还有一点要注意的是,文档注释里面的
>>> sum(1, 3)
">>>"后面记得跟一个空格
我们再看一下
if __name__ == "__main__":importdoctest
doctest.testmod()
如果你不想在__main__中执行testmod(),也可以不写,执行python -m doctest -v example.py也行。
2.通过Test File测试
我们新建一个文本文件example.txt,里面写入
>>> from example import sum
>>> sum(2, 3)
5
然后在example.py中替换testmod()函数为testfile()
importdoctest
doctest.testfile("example.txt")
然后和1一样,运行python example.py -v
同样的,如果你不想在example.py中运行testfile(),你也可以用如下命令
python -m doctest -v example.txt
3.如何写docstring
docstring模块会搜索所有的函数,类和方法的文档字符串,导入到模块中的对象不会去搜索。
大部分情况下,我们可以直接粘贴交互式控制台的输出到文档注释中。但是有几点是需要注意的。
预期输出不能包含全空白行。因为这会当成输出的结束。如果一定要有空白行,用替代
Tab字符会被替换成8个空格
捕获输出到stdout的内容,stderr不会被捕获
关于异常,输出必须以Traceback开头。比如
Traceback (most recent call last):
Traceback (innermost last):
参考资料:
Python官方文档: https://docs.python.org/3/library/doctest.html
《流畅的Python》
\Python36\Lib\test\test_doctest.py