用于类范围文档字符串测试的导入功能

时间:2015-11-03 04:33:56

标签: python documentation

我正在开发一个更大的项目,它有一个类,每个方法都有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还有其他行为,我想开始将它们作为我的测试套件运行,以确保它们保持最新状态

1 个答案:

答案 0 :(得分:0)

来自doctest man page,&#34; 默认情况下,每次doctest找到要测试的文档字符串时,它都使用M的全局&#34;的浅表副本。 / p>

您需要做的就是确保模块的全局变量中存在myfunc,可能是通过添加

from funcs import myfunc

到文件的顶部。