介绍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 图片验证码代码
Dec 07 Python
python使用cookie库操保存cookie详解
Mar 03 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Flask框架各种常见装饰器示例
Jul 17 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
解决python3 安装不了PIL的问题
Aug 16 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python正则表达式re.search()的基本使用教程
May 21 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
PHP学习之PHP变量
2006/10/09 PHP
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
Python采用Django开发自己的博客系统
2020/09/29 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
附答案的Java面试题
2012/11/19 面试题
毕业寄语大全
2014/04/09 职场文书
投资协议书范本
2014/04/21 职场文书
供货协议书
2014/04/22 职场文书
大学生演讲稿
2014/04/25 职场文书
汽车转让协议书范本
2014/12/07 职场文书
2015年酒店工作总结
2015/04/28 职场文书