python之doctest的用法

doctest是python自带的一个模块,你可以把它叫做“文档测试”(doctest)模块。

doctest的使用有两种方式:一个是嵌入到python源中。另一个是放到一个独立文件。

doctest的概念模型:

Module doctest - 一个在docstrings中运行示例的框架。

在最简单的使用中,结束每个要测试的模块M:

def _test():

导入doctest

doctest.testmod()

如果__name__ ==“__main__”:

_测试()

然后将该模块作为脚本运行将导致在

docstrings得到执行和验证:

python M.py

这将不会显示任何东西,除非一个例子失败,在这种情况下

失败的例子和失败的原因被打印到标准输出

(为什么不stderr?因为stderr是一个蹩脚的黑客<0.2.wink>),以及最后的

输出行是“测试失败”。

改为使用-v开关运行它:

python M.py -v

并将所有尝试的示例的详细报告一起打印到stdout

并在最后提供各种摘要。

您可以通过将“verbose = True”传递给testmod来强制详细模式,或禁止

它通过传递“verbose = False”。在任何一种情况下,sys.argv都不是

由testmod检查。

有多种其他方式可以运行doctests,包括集成

使用unittest框架,并支持运行非Python文本

包含doctests的文件。还有很多方法可以覆盖零件

doctest的默认行为

doctest潜入源码中:

例子:

用doctext测试一个Dict类:

#mydit.py

class Dict(dict):

  ,,,

  simple dict but also support access as x.y style.

  >>> d1 = Dict()

  >>> d1['x'] = 100

  >>> d1.x

  100

  >>> d1.y=200

  >>> d1['y']

  200

  >>> d2 = Dict(a=1,b=2,c='3')

  >>> d2.c

  '3'

  >>> d2['empty']

  Traceback (most recent call last):

    ...

  KeyError:'empty'

  >>> d2.empty

  Traceback(most recent call last):

    ...

  AttributeError: 'Dict' object has no attribute 'empty'

  '''

  def __init__(self,**kw):

    super(Dict,self).__init__(**kw)

  def _getattr_(self,key):

    try:

      return self[key]

    except KeyError:

      raise AttributeError(r"'Dict' object has no attribute '%s'"%key)

  def _setattr_(self,key,value):

    self[key] = value

if __name__=='_main_':

  import doctest

  docest.testmod()

doctest严格按照python交互式命令行的输入和输出来判断测试结果是否正确。只有测试异常的时候,可以用...表示中间的一大段烦人的输出。

运行python mydict.py:

$ python mydict.py

什么输出也没有。这说明我们编写的doctest运行都是正确的。

独立文件模式

如果不想或不能把测试用例写进源代码里,则还可以使用一个独立的文本文件来保存测试用例。

将doctest从测试用例:

def multiply(a, b):
    """
    >>> multiply(4, 3)
    12
    >>> multiply('a', 3)
    'aaa'
    """
    return a * b
if __name__=='__main__':
    import doctest
    doctest.testmod(verbose=True)


放到test_unnecessary_math.txt文件里。


1 这个例子展示如何将doctest用例放到一个独立的文件中。


2 '>>>'开头的行就是doctest测试用例。


3 不带'>>>'的行就是测试用例的输出。


4 如果实际运行的结果与期望的不一致,就标记为测试失败。


>>> from unnecessary_math import mutiply


>>> mutiply(3,4)


12


>>>mutiply('a',3)


'aaa'


注意: from 那一行也要以>>>开头


在系统的shell中执行:


python -m doctest -v test_unncessary_math.txt