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处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python作用域用法实例详解
Mar 15 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
利用python如何处理nc数据详解
May 23 Python
python实现远程控制电脑
May 23 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Python终端输出彩色字符方法详解
Feb 11 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
python可以用哪些数据库
Jun 22 Python
python缺失值的解决方法总结
Jun 09 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判断类是否存在函数class_exists用法分析
2014/11/14 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
公务员年总结的自我评价
2013/10/25 职场文书
2014年三万活动总结
2014/04/26 职场文书
常务副总经理任命书
2014/06/05 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
先进工作者推荐材料
2014/12/23 职场文书
团员年度个人总结
2015/02/26 职场文书
污染环境建议书
2015/09/14 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python