介绍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实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
Python实现竖排打印传单手机号码易撕条
Mar 16 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
python daemon守护进程实现
Aug 27 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python中支持向量机SVM的使用方法详解
Dec 26 Python
python线程中同步锁详解
Apr 27 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 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
COM in PHP (winows only)
2006/10/09 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
如何基于python生成list的所有的子集
2019/11/11 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
洗煤厂厂长岗位职责
2014/01/03 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
英语教师个人总结
2015/02/09 职场文书
校园安全主题班会
2015/08/12 职场文书
导游词之张家口
2019/12/13 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
Python 如何解决稀疏矩阵运算
2021/05/26 Python
字节飞书面试promise.all实现示例
2022/06/16 Javascript