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模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
Python实现的概率分布运算操作示例
Aug 14 Python
zookeeper python接口实例详解
Jan 18 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python3中函数参数的四种简单用法
Jul 09 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
python tkinter模块的简单使用
Apr 07 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实现的简单网络硬盘
2015/07/29 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
php接口隔离原则实例分析
2019/11/11 PHP
jquery 学习笔记一
2010/04/07 Javascript
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
Python文件和流(实例讲解)
2017/09/12 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
对Python信号处理模块signal详解
2019/01/09 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
在python3中实现更新界面
2020/02/21 Python
python中def是做什么的
2020/06/10 Python
python全栈开发语法总结
2020/11/22 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
机械设计专业应届生求职信
2013/11/21 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
群众路线党课主持词
2014/04/01 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
湘江北去观后感
2015/06/15 职场文书
新教师教学工作总结
2015/08/14 职场文书
前端JavaScript大管家 package.json
2021/11/02 Javascript
Golang实现可重入锁的示例代码
2022/05/25 Golang