介绍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回调函数的使用方法
Jan 23 Python
Python中logging模块的用法实例
Sep 29 Python
python分割文件的常用方法
Nov 01 Python
Python中functools模块的常用函数解析
Jun 30 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
Python List cmp()知识点总结
Feb 18 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
Python 判断时间是否在时间区间内的实例
May 16 Python
Python中常用的os操作汇总
Nov 05 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
PyQt 如何创建自定义QWidget
Mar 24 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
七款最流行的PHP本地服务器分享
2013/02/19 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
js常用代码段收集
2011/10/28 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
python算法学习之计数排序实例
2013/12/18 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
浅谈Python中的数据类型
2015/05/05 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
使用requests库制作Python爬虫
2018/03/25 Python
python opencv进行图像拼接
2020/03/27 Python
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
翻译学院毕业生自荐书
2014/02/02 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
卖车协议书范例
2014/09/16 职场文书
医院领导班子整改方案
2014/10/01 职场文书
指导老师鉴定意见
2015/06/05 职场文书
实习证明格式范文
2015/06/16 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js