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文件及目录操作实例详解
Jun 04 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
Flask之flask-session的具体使用
Jul 26 Python
Python提取频域特征知识点浅析
Mar 04 Python
python浪漫表白源码
Apr 05 Python
Python实现Selenium自动化Page模式
Jul 14 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
Python logging模块写入中文出现乱码
May 21 Python
python基于opencv 实现图像时钟
Jan 04 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 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
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
详解jQuery中的deferred对象的使用(一)
2016/05/27 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
Python线程详解
2015/06/24 Python
Python 内置函数complex详解
2016/10/23 Python
python 使用get_argument获取url query参数
2017/04/28 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
Django配置跨域并开发测试接口
2020/11/04 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
学校通报表扬范文
2015/05/04 职场文书
《西门豹》教学反思
2016/02/23 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
python批量创建变量并赋值操作
2021/06/03 Python