介绍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深入学习之特殊方法与多范式
Aug 31 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
利用python批量检查网站的可用性
Sep 09 Python
老生常谈python之鸭子类和多态
Jun 13 Python
python之消除前缀重命名的方法
Oct 21 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
Python如何根据时间序列数据作图
May 12 Python
使用pth文件添加Python环境变量方式
May 26 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
小程序实现投票进度条
2019/11/20 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python:socket传输大文件示例
2017/01/18 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
python 多个参数不为空校验方法
2019/02/14 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
采购部长岗位职责
2014/06/13 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
银行培训心得体会范文
2016/01/09 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
mysql事务对效率的影响分析总结
2021/10/24 MySQL