一、什麼是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)