介绍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之Import 模块
Oct 13 Python
Python脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
Python MD5加密实例详解
Aug 02 Python
Python温度转换实例分析
Jan 17 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
python如何生成网页验证码
Jul 28 Python
pandas的排序和排名的具体使用
Jul 31 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
python 读写文件包含多种编码格式的解决方式
Dec 20 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
python学习笔记之多进程
Aug 06 Python
python实现简单遗传算法
Sep 18 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中反射的应用
2016/03/15 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
Python实现简单的语音识别系统
2017/12/13 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
opencv 阈值分割的具体使用
2020/07/08 Python
Python爬取网页信息的示例
2020/09/24 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
教师自我反思材料
2014/02/14 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
初中数学教学随笔
2015/08/15 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
再谈python_tkinter弹出对话框创建
2022/03/20 Python