UnitTest 框架 - Doctest
Python 标准发行版包含"Doctest"模块。该模块的功能使搜索看起来像交互式 Python 会话的文本片段成为可能,并执行这些会话以查看它们是否完全按照所示的方式工作。
Doctest 在以下场景中非常有用 −
通过验证所有交互式示例是否仍按文档所述的方式工作,检查模块的文档字符串是否是最新的。
通过验证测试文件或测试对象中的交互式示例是否按预期工作,执行回归测试。
为包编写教程文档,并大量使用输入输出示例进行说明
在 Python 中,"docstring"是字符串文字,它作为类、函数或模块中的第一个表达式出现。执行套件时会忽略它,但编译器会识别它并将其放入封闭类、函数或模块的 __doc__ 属性中。由于它可通过自省获得,因此它是对象文档的规范位置。
通常的做法是将 Python 代码不同部分的示例用法放在文档字符串中。doctest 模块允许验证这些文档字符串是否与代码中的间歇性修订保持同步。
在下面的代码中,定义了一个阶乘函数,并穿插了示例用法。为了验证示例用法是否正确,请调用 doctest 模块中的 testmod() 函数。
"""
This is the "example" module.
The example module supplies one function, factorial(). For example,
>>> factorial(5)
120
"""
def factorial(x):
"""Return the factorial of n, an exact integer >= 0.
>>> factorial(-1)
Traceback (most recent call last):
...
ValueError: x must be >= 0
"""
if not x >= 0:
raise ValueError("x must be >= 0")
f = 1
for i in range(1,x+1):
f = f*i
return f
if __name__ == "__main__":
import doctest
doctest.testmod()
输入并将上述脚本保存为 FactDocTest.py,然后尝试从命令行执行此脚本。
Python FactDocTest.py
除非示例失败,否则不会显示任何输出。现在,将命令行更改为以下 −
Python FactDocTest.py –v
控制台现在将显示以下输出 −
C:\Python27>python FactDocTest.py -v
Trying:
factorial(5)
Expecting:
120
ok
Trying:
factorial(-1)
Expecting:
Traceback (most recent call last):
...
ValueError: x must be >= 0
ok
2 items passed all tests:
1 tests in __main__
1 tests in __main__.factorial
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
另一方面,如果 factorial() 函数的代码未在文档字符串中给出预期结果,则将显示失败结果。例如,将上述脚本中的 f = 1 改为 f = 2,然后再次运行文档测试。结果如下 −
Trying:
factorial(5)
Expecting:
120
**********************************************************************
File "docfacttest.py", line 6, in __main__
Failed example:
factorial(5)
Expected:
120
Got:
240
Trying:
factorial(-1)
Expecting:
Traceback (most recent call last):
...
ValueError: x must be >= 0
ok
1 items passed all tests:
1 tests in __main__.factorial
**********************************************************************
1 items had failures:
1 of 1 in __main__
2 tests in 2 items.
1 passed and 1 failed.
***Test Failed*** 1 failures.
Doctest:检查文本文件中的示例
Doctest 的另一个简单应用是测试文本文件中的交互式示例。这可以通过 testfile() 函数完成。
以下文本存储在名为"example.txt"的文本文件中。
Using ''factorial'' ------------------- This is an example text file in reStructuredText format. First import ''factorial'' from the ''example'' module: >>> from example import factorial Now use it: >>> factorial(5) 120
文件内容被视为文档字符串。为了验证文本文件中的示例,请使用 doctest 模块的 testfile() 函数。
def factorial(x):
if not x >= 0:
raise ValueError("x must be >= 0")
f = 1
for i in range(1,x+1):
f = f*i
return f
if __name__ == "__main__":
import doctest
doctest.testfile("example.txt")
与 testmod() 一样,除非示例失败,否则 testfile() 不会显示任何内容。如果示例失败,则失败的示例和失败的原因将使用与 testmod() 相同的格式打印到控制台。
在大多数情况下,交互式控制台会话的复制和粘贴工作正常,但 doctest 不会尝试对任何特定的 Python shell 进行精确模拟。
任何预期输出都必须紧跟在包含代码的最后一行">>> "或"... "之后,并且预期输出(如果有)延伸到下一个">>> "或全空白行。
预期输出不能包含全空白行,因为这样的行用于表示预期输出的结束。如果预期输出确实包含空行,请在 doctest 示例中的每个预期空行位置放置 <BLANKLINE>。

