介绍Python中的文档测试模块


Posted in Python onApril 28, 2015

如果你经常阅读Python的官方文档,可以看到很多文档都有示例代码。比如re模块就带了很多示例代码:

>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'

可以把这些示例代码在Python的交互式环境下输入并执行,结果与文档中的示例代码显示的一致。

这些代码与其他说明可以写在注释中,然后,由一些工具来自动生成文档。既然这些代码本身就可以粘贴出来直接运行,那么,可不可以自动执行写在注释中的这些代码呢?

答案是肯定的。

当我们编写注释时,如果写上这样的注释:

def abs(n):
  '''
  Function to get absolute value of number.

  Example:

  >>> abs(1)
  1
  >>> abs(-1)
  1
  >>> abs(0)
  0
  '''
  return n if n >= 0 else (-n)

无疑更明确地告诉函数的调用者该函数的期望输入和输出。

并且,Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试。

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

让我们用doctest来测试上次编写的Dict类:

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
  doctest.testmod()

运行python mydict.py:

$ python mydict.py

什么输出也没有。这说明我们编写的doctest运行都是正确的。如果程序有问题,比如把__getattr__()方法注释掉,再运行就会报错:

$ python mydict.py
**********************************************************************
File "mydict.py", line 7, in __main__.Dict
Failed example:
  d1.x
Exception raised:
  Traceback (most recent call last):
   ...
  AttributeError: 'Dict' object has no attribute 'x'
**********************************************************************
File "mydict.py", line 13, in __main__.Dict
Failed example:
  d2.c
Exception raised:
  Traceback (most recent call last):
   ... 
  AttributeError: 'Dict' object has no attribute 'c'
**********************************************************************

注意到最后两行代码。当模块正常导入时,doctest不会被执行。只有在命令行运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。
小结

doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctest。

Python 相关文章推荐
Python pymongo模块用法示例
Mar 31 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
python实现爬山算法的思路详解
Apr 09 Python
Python:slice与indices的用法
Nov 25 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Python 中由 yield 实现异步操作
May 04 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
Python之字典对象的几种创建方法
Sep 30 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
Django中几种重定向方法
Apr 28 #Python
详解Python的单元测试
Apr 28 #Python
Python xlrd读取excel日期类型的2种方法
Apr 28 #Python
Python发送email的3种方法
Apr 28 #Python
Python中使用partial改变方法默认参数实例
Apr 28 #Python
调试Python程序代码的几种方法总结
Apr 28 #Python
解析Python中的异常处理
Apr 28 #Python
You might like
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php eval函数用法总结
2012/10/31 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
JavaScript的目的分析
2007/01/05 Javascript
禁止F5等快捷键的JS代码
2007/03/06 Javascript
List the Codec Files on a Computer
2007/06/11 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Python @property及getter setter原理详解
2020/03/31 Python
python tqdm库的使用
2020/11/30 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
实验教师岗位职责
2014/02/13 职场文书
滴水洞导游词
2015/02/10 职场文书