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内置数据类型之列表操作
Nov 12 Python
Python实现京东秒杀功能代码
May 16 Python
python字典的setdefault的巧妙用法
Aug 07 Python
python实现同一局域网下传输图片
Mar 20 Python
django ORM之values和annotate使用详解
May 19 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
解决virtualenv -p python3 venv报错的问题
Feb 05 Python
Python基础之元编程知识总结
May 23 Python
关于Python中进度条的六个实用技巧分享
Apr 05 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 Python
python解析json数据
Apr 29 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 Smarty date_format [格式化时间日期]
2010/03/15 PHP
关于svn冲突的解决方法
2013/06/21 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
解决Django连接db遇到的问题
2019/08/29 Python
Python callable内置函数原理解析
2020/03/05 Python
python脚本定时发送邮件
2020/12/22 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
班组长安全职责
2014/01/05 职场文书
求职毕业生自荐书
2014/02/08 职场文书
奠基仪式主持词
2014/03/20 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
大学生工作自荐书
2014/06/16 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
2014年村委会工作总结
2014/11/24 职场文书
品质保证书格式
2015/02/28 职场文书
中学生自我评价2015
2015/03/03 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
对讲机知识
2022/04/07 无线电