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中的数字类型及基本的数学计算
Mar 11 Python
详解python中的文件与目录操作
Jul 11 Python
python字典快速保存于读取的方法
Mar 23 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
PHP统计代码行数的小代码
Sep 19 Python
Python 定义只读属性的实现方式
Mar 05 Python
Python lambda表达式原理及用法解析
Aug 18 Python
Python基于unittest实现测试用例执行
Nov 25 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 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自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
用ADODB.Stream转换
2007/01/22 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
速记Python布尔值
2017/11/09 Python
Python中Threading用法详解
2017/12/27 Python
python画图系列之个性化显示x轴区段文字的实例
2018/12/13 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
python 如何快速复制序列
2020/09/07 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
小学英语教学反思
2014/01/30 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
个人思想政治总结
2015/03/05 职场文书
运动会宣传稿100字
2015/07/23 职场文书
初三语文教学反思
2016/03/03 职场文书
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL