Python:使用doctests进行类

Ada*_*tan 40 python doctest unit-testing

是否可以将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
Run Code Online (Sandbox Code Playgroud)

提前致谢,

亚当

Ari*_*Ari 62

您可以使用以下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()})
Run Code Online (Sandbox Code Playgroud)


Aar*_*paa 29

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

class Test:
    <snip>

if __name__ == "__main__":
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

至于测试的位置:

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

  • @Adam:如果您需要更复杂的测试,请使用unittest模块.doctest主要用于测试文档,而不是测试代码. (4认同)

Dav*_*rby 7

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

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

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

如果docstring具体是关于如何创建类的实例,那么它应该放在__init__方法中.

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

编辑:

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

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

if __name__ == "__main__":
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

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

python -m doctest -v test.py
Run Code Online (Sandbox Code Playgroud)