doctest 调试

2022-08-03 17:10 更新

Doctest提供了几种调试doctest示例的机制:

  • 几个函数将doctests转换为可执行的Python程序,可以在Python调试器下运行pdb。
  • DebugRunner类是的一个子类DocTestRunner的是提高用于第一故障的例子的异常,包含有关实施例的信息。该信息可用于对示例执行事后调试。
  • unittest通过DocTestSuite()支持由debug()所定义的方法生成的案例unittest.TestCase。
  • 您可以pdb.set_trace()在doctest示例中添加调用,并在执行该行时放入Python调试器。然后你可以检查变量的当前值,等等。例如,假设a.py只包含这个模块docstring:
""" >>> def f(x): ... g(x*2) >>> def g(x): ... print x+3 ... import pdb; pdb.set_trace() >>> f(3) 9 """

然后,一个交互式Python会话可能如下所示:

import a, doctest >>> doctest.testmod(a) --Return-- > (3)g()->None -> import pdb; pdb.set_trace() (Pdb) list 1 def g(x): 2 print x+3 3 -> import pdb; pdb.set_trace() EOF print x 6 (Pdb) step --Return-- > (2)f()->None -> g(x*2) (Pdb) list 1 def f(x): 2 -> g(x*2) EOF print x 3 (Pdb) step --Return-- > (1)?()->None -> f(3) (Pdb) cont (0, 3) >>>

在版本2.4中进行了更改:pdb.set_trace()添加了在文档测试中使用有用的功能。

将doctests转换为Python代码的函数,并可能在调试器下运行综合代码:

doctest.script_from_examples(s)

将带有示例的文本转换为脚本。

参数s是一个包含doctest示例的字符串。该字符串被转换为Python脚本,其中s中的doctest示例转换为常规代码,其他所有内容都转换为Python注释。生成的脚本作为字符串返回。例如,

import doctest
print doctest.script_from_examples(r"""
    Set x and y to 1 and 2.
    >>> x, y = 1, 2

    Print their sum:
    >>> print x+y
    3
""")

显示:

# Set x and y to 1 and 2.
x, y = 1, 2
#
# Print their sum:
print x+y
# Expected:
## 3

该函数在其他函数的内部使用(请参见下文),但是当您想要将交互式Python会话转换为Python脚本时,该函数也很有用。

2.4版本中的新功能。

doctest.testsource(module, name)

将对象的doctest转换为脚本。

参数模块是一个模块对象,或者一个模块的虚线名称,包含其文档感兴趣的对象。参数名称是具有感兴趣的doctests的对象的名称(在模块内)。结果是一个字符串,包含对象的文档字符串转换为Python脚本,script_from_examples()如上所述。例如,如果模块a.py包含顶级函数f(),那么

import a, doctest
print doctest.testsource(a, "a.f")

打印函数f()的文档字符串的脚本版本,将文档转换为代码,其余部分放在注释中。

2.3版本的新功能。

doctest.debug(module, name[, pm])

调试对象的doctests。

该模块和名称参数是相同的功能testsource()之上。已命名对象的文档字符串的合成Python脚本被写入临时文件,然后该文件在Python调试器的控制下运行pdb。

module.__dict__本地和全局执行上下文都使用浅表副本。

可选参数pm控制是否使用验尸调试。如果pm具有真值,则脚本文件将直接运行,并且仅当脚本通过引发未处理的异常终止时才会涉及调试器。如果确实如此,则通过pdb.post_mortem()从未处理的异常中传递回溯对象来调用验尸调试。如果pm没有被指定,或者是false,那么通过传递一个适当的execfile()调用来从脚本开始运行脚本pdb.run()。

2.3版本的新功能。

在版本2.4中更改:添加了pm参数。

doctest.debug_src(src[, pm][, globs])

用字符串调试doctests。

这与debug()上面的函数类似,只是通过src参数直接指定了包含doctest示例的字符串。

可选参数pm与debug()上面的函数具有相同的含义。

可选的参数globs给出了一个字典,用作本地和全局执行上下文。如果未指定,或者None使用空字典。如果指定,则使用字典的浅表副本。

2.4版本中的新功能。

DebugRunner级和特殊的例外可能提高,最感兴趣的测试框架的作者,并且只在这里勾勒。查看源代码,尤其DebugRunner是docstring(这是一个doctest!)以获取更多详细信息:

class doctest.DebugRunner([checker][, verbose][, optionflags])

只要DocTestRunner遇到故障,它的一个子类就会引发异常。如果发生意外异常,则会引发UnexpectedException异常,包含测试,示例和原始异常。如果输出不匹配,则会DocTestFailure引发异常,包含测试,示例和实际输出。

有关构造函数参数和方法的信息,请参阅DocTestRunner高级API一节中的文档。

DebugRunner实例可能会引发两个例外情况:

exception doctest.DocTestFailure(test, example, got)

DocTestRunner表示doctest示例的实际输出与预期输出不符的异常。构造函数参数用于初始化相同名称的属性。

DocTestFailure 定义了以下属性:

DocTestFailure.test

DocTest示例失败时正在运行的对象。

DocTestFailure.example

Example失败。

DocTestFailure.got

示例的实际输出。

exception doctest.UnexpectedException(test, example, exc_info)

一个异常DocTestRunner提示表示doctest示例引发了意外异常。构造函数参数用于初始化相同名称的属性。

UnexpectedException 定义了以下属性:

UnexpectedException.test

DocTest示例失败时正在运行的对象。

UnexpectedException.example

Example失败。

UnexpectedException.exc_info

包含有关意外异常的信息的元组,返回的是sys.exc_info()。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号