Python:为类使用文档测试

54 投票
4 回答
25005 浏览
提问于 2025-04-15 21:59

可以用Python的doctest这个概念来测试类吗,不仅仅是函数?

如果可以的话,我应该把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 个回答

7

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

至于把doctest放在类的文档字符串里还是放在构造函数里,这要看你具体想要记录什么内容。

如果文档字符串是对这个类的整体介绍和使用方法,那么我觉得放在类里更合适。

如果文档字符串专门讲的是如何创建这个类的实例,那就应该放在__init__方法里。

记住,doctest的主要目的是在文档中提供自我验证的示例代码,所以在我看来,文档的作用应该优先于测试的作用。

编辑:

在你上面的例子中,没有代码来执行doctest - 运行python test.py -v只会执行主要的python代码,这段代码只是定义了类。

你需要在文件的末尾添加这个:

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

另外,如果你使用的是Python 2.6或更高版本,可以用以下方式运行:

python -m doctest -v test.py
80

与其在每个方法里都创建对象,不如使用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()})
30

你缺少了在文件底部实际运行文档测试的代码:

class Test:
    <snip>

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

关于测试放在哪里:

  • 如果是测试整个类,我会把它们放在类的文档字符串里。
  • 如果是测试构造函数,我会把它们放在构造函数的文档字符串里。
  • 如果是测试某个方法(在这种情况下似乎是这样),我会把它们放在那个方法的文档字符串里。

撰写回答