介绍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 13 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
pyenv命令管理多个Python版本
Mar 26 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
TensorFlow打印tensor值的实现方法
Jul 27 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
简单了解Python读取大文件代码实例
Dec 18 Python
Python数组并集交集补集代码实例
Feb 18 Python
sklearn+python:线性回归案例
Feb 24 Python
快速了解Python开发环境Spyder
Jun 29 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
3种平台下安装php4经验点滴
2006/10/09 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
js实现日期级联效果
2014/01/23 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
vue-router单页面路由
2017/06/17 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
EntityManager都有哪些方法
2013/11/01 面试题
日语专业毕业生求职信
2013/12/04 职场文书
租房合同协议书
2014/04/09 职场文书
安全协议书
2014/04/23 职场文书
学习计划书怎么写
2014/09/15 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
法定授权委托证明书
2015/06/18 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
MySQL基础(一)
2021/04/05 MySQL
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
Python 语言实现六大查找算法
2021/06/30 Python