Python单元测试模块doctest的具体使用


Posted in Python onFebruary 10, 2020

开发高质量软件的过程中,我们经常会为每个函数编写测试,这样在开发过程中运行这些测试的时候就比较方便,doctest是一个python标准库自带的轻量单元测试工具,适合实现一些简单的单元测试。

doctest模块提供的这样的工具,用于扫描模块并验证程序文档字符串中嵌入的测试,在docstring中寻找到测试用例并执行,比较输出结果与期望值是否符合。

我们如何构造这些测试呢?很简单

在python的交互解释器中创建测试用例,并复制到docstring中

tip:doctest在docstring中寻找测试用例的时候,认为>>>是一个测试用例的开始,直到遇到空行或者下一个>>>,在两个测试用例之间有其他内容的话,会被doctest忽略(可以利用这个特性为测试用例编写一些注释)。

我先在我自己的项目下准备一个测试脚本quality_q.py:

def average(values):
  """Computes the arithmetic mean of a list of numbers.

  >>> print(average([20, 30, 70]))
  40.0
  """
  return sum(values) / len(values)


#
if __name__ == '__main__':
  import doctest
  doctest.testmod(verbose=True) # automatically validate the embedded tests
  # 那个verbose参数,如果设置为True则在执行测试的时候会输出详细信息。
  # 默认是False,表示运行测试时,只有失败的用例会输出详细信息,成功的测试用例不会输入任何信息。

启动测试的方法:

第一个是在__main__函数中调用了doctest.testmod()方法。
然后在交互解释器中执行运行脚本 python3 doctest_q.py

如果__main__函数有其他用途,不方便调用doctest.testmod()方法,那么可以用另外一种执行测试的方法:

在交互解释器中执行如下命令执行测试: python3 -m doctest doctest_q.py -v
这里 -m 表示引用一个模块,-v 等价于 verbose=True

因为我是在Pycharm中创建的文件,我就直接打开Pycharm的Terminal,然后在交互解释器中切换一下脚本目录,执行的上面说到的启动方式,(顺便复习一下os模块的常用操作)
ps:读者在测试自己的例子时只需注意一下自己的当前工作目录即可

看一下最后的结果:

➜ ForF python3
Python 3.7.3 (default, Mar 27 2019, 09:23:15)
[Clang 10.0.1 (clang-1001.0.46.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> import os

>>> os.getcwd()
'/Users/dengjiguang/PycharmProjects/ForF'
>>> os.chdir('/Users/dengjiguang/PycharmProjects/ForF'+'/python_sample/quality_control')

>>> os.system('python3 -m doctest doctest_q.py -v')
Trying:
  print(average([20, 30, 70]))
Expecting:
  40.0
ok
1 items had no tests:
  doctest_q
1 items passed all tests:
  1 tests in doctest_q.average
1 tests in 2 items.
1 passed and 0 failed.
Test passed.
0
>>>

os.getcwd():返回当前的工作目录
os.chdir(‘path'):切换工作目录
os.system(‘command'): 执行系统shell命令

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 Python
Python实现字符串格式化的方法小结
Feb 20 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
使用python为mysql实现restful接口
Jan 05 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
解决python线程卡死的问题
Feb 18 Python
详解如何减少python内存的消耗
Aug 09 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
Python urllib.request对象案例解析
May 11 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
简单了解django文件下载方式
Feb 10 #Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 #Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 #Python
解决tensorflow添加ptb库的问题
Feb 10 #Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 #Python
python如何实现单链表的反转
Feb 10 #Python
基于python求两个列表的并集.交集.差集
Feb 10 #Python
You might like
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
修改发贴的编辑功能
2007/03/07 Javascript
js正确获取元素样式详解
2009/08/07 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python双向链表实现实例代码
2013/11/21 Python
python素数筛选法浅析
2018/03/19 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
函授教育个人学习的自我评价
2013/12/31 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
授权委托书样本
2014/04/03 职场文书
给公司的建议书范文
2014/05/13 职场文书
建议书格式
2015/02/04 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
python中如何对多变量连续赋值
2021/06/03 Python