很浅浅的谈谈 python doctest

 
  
  
  
  
  
  
  
  

unittest的使用方法和Junit非常相似,利用python的元编程,使用定义unittest.TestCase的子类的形式来书写TestCase。由于Junit风格的unittest套件非常流行,使用起来基本也是大同小异(但是,实现上因为具体的语言会有差异),这里就不多说了。

doctest是非常"pythonic"的(尽管个人认为"pythonic"的概念不是非常清晰),doctest使用Python object的__doc__来记录对应module、class、method测试的测试用例。而最微妙的是,doctest的书写形式就是大家在python CLI中交互执行程序时输入输出的形式~

例如:

#in file m.py

def  fun(arg1):

    print arg1

对于这样一个method,在python CLI下交互执行的输入输出大概是:

$ python m.py

>>> fun(1)              :这是输入

1                               :这是输出

...

我们可以使用doctest来写一个TestCase,就是直接把上面的执行写进fun的__doc__里面

def  fun(arg1):

     """TestCase for fun

     >>> fun(1)

     1

     """

     print arg1

这就是一个最简单的doctest用例,从"TestCase for fun后面到doc结束的部分就是大家在python CLI 中交互执行的输入输出。

执行的这个用例的代码可以这样写:(和上面的fun放在同一个.py文件中,例如m.py)

if __name__ == "__main__":

       import doctest

      doctest.testmod( )

然后输入命令:

$python m.py

(这个命令会执行m.py这个module里面所有的doctest)

写在doc里面以>>> 开始的代码会被执行,并检查执行的输出,例如我们的例子中:

"""

...

>>> fun(1)

1

"""

当中的fun(1)会被执行,而执行的返回值会用来于1作比较,等于1则TestCase通过,否则是就这个TestCase没过。

doctest几乎支持你可以在Python CLI下敲的一切。只要格式正确,你在doctest中写method、写class、写metaclass都可以......包括你用pdb调试时的输入输出也可以.......

我知道,看到这里大家会有一种:”何不把我在CLI调试时的东西直接贴进去当用例?“的冲动......程序员都很懒,不管优秀不优秀~ 事实上Python非常鼓励大家这样做的。既然大家在调试时总要是在CLI上敲来敲去,而你敲来敲去的那段代码又真的可以定位错误,那么为什么不把它写成用例?而且一切真的简单到就是复制粘贴而已。对于单元测试把测试用例和代码放在一起,对于测试和修改都是有好处的。

最美妙的是:你的dotest还是可以当doc来使用的,只要你的编排足够清晰,可以轻易看出哪些是说明,那些是用例。我想当你在看一个不熟悉的method(不管它是不是你自己写的,有些时候......you know~)的doc时,那些包含"调用->返回"的例子绝对会让你觉得很有用(其实很多时候,我们仅仅是想知道怎么调用而已......)。很多不善于写doc的朋友应该会很喜欢这个feature的。

当然,我们应该保证写在doctest中的用例是足够”短小精悍“的(尽管python.org说”A good example can often be worth many words“但我觉得尽量短些比较好),一来写那么长的交互会很累(就算复制粘贴也至少要在python CLI敲一次....我很懒...),二来doctest也还是doc,看那么长的东西也很累的好伐...(我真的很懒)。”...详细的测试过程还是用unittest吧“,这是我写了一天doctest的感觉

你可能感兴趣的:(很浅浅的谈谈 python doctest)