Python:为类使用文档测试
可以用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()
关于测试放在哪里:
- 如果是测试整个类,我会把它们放在类的文档字符串里。
- 如果是测试构造函数,我会把它们放在构造函数的文档字符串里。
- 如果是测试某个方法(在这种情况下似乎是这样),我会把它们放在那个方法的文档字符串里。