📜  单元测试框架-Doctest

📅  最后修改于: 2020-12-03 05:30:32             🧑  作者: Mango


Python的标准发行版包含“ Doctest”模块。该模块的功能使搜索类似于交互式Python会话的文本片段成为可能,并执行这些会话以查看它们是否完全按照所示方式工作。

Doctest在以下情况下非常有用-

  • 通过验证所有交互式示例是否仍按文档说明工作,以检查模块的文档字符串是否最新。

  • 通过验证来自测试文件或测试对象的交互式示例是否按预期工作来执行回归测试。

  • 编写软件包的教程文档,并通过输入输出示例进行详细说明

在Python,“ docstring”是字符串字面量,它显示为类,函数或模块中的第一个表达式。当执行套件时,它将被忽略,但编译器会识别它并将其放入封闭类,函数或模块的__doc__属性中。由于可以通过内省使用,因此它是记录对象的规范位置。

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

在下面的代码中,定义了阶乘函数并示例用法。为了验证示例用法是否正确,请在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 = 2代替f = 1并再次运行doctest。结果将如下-

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

文件内容被视为docstring。为了验证文本文件中的示例,请使用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示例中将放在每个预期空白行的位置。