我正在开发一个更大的项目,它有一个类,每个方法都有docstrings测试。每个docstring都包含一些示例/测试。文档字符串经常在另一个模块中使用一个函数,我想导入一次并在每个文档字符串函数测试中使用它。
例如,如果这是tests.py
class A(object):
def test1(self):
"""
>>> myfunc()
1
"""
pass
def test2(self):
"""
>>> myfunc()
1
"""
pass
这是funcs.py
from tests import A
# Do stuff with A
def myfunc():
return 1
我想避免将上述代码修改为:
class A(object):
def test1(self):
"""
>>> from funcs import myfunc
>>> myfunc()
1
"""
pass
def test2(self):
"""
>>> from funcs import myfunc
>>> myfunc()
1
"""
pass
而是执行类级别docstring模块导入。我也不能直接在模块中导入函数,因为在我的情况下会产生循环依赖。
使用具有此错误输出的python -m doctest tests.py
调用Doctests:
File "tests.py", line 4, in tests.A.test
Failed example:
myfunc()
Exception raised:
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1315, in __run
compileflags, 1) in test.globs
File "<doctest tests.A.test[0]>", line 1, in <module>
myfunc()
NameError: name 'myfunc' is not defined
********************************************
1 items had failures:
1 of 1 in tests.A.test
***Test Failed*** 1 failures.
使用具有导入功能的测试代码成功。
对于想知道我为什么要这样做的人,我的真实世界代码是https://github.com/EntilZha/ScalaFunctional/blob/master/functional/pipeline.py。我要导入的函数是seq
,因为它是类Sequence
的入口点别名。我更喜欢在文档字符串中使用seq
,因为非常重要的是它们充当文档示例,seq
还有其他行为,我想开始将它们作为我的测试套件运行,以确保它们保持最新状态
答案 0 :(得分:0)
来自doctest
man page,&#34; 默认情况下,每次doctest找到要测试的文档字符串时,它都使用M的全局&#34;的浅表副本。 / p>
您需要做的就是确保模块的全局变量中存在myfunc
,可能是通过添加
from funcs import myfunc
到文件的顶部。