一、什么是Hypothesis
Hypothesis 是python的一个高级测试库,它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试呼叫,可以用更少的工作在代码中发现更多的bug。
二、环境准备
安装hypothesis包
py -3 -m pip install hypothesis
三、如何设计测试数据
待测试函数:
def add(a,b):
"""实现加法运算"""
return a+b
3.1 传统测试方法
import unittest
from test import add
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()
不足:需要设计足够多的测试case
3.2 优化版:使用randint()函数生成随机数
import unittest
from test import add
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,b)
c1=a+b
c2=add(a,b)
self.assertEqual(c1,c2)
if __name__=="__main__":
unittest.main()
好处:用更少的代码做更多的测试,循环次数越多,发现Bug概率越大
不足:测试数据很难随机到边界值
3.3 用hypothesis生成测试数据
import unittest
from test import add
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,b)
c1=a+b
c2=add(a,b)
self.assertEqual(c1,c2)
if __name__=="__main__":
unittest.main()
注释:
通过@given()装饰测试用例,调用strategies模块下面的integers()方法生成随机的测试数。在@setting()装饰器中通过max_examples用来控制随机数的个数。
3.4 生成更多类型的测试数据
import unittest
from hypothesis import given,settings
import hypothesis.strategies as st
class AddTest(unittest.TestCase):
@settings(max_examples=10)
@given(a=st.text(),b=st.emails())
#生成text格式和email格式
def test_case(self,a,b):
print(a,b)
if __name__=="__main__":
unittest.main()
更多的数据类型:
import hypothesis
dir(hypothesis.strategies)