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 爬虫出现403禁止访问错误详解
Mar 11 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python 画函数曲线示例
Dec 04 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 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实现多张图片上传加水印技巧
2013/04/18 PHP
解析php常用image图像函数集
2013/06/24 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
chrome原生方法之数组
2011/11/30 Javascript
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
python套接字流重定向实例汇总
2016/03/03 Python
python2.7到3.x迁移指南
2018/02/01 Python
python实现键盘输入的实操方法
2019/07/16 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
J2EE模式面试题
2016/10/11 面试题
高中生自我评价个人范文
2013/11/09 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
面料业务员岗位职责
2013/12/26 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
岗位廉政承诺书
2014/03/27 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
幼儿园课题方案
2014/06/09 职场文书
六一亲子活动总结
2014/07/01 职场文书
学校交通安全责任书
2014/08/25 职场文书
市场部岗位职责范本
2015/04/15 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书