48

是否可以将 Python 的 doctest 概念用于类,而不仅仅是函数?

如果是这样,我应该将文档测试放在哪里 - 在类的文档字符串中,还是在构造函数的文档字符串中?

为了澄清,我正在寻找类似的东西:

class Test:
    """
    >>> a=Test(5)
    >>> a.multiply_by_2()
    10
    """
    def __init__(self, number):
        self._number=number

    def multiply_by_2(self):
        return self._number*2

提前致谢,

亚当

4

4 回答 4

74

您可以使用以下extraglobs参数,而不是在每个方法中实例化对象:

class Test:
    def multiply_by_2(self):
        """
        >>> t.multiply_by_2()
        10
        """
        return self._number*2

if __name__ == '__main__':
    import doctest
    doctest.testmod(extraglobs={'t': Test()})
于 2010-10-14T18:02:14.537 回答
30

您缺少在文件底部实际运行 doctests 的代码:

class Test:
    <snip>

if __name__ == "__main__":
    import doctest
    doctest.testmod()

至于在哪里放置测试:

  • 如果它是对整个班级进行测试,我会将它们放在班级的文档字符串中。
  • 如果它正在测试构造函数,我会将它们放在构造函数的文档字符串中。
  • 如果它正在测试一种方法(在这种情况下似乎是这样),我实际上会将它们放在该方法的文档字符串中。
于 2010-04-25T12:45:27.850 回答
7

doctest 模块在文件中查找任何文档字符串并执行其中的任何嵌入代码,因此可以将 doctest 用于类。

至于将文档测试放在类的文档字符串还是构造函数中是否更好,我认为这取决于您正在记录的内容。

如果文档字符串给出了类的一般概述以及如何使用它,那么我认为最好将它放在类中。

如果文档字符串专门关于如何创建类的实例,那么它应该放在__init__方法中。

请记住,doctests 的目的主要是在文档中包含自我验证的示例代码,因此恕我直言,文档方面应该优先于测试方面。

编辑:

在上面的示例中,没有执行 doctest 的代码 - runningpython test.py -v将执行仅定义类的主要 python 代码。

您需要将其添加到文件的末尾:

if __name__ == "__main__":
    import doctest
    doctest.testmod()

或者,如果您使用的是 Python 2.6 或更高版本,请使用以下命令运行它:

python -m doctest -v test.py
于 2010-04-25T12:36:55.507 回答
0

我认为 doctest 模块文档没有解释如何处理这个问题,它应该更好地解释要做什么。

我发现用于测试不需要实例数据但可能需要访问类数据的类方法的模式是传入 Class 对象而不是实例。

class Test:
    """
    >>> Test.multiply_by_3(Test,2)
    6
    """
    def __init__(self, number):
        self._number=number

    _THREE = 3
    def multiply_by_3(self, x):
        return x*self._THREE

if __name__ == "__main__":
    import doctest
    doctest.testmod()
于 2018-05-14T01:42:17.640 回答