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 或接口自动化测试中么?
来源: https://www.cnblogs.com/fnng/p/11537891.html