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调用新浪微博API项目实践
Jul 28 Python
Python极简代码实现杨辉三角示例代码
Nov 15 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
python贪吃蛇游戏代码
Apr 18 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
python生成大写32位uuid代码
Mar 03 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
用 Python 制作地球仪的方法
Apr 24 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
Python importlib模块重载使用方法详解
Oct 13 Python
Django配置跨域并开发测试接口
Nov 04 Python
手把手教你实现PyTorch的MNIST数据集
Jun 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
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
python使用wxpython开发简单记事本的方法
2015/05/20 Python
python的keyword模块用法实例分析
2015/06/30 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
python文件写入write()的操作
2019/05/14 Python
python aiohttp的使用详解
2019/06/20 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python安装OpenCV的示例代码
2020/03/05 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
python 一维二维插值实例
2020/04/22 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
软件测试面试题
2015/10/21 面试题
平面设计自荐信
2013/10/07 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
师德师风演讲稿
2014/05/05 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python