介绍Python中的文档测试模块

 更新时间:2015年04月28日 11:33:17   作者:廖雪峰  
这篇文章主要介绍了Python中的文档测试模块,代码基于Python2.x版本,需要的朋友可以参考下

如果你经常阅读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脚本实现邮件报警功能

    这篇文章主要介绍了基于Python脚本实现邮件报警功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python递归计算N!的方法

    python递归计算N!的方法

    这篇文章主要介绍了python递归计算N!的方法,涉及Python递归计算阶乘的技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • 用Python给图像算法做个简单应用界面

    用Python给图像算法做个简单应用界面

    这篇文章主要介绍了用Python给图像算法做个简单应用界面,帮助大家更好的理解和学习使用python开发gui,感兴趣的朋友可以了解下
    2021-05-05
  • Python3.5 Pandas模块之DataFrame用法实例分析

    Python3.5 Pandas模块之DataFrame用法实例分析

    这篇文章主要介绍了Python3.5 Pandas模块之DataFrame用法,结合实例形式详细分析了Python3.5中Pandas模块的DataFrame结构创建、读取、过滤、获取等相关操作技巧与注意事项,需要的朋友可以参考下
    2019-04-04
  • Python实现暴力匹配算法(字符串匹配)

    Python实现暴力匹配算法(字符串匹配)

    本文主要介绍了Python实现暴力匹配算法,其主要思想是逐个字符地比较文本串和模式串,从文本串的每个可能的起始位置开始,依次检查是否有匹配的子串,下面就来介绍 一下如何实现
    2023-09-09
  • Python爬虫设置代理IP的方法(爬虫技巧)

    Python爬虫设置代理IP的方法(爬虫技巧)

    这篇文章主要介绍了Python爬虫设置代理IP的方法(爬虫技巧),需要的朋友可以参考下
    2018-03-03
  • Vue中自定义指令的三个常用方法小结

    Vue中自定义指令的三个常用方法小结

    这篇文章主要为大家详细介绍了Vue中自定义指令的三个常用方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解一下
    2024-02-02
  • 利用Python统计Jira数据并可视化

    利用Python统计Jira数据并可视化

    目前公司使用 Jira 作为项目管理工具,在每一次迭代完成后的复盘会上,我们都需要针对本次迭代的 Bug 进行数据统计,以帮助管理层能更直观的了解研发的代码质量。本篇文章将介绍如何利用统计 Jira 数据,并进行可视化,需要的可以参考一下
    2022-07-07
  • python矩阵的转置和逆转实例

    python矩阵的转置和逆转实例

    今天小编就为大家分享一篇python矩阵的转置和逆转实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python性能分析工具Profile使用实例

    Python性能分析工具Profile使用实例

    这篇文章主要介绍了Python性能分析工具Profile使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论