使用Hypothesis生成測試數據

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章