介绍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 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
浅析Python中的for 循环
Jun 09 Python
python append、extend与insert的区别
Oct 13 Python
python Flask实现restful api service
Dec 04 Python
Python中XlsxWriter模块简介与用法分析
Apr 24 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
Python集合操作方法详解
Feb 09 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
keras topN显示,自编写代码案例
Jul 03 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
PHP中实现crontab代码分享
2015/03/26 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
Python语言的12个基础知识点小结
2014/07/10 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
python反编译学习之字节码详解
2019/05/19 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
贝佳斯官方网站:Borghese
2020/05/08 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
工厂厂长的职责
2013/12/12 职场文书
音乐教学反思
2014/02/02 职场文书
开学寄语大全
2014/04/08 职场文书
书香家庭事迹材料
2014/05/09 职场文书
法人委托书的范本格式
2014/09/11 职场文书
2014年个人年终总结
2015/03/09 职场文书
实验室安全管理制度
2015/08/05 职场文书
2016大学军训心得体会
2016/01/11 职场文书
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android