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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Python实现批量下载图片的方法
Jul 08 Python
详解Python中的文件操作
Aug 28 Python
详解python基础之while循环及if判断
Aug 24 Python
python中的随机函数小结
Jan 27 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
Python序列对象与String类型内置方法详解
Oct 22 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
一个目录遍历函数
2006/10/09 PHP
PHP MSSQL 存储过程的方法
2008/12/24 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python中的with...as用法介绍
2015/05/28 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
python 实现超级玛丽游戏
2020/11/25 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
高中生职业规划范文
2014/03/09 职场文书
保护环境演讲稿
2014/05/10 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
django中websocket的具体使用
2022/01/22 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis