前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python基于Hypothesis测试库生成测试数据

Python基于Hypothesis测试库生成测试数据

作者头像
砸漏
发布2020-11-02 17:01:24
8240
发布2020-11-02 17:01:24
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

Hypothesis是Python的一个高级测试库。它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据。可以用更少的工作在代码中发现更多的bug。

安装

pip install hypothesis

如何设计测试数据

通过介绍也许你还不了解它是干嘛的,没关系!我们举个例子。

首先,我有一个需要测试的函数:

def add(a, b): “””实现加法运算””” return a + b

测试代码是这样的:

代码语言:javascript
复制
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() 函数,我必须设计足够多的 测试数据, 同样也需要很多条用例!

当然,为了测试足够多的数据,我们也可以将代码改称这样。

代码语言:javascript
复制
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登场了。

代码语言:javascript
复制
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或接口自动化测试中么?

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档