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 相关文章推荐
深入讲解Java编程中类的生命周期
Feb 05 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
python之拟合的实现
Jul 19 Python
python 实现多线程下载视频的代码
Nov 15 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
python字典key不能是可以是啥类型
Aug 04 Python
python playwrigh框架入门安装使用
Jul 23 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字符串处理的10个简单方法
2010/06/30 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
php compact 通过变量创建数组
2016/11/15 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
python如何写try语句
2020/07/14 Python
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
人力资源主管职责范本
2014/03/05 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
单位委托书格式范本
2014/09/29 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS