Python:使用doctests进行类

时间:2010-04-25 12:24:25

标签: python unit-testing doctest

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

如果是这样,我应该在哪里放置doctests - 在类'docstring,或在构造函数的docstring?

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

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 个答案:

答案 0 :(得分:57)

您可以使用 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()})

答案 1 :(得分:26)

您错过了在文件底部实际运行doctests的代码:

class Test:
    <snip>

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

至于测试的位置:

  • 如果它正在测试整个类,我会将它们放在类'docstring中。
  • 如果它正在测试构造函数,我会将它们放在构造函数的docstring中。
  • 如果它正在测试一个方法(就像在这种情况下似乎),我实际上将它们放在该方法的docstring中。

答案 2 :(得分:7)

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

至于是否更好地将doctests放在类的docstring或构造函数中,我认为这取决于你正在记录什么。

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

如果docstring具体是关于如何创建类的实例,那么它应该采用__init__方法。

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

修改

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

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

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

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

python -m doctest -v test.py

答案 3 :(得分: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()