介绍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操作日期和时间的方法
Mar 11 Python
python利用拉链法实现字典方法示例
Mar 25 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
python使用正则来处理各种匹配问题
Dec 22 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
pyinstaller还原python代码过程图解
Jan 08 Python
为什么是 Python -m
Jun 19 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 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 ajax 静态分页过程形式
2011/09/02 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
python的Template使用指南
2014/09/11 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
Python素数检测的方法
2015/05/11 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python从子线程中获得返回值的方法
2019/01/30 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
Django密码系统实现过程详解
2019/07/19 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Python如何进行时间处理
2020/08/06 Python
新大陆软件面试题
2016/11/24 面试题
DELPHI面试题研发笔试试卷
2015/11/08 面试题
中专自荐信
2013/10/13 职场文书
2014年医生工作总结
2014/11/21 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫