测试交互式Python示例(doctest)

Python的标准发行版包含“ doctest”模块。该模块的功能使搜索类似于交互式Python会话的文本片段并执行这些会话以查看它们是否完全如所示那样成为可能。这些示例是从类,模块或函数中的文档字符串表达式中提取的。还可以从附带的文本文件中的文本文件运行doctest。

在Python中,“ docstring”是字符串文字,它显示为类,函数或模块中的第一个表达式。当执行套件时,它将被忽略,但编译器会识别它并将其放入封闭类,函数或模块的__doc__属性中。

通常使用文档字符串来描述Python代码不同部分的示例用法。doctest模块允许验证这些docstring是否与代码中的间歇修订保持最新。

在下面的代码中,定义了阶乘函数并示例用法。为了验证示例用法是否正确,请testmod()在doctest模块中调用该函数。

def add(a,b):
'''
>>> add(10,20)
30
>>> add('aaa','bbb')
'aaabbb'
>>> add('aaa',20)
Traceback (most recent call last):
...
TypeError: must be str, not int
'''
return a+b

首先输入上述脚本并将其另存为mytest.py,然后尝试从命令行执行此脚本。

Python mytest.py

除非示例失败,否则不会显示任何输出。现在将命令行更改为

Python mytest.py –v

现在控制台将显示以下结果-

F:\Python36>python mytest.py -v
Trying:
add(10,20)
Expecting:
30
ok
Trying:
add('aaa','bbb')
Expecting:
'aaabbb'
ok
Trying:
add('aaa',20)
Expecting:
Traceback (most recent call last):
...
TypeError: must be str, not int
ok
1 items had no tests:
__main__
1 items passed all tests:
3 tests in __main__.add
3 tests in 2 items.
3 passed and 0 failed.
Test passed.

检查文本文件中的示例

doctest的另一个简单应用是在文本文件中测试交互式示例。这可以通过testfile()方法来完成。

以下文本存储在名为“ example.txt”的文本文件中

Using ''add''
-------------------
This is an example text file . First import
''add'' from the ''mytest'' module:
>>> from mytest import add
>>> add(10,20)
30

文件内容被视为docstring。为了验证文本文件中的示例,请使用testfile()doctest模块的功能。

def add(a,b):
return a+b
if __name__ == "__main__":
import doctest
doctest.testfile("example.txt")
  • 与一样testmod()testfile()除非示例失败,否则不会显示任何内容。如果某个示例确实失败了,则使用与相同的格式将失败的示例和失败的原因打印到控制台testmod()

  • 在大多数情况下,交互式控制台会话的复制和粘贴效果很好,但是doctest并没有尝试对任何特定的Python shell进行精确的仿真。

  • 任何预期的输出必须紧随包含代码的最后“ >>>”或“ ...”行之后,并且预期的输出(如果有)扩展到下一个“ >>>”或全空格行。

  • 预期输出不能包含全空白行,因为采用了这样的行来表示预期输出的结束。如果预期输出的确包含空白行,请在您的doctest示例中将<BLANKLINE>放在每个预期空白行的位置。

在这篇文章testmod()testfile()方法文档测试模块中进行了讨论。