为什么 doctest 跳过对导入方法的测试?

问题描述

我有一个 Python 模块 some_module,其中有一个 __init__.py 文件可以导入方法,如下所示:

from .some_python_file import some_method

some_method一个包含 doctests 的文档字符串:

def some_method():
    """
    >>> assert False
    """

但是当我在模块上运行 doctest 时,即使测试失败,它也会通过。

import some_module
# How do I get this to consistently fail,regardless of whether
# `some_module.some_method` was declared inline or imported?
assert doctest.testmod(some_module).Failed == 0

如果我改为在 some_method 文件中定义 __init__.py,doctest 将正确失败。

为什么这两种情况的表现不同?该方法存在并且在两种情况下都具有相同的 __doc__ 属性

如何让 doctest 运行在导入模块的方法的 dostrings 中定义的测试?

解决方法

在 Python 中,模块由单个文件定义,在您的情况下,some_python_file 是一个模块,而 __init__ 是另一个。 Doctest 有一个检查,仅针对可从模块中找到的示例运行测试,这些示例可以在 here 中找到。

在实践中查看此行为的最佳方法是在调用 pdb.set_trace() 之前使用 PDBdoctest.testmod(some_module) 并进入内部以遵循逻辑。

乐: Doctest 根据 this comment 忽略导入的方法。如果您希望能够运行您的测试,您可能应该在您的模块中定义一个主函数并使用 python some_module.py 运行测试测试。您可以关注this example

要实现您的预​​期行为,您需要在 init 文件中手动创建一个 __test__ dict:

from .some_python_file import some_method

__test__ = {"some_method": some_method}

另见this link

,

不搜索导入模块的对象。

查看 which docstrings are examined 上的文档。

您可以将导入的函数注入模块的 __test__ 属性以测试导入的对象:

__test__ = {'some_method': some_method}