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制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
对pandas replace函数的使用方法小结
May 18 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
python实现连连看游戏
Feb 14 Python
Python selenium自动化测试模型图解
Apr 15 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
python安装sklearn模块的方法详解
Nov 28 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/02/22 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
js模糊查询实例分享
2016/12/26 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
js实现select下拉框选择
2020/01/11 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
Python中使用中文的方法
2011/02/19 Python
Python的动态重新封装的教程
2015/04/11 Python
Python中几个比较常见的名词解释
2015/07/04 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
python 文件查找及内容匹配方法
2018/10/25 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
父亲八十大寿答谢词
2014/01/23 职场文书
电气工程自动化求职信
2014/03/14 职场文书
总经理任命书范本
2014/06/05 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python