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 open()文件处理使用介绍
Nov 30 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
Python3.6连接Oracle数据库的方法详解
May 18 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
python使用 zip 同时迭代多个序列示例
Jul 06 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
python中if及if-else如何使用
Jun 02 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python Selenium异常处理的实例分析
Feb 28 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 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版(4)
2006/10/09 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
php随机抽奖实例分析
2015/03/04 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
解析Python中的异常处理
2015/04/28 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
运动会800米加油稿
2014/02/22 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
vue实现简单数据双向绑定
2021/04/28 Vue.js
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js