介绍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解析html开发库pyquery使用方法
Feb 07 Python
使用python开发vim插件及心得分享
Nov 04 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
Python基于property实现类的特性操作示例
Jun 15 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
python安装scipy的方法步骤
Jun 26 Python
python爬虫添加请求头代码实例
Dec 28 Python
利用Python脚本实现自动刷网课
Feb 03 Python
Python计算IV值的示例讲解
Feb 28 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 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
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
python修改注册表终止360进程实例
2014/10/13 Python
进一步探究Python中的正则表达式
2015/04/28 Python
python简单实现基数排序算法
2015/05/16 Python
教你学会使用Python正则表达式
2017/09/07 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python hashlib加密实现代码
2019/10/17 Python
Python如何生成xml文件
2020/06/04 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
销售员个人求职的自我评价
2014/02/10 职场文书
机械工程师岗位职责
2014/06/16 职场文书
甜品店创业计划书
2014/09/21 职场文书
民用住房租房协议书
2014/10/29 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
彻底理解golang中什么是nil
2021/04/29 Golang
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
python正则表达式re.search()的基本使用教程
2021/05/21 Python
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python