介绍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之深入变量和引用对象
Sep 24 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
Python 多核并行计算的示例代码
Nov 07 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
Feb 26 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
Django设置Postgresql的操作
May 14 Python
史上最详细的Python打包成exe文件教程
Jan 17 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 常用类整理
2009/12/23 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
js电话号码验证方法
2015/09/28 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
详解python中@的用法
2019/03/27 Python
python如何构建mock接口服务
2021/01/28 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
企划主管岗位职责
2013/12/12 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
法律七进实施方案
2014/03/15 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
特岗教师个人总结
2015/02/10 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
法人身份证明书
2015/06/18 职场文书
欠款证明
2015/06/24 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android