介绍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 GAE、Django导出Excel的方法
Nov 24 Python
python实现百度关键词排名查询
Mar 30 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
Python函数的周期性执行实现方法
Aug 13 Python
Python Json序列化与反序列化的示例
Jan 31 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
Python中有几个关键字
Jun 04 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
python编写扎金花小程序的实例代码
Feb 23 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 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的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
node.js入门教程
2014/06/01 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
python生成验证码图片代码分享
2016/01/28 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
python中re模块知识点总结
2021/01/17 Python
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
项目经理聘任书
2014/03/29 职场文书
创建青年文明号材料
2014/05/09 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
如何在python中实现ECDSA你知道吗
2021/11/23 Python
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android