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删除空文件和空文件夹的方法
Jul 14 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 Python
Python迭代器定义与简单用法分析
Apr 30 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
Python Collatz序列实现过程解析
Oct 12 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
django admin 添加自定义链接方式
Mar 11 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
浅析Python 序列化与反序列化
Aug 05 Python
Python 列表反转显示的四种方法
Nov 16 Python
怎么用Python识别手势数字
Jun 07 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获取网站访客的所在地位置
2017/01/18 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
Python科学计算之Pandas详解
2017/01/15 Python
Python解决八皇后问题示例
2018/04/22 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Python 复平面绘图实例
2019/11/21 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
python 实现屏幕录制示例
2019/12/23 Python
Django 再谈一谈json序列化
2020/03/16 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
婚纱店策划方案
2014/05/22 职场文书
节水口号标语
2014/06/19 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
Python echarts实现数据可视化实例详解
2022/03/03 Python
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python