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复制文件代码实现
Dec 23 Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
Python中的pass语句使用方法讲解
May 14 Python
对python中的pop函数和append函数详解
May 04 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
python3实现域名查询和whois查询功能
Jun 21 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
python 进程池pool使用详解
Oct 15 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 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+javascript模拟Matrix画面
2006/10/09 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
python实现红包裂变算法
2016/02/16 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
MySQL学习必备条件查询数据
2022/03/25 MySQL