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 实现读取一个excel多个sheet表并合并的方法
Feb 12 Python
Python提取频域特征知识点浅析
Mar 04 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python binascii 进制转换实例
Jun 12 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
python 实现批量图片识别并翻译
Nov 02 Python
Python实现一个论文下载器的过程
Jan 18 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
python将图片转为矢量图的方法步骤
Mar 30 Python
Python anaconda安装库命令详解
Oct 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使用正则表达式获取图片url的方法
2015/01/16 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
javascript实现日历效果
2019/06/17 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
自荐信的五个重要部分
2013/10/29 职场文书
小学生暑假感言
2014/02/06 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
答谢酒会主持词
2015/07/02 职场文书
领导欢送会主持词
2015/07/06 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript