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遍历数组的方法小结
Apr 30 Python
使用SAE部署Python运行环境的教程
May 05 Python
理解Python垃圾回收机制
Feb 12 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python取余运算符知识点详解
Jun 27 Python
HTML的form表单和django的form表单
Jul 25 Python
Django实现跨域请求过程详解
Jul 25 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
jQuery $.each的用法说明
2010/03/22 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
JQuery live函数
2010/12/24 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
python缩进区别分析
2014/02/15 Python
Python重新引入被覆盖的自带function
2014/07/16 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
Python中的全局变量如何理解
2020/06/04 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
电脑销售顾问自荐信
2014/01/29 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript
php去除数组中为0的元素的实例分析
2021/11/17 PHP
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL