问题描述
我有一个 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()
之前使用 PDB 和 doctest.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}