Python基于Hypothesis测试库生成测试数据


Posted in Python onApril 29, 2020

Hypothesis是Python的一个高级测试库。它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据。可以用更少的工作在代码中发现更多的bug。

安装

pip install hypothesis

如何设计测试数据

通过介绍也许你还不了解它是干嘛的,没关系!我们举个例子。

首先,我有一个需要测试的函数:

def add(a, b):
"""实现加法运算"""
return a + b

测试代码是这样的:

import unittest
class AddTest(unittest.TestCase):
  def test_case1(self):
    c = add(1, 2)
    self.assertEqual(c, 3)
  def test_case2(self):
    c = add(0, 2)
    self.assertEqual(c, 2)
  def test_case3(self):
    c = add(-2, 2)
    self.assertEqual(c, 0)
if __name__ == '__main__':
  unittest.main()

为了更全面的验证的 add() 函数,我必须设计足够多的 测试数据, 同样也需要很多条用例!

当然,为了测试足够多的数据,我们也可以将代码改称这样。

import unittest
from random import randint
class AddTest(unittest.TestCase):
  def test_case(self):
    for i in range(10):
      a = randint(-32768, 32767)
      b = randint(-32768, 32767)
      print("a->", a)
      print("b->", b)
      c1 = a + b
      c2 = add(a, b)
      self.assertEqual(c1, c2)
if __name__ == '__main__':
  unittest.main()

通过调用 randint() 函数生成随机数。循环10次(也可以是100次,1000次),用更少的代码做更多的测试,测试的数据越多,发现bug的可能性越大。

测试结果如下:

> python test_hypothesis_demo.py

a-> 11503
b-> -784
a-> -31548
b-> 13057
a-> 22033
b-> 3618
a-> -32249
b-> 28025
a-> -15429
b-> 31055
a-> 16095
b-> 13445
a-> -31536
b-> 14606
a-> 18655
b-> -18039
a-> 17923
b-> -12079
a-> -9256
b-> -26440
.
------------------------
Ran 1 test in 0.002s

OK

用 hypothesis生成测试数据

上面的测试数据很难随机到 边界值,除非我手动设计数据,而且用for循环也不是太好的设计。是时候让hypothesis登场了。

import unittest
from hypothesis import given, settings
import hypothesis.strategies as st
class AddTest(unittest.TestCase):

  @settings(max_examples=10)
  @given(a=st.integers(), b=st.integers())
  def test_case(self, a, b):
    print("a->", a)
    print("b->", b)
    c1 = a + b
    c2 = add(a, b)
    self.assertEqual(c1, c2)
if __name__ == '__main__':
  unittest.main()

通过@given() 装饰测试用例,调用strategies 模块下面的 integers() 方法生成随机的测试数。在@setting()装饰器中通过max_examples用来控制随机数的个数。

运行结果如下:

> python test_hypothesis_demo.py

a-> 0
b-> 0
a-> 5980
b-> -3607224505277606703
a-> 324106882
b-> 23975
a-> 23272
b-> 4917
a-> 107
b-> -155
a-> -4500
b-> -8303
a-> 2683
b-> 4384
a-> 27
b-> -81
a-> -122472823694675410551869872440384533757
b-> -89
a-> 19075
b-> 4362
.
-------------------------------------------------
Ran 1 test in 0.032s

hypothesis 生成的数据会更具有 测试价值,对吧? hypothesis 还可以生成更多类型的测试数据。例如 email格式和text格式。

email-> 0@A.com
text->
email-> ^H@R70-s0Xke.Sb-UBn08.VzT--dz000I0o00r00s--EJY.e.Ov.aRaMcO text-> -
email-> 6a#@T.HKt
text-> ↕
email-> '/YAw/jnIZ!0fS+A@E7UJ.expErt
text-> +�
email-> *xh*-#t5$0-L8O&r10XnXU-**+e%0xy-@k.O.e.lEase
text-> #�����/���+
�)�▲�
email-> 2U!N0+|*%~@T.q-NX-0-0gWl.x.Lv
text->
email-> &i/o!F*@xuW--03.p00-t0Y-0Z0.MW.K-000-n-sB0rR-0L.Y.y2u.NXptL0bgG-0U.XN--FLw351E
text-> �0▲-���
email-> oK*-@p.ZiP
text-> ☺
email-> /@mOL.Y-Q.j.p.d-3Mzi.i.Utv-M.yachts
text-> (
email-> 4ql$y2%N4h@c.veRSIcheruNG
text->

这些数据看上去就具有很高的测试价值。好吧!测试一定明白我在说什么。

问题来了,我们可以将 hypothesis 生成的数据应用到 Web或接口自动化测试中么?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
Python ConfigParser模块的使用示例
Oct 12 Python
python tkinter实现连连看游戏
Nov 16 Python
Python APScheduler执行使用方法详解
Dec 10 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
python 安全地删除列表元素的方法
Mar 16 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 #Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 #Python
Django分组聚合查询实例分享
Apr 29 #Python
python中sympy库求常微分方程的用法
Apr 28 #Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 #Python
Python startswith()和endswith() 方法原理解析
Apr 28 #Python
Python如何将函数值赋给变量
Apr 28 #Python
You might like
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PHP 裁剪图片
2021/03/09 PHP
Jquery插件写法笔记整理
2012/09/06 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
python文件和文件夹复制函数
2020/02/07 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
电子商务个人自荐信
2013/12/12 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
教师读书活动总结
2014/05/07 职场文书
学习退步检讨书
2014/09/28 职场文书
党员示范岗材料
2014/12/19 职场文书
个人求职信格式范文
2015/03/20 职场文书
医院病假条范文
2015/08/17 职场文书
决心书格式范文
2015/09/23 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书