UnitTest框架 - Doctest API

doctest API围绕以下两个用于存储docstrings&minus的交互式示例的容器类;

  • 示例 : 一个Python语句,与其预期输出配对.

  • DocTest : 一组示例,通常从单个文档字符串或文本文件中提取.

定义以下附加处理类来查找,解析,并运行,并检查doctest示例 :

  • DocTestFinder : 查找给定模块中的所有文档字符串,并使用DocTestParser从包含交互式示例的每个文档字符串创建DocTest.

  • DocTestParser &减去;从字符串创建doctest对象(例如对象的docstring).

  • DocTestRunner : 执行doctest中的示例,并使用OutputChecker验证其输出.

  • OutputChecker : 将doctest示例的实际输出与预期输出进行比较,并确定它们是否匹配.

DocTestFinder类

它是一个处理类,用于从其docstring和其包含的对象的文档字符串中提取与给定对象相关的doctests. Doctests当前可以从以下对象类型中提取 - 模块,函数,类,方法,staticmethods,classmethods和属性.

此类定义find()方法.它返回由对象的文档字符串或其任何包含对象的文档字符串定义的DocTests列表.

DocTestParser类

它是一个处理类,用于从字符串中提取交互式示例,并使用它们来创建DocTest对象.此类定义以下方法 :

  • get_doctest() : 从给定字符串中提取所有doctest示例,并将它们收集到 DocTest 对象中.

  • get_examples(string[, name]) : 从给定字符串中提取所有doctest示例,并将它们作为示例对象的列表返回.行号从0开始.可选参数名称是标识此字符串的名称,仅用于错误消息.

  • parse(string[, name])) : 将给定的字符串分为示例和插入文本,并将它们作为交替的示例和字符串列表返回. 示例的行号从0开始.可选参数名称是标识此字符串的名称,仅用于错误消息.

DocTestRunner类

这是一个处理类,用于执行和验证DocTest中的交互式示例.其中定义了以下方法 :

report_start()

报告测试运行器即将处理给定示例.提供此方法是为了允许 DocTestRunner 的子类自定义其输出;它不应该直接调用

report_success()

报告给定的示例成功运行.提供此方法是为了允许DocTestRunner的子类自定义其输出;它不应该直接调用.

report_failure()

报告给定的示例失败.提供此方法是为了允许 DocTestRunner 的子类自定义其输出;它不应该直接调用.

report_unexpected_exception()

报告给定的示例引发了意外异常.提供此方法是为了允许 DocTestRunner 的子类自定义其输出;它不应该直接调用.

运行(测试)

运行 test 中的示例(一个DocTest对象) ,并使用编写器函数 out 显示结果.

汇总([详细])

打印摘要由此DocTestRunner运行的所有测试用例,并返回命名的元组 TestResults(失败,尝试).可选的详细参数控制摘要的详细程度.如果未指定详细程度,则使用DocTestRunner的详细程度.

OutputChecker类

此类用于检查实际输出来自doctest示例匹配预期输出.

此类中定义了以下方法 :

check_output()

如果示例( got )的实际输出与预期输出(想要)匹配,则返回 True .如果它们相同,则始终认为这些字符串匹配;但是,根据测试运行器使用的选项标记,也可以使用多种非精确匹配类型.有关选项标志的更多信息,请参阅选项标志指令.

output_difference()

返回一个字符串,描述给定示例(示例)的预期输出与实际输出(得到)之间的差异.

DocTest与Unittest的集成

doctest模块提供了两个函数,可用于从包含doctests的模块和文本文件创建unittest测试套件.要与unittest测试发现集成,请在测试模块中包含load_tests()函数 :

import unittest
import doctest
import doctestexample

def load_tests(loader, tests, ignore):
   tests.addTests(doctest.DocTestSuite(doctestexample))
   return tests

将形成来自unittest和doctest的组合TestSuite测试,现在可以通过unittest模块的main()方法或run()方法执行.

以下是从文本文件和带有doctests&minus的模块创建 unittest.TestSuite 实例的两个主要功能;

doctest.DocFileSuite( )

它用于将doctest测试从一个或多个文本文件转换为 unittest.TestSuite .返回的unittest.TestSuite将由unittest框架运行,并在每个文件中运行交互式示例.如果文件中的任何示例失败,则合成单元测试失败,并引发 failureException 异常,显示包含测试的文件的名称和(有时是近似的)行号.

doctest.DocTestSuite()

它用于将模块的doctest测试转换为 unittest.TestSuite .

返回的unittest.TestSuite将由unittest框架运行并运行模块中的每个doctest.如果任何doctests失败,则合成单元测试失败,并引发 failureException 异常,显示包含测试的文件的名称和(有时是近似的)行号

在幕后,DocTestSuite()从doctest.DocTestCase实例创建 unittest.TestSuite ,DocTestCase是unittest.TestCase的子类.

同样,DocFileSuite()从doctest.DocFileCase实例创建unittest.TestSuite,而DocFileCase是DocTestCase的子类.

因此,创建unittest.TestSuite的两种方式都运行实例DocTestCase.当您自己运行doctest函数时,可以通过将选项标志传递给doctest函数来直接控制正在使用的doctest选项.

但是,如果您正在编写单元测试框架,则unittest最终控制何时以及如何运行测试.框架作者通常希望控制doctest报告选项(可能,例如,由命令行选项指定),但是没有办法通过unittest将选项传递给doctest测试运行器.