介绍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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
python语言使用技巧分享
May 31 Python
Python MD5加密实例详解
Aug 02 Python
python如何在循环引用中管理内存
Mar 20 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
python实现各种插值法(数值分析)
Jul 30 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
将数据集制作成VOC数据集格式的实例
Feb 17 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
基于python实现模拟数据结构模型
Jun 12 Python
python matlab库简单用法讲解
Dec 31 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通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
使用requests库制作Python爬虫
2018/03/25 Python
Pytorch之Variable的用法
2019/12/31 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
银行介绍信范文
2014/01/10 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
使用javascript解析二维码的三种方式
2021/11/11 Javascript
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏