基於屬性的測試 會產生大量的、隨機的參數,特別適合爲單元測試和接口測試生成測試用例
儘管早在2006年haskell語言就有了QuickCheck
來進行”基於屬性的測試“,但是目前來看這依然是一個比較小衆的領域,參考資料有限,本文如有不足,歡迎指正。
1. 基於表的測試
在過去的測試實踐中,執行測試時通常需要明確的內容(Value):
條件
輸入
結果
這些內容可以通過”判定樹“或者”判斷表“來表示,然後測試的執行過程變成了這樣
“給定輸入 X,我們期望 Y”
可以稱爲 基於表的測試
在最初,這給了我們測試的方向,但是缺點也非常明顯:
你要足夠多的"X->Y" 才能可能覆蓋到隱蔽的bug。
這裏請大家回答幾個問題:
你是否已經爲每一個測試編寫了足夠多的用例,以至於你十分確定真的不需要再增加用例了
這麼多的用例,你編寫的是否開心?是否高效?是否願意繼續堅持?
如果以上問題的答案不是yes,那麼基於屬性的測試 就是你需要掌握的東西!
2. 基於屬性的測試
基於屬性的測試和基於表的測試,最大的區別可以這樣描述:
“給定輸入 X值,我們期望 Y值”
vs
“給定輸入 X類,我們期望 Y類”
於是利用工具生成大量的X類數據,進行測試,並驗證結果是否Y類。
值得注意的是:
關注輸入的類型,而不是輸入的值
根據類型自動生成大量的、隨機的輸入值
換言之,它在自動的生成測試用例 ,雖然輸入值是隨機的,但是值得類型符合規範要求
3. 如何進行基於屬性的測試
在不同的語言中有不同的工具來實現,比如:
haskell中的QuickCheck
、
java中的quicktheories
python中的hypothesis
本文以python爲例進行演示:
假設有add函數,接收兩個類型整數參數,並返回它們的相加結果
首先寫出一個簡單的測試用例
正如前面所說,一個這樣的用例,根本沒信心覆蓋全部的場景,例如:
所以接下來怎麼辦?
改爲基於屬性的測試
執行結果
a=0,b=0, c=0 a=0,b=0, c=0 a=0,b=0, c=0 a=16926,b=11053, c=27979 a=0,b=0, c=0 a=0,b=0, c=0 a=21010,b=-2732672789497425072, c=-2732672789497404062 a=0,b=0, c=0 a=14554,b=-15956, c=-1402 a=15597,b=0, c=15597 a=15597,b=13, c=15610 a=15597,b=0, c=15597 a=15597,b=15597, c=31194 a=28965,b=-36, c=28929 a=113,b=-36, c=77 a=28929,b=-36, c=28893 a=28929,b=9356, c=38285 a=9356,b=9356, c=18712 a=10278,b=-62, c=10216 a=-62,b=-62, c=-124 a=1625,b=-68244995710046113596363052355575247332, c=-68244995710046113596363052355575245707 a=1625,b=-13143, c=-11518 a=1625,b=1625, c=3250 a=-1940,b=-31868, c=-33808 a=-7,b=1, c=-6 a=-1,b=0, c=-1 a=-1,b=0, c=-1 a=13,b=7245, c=7258 a=13,b=13, c=26 a=-99,b=-18, c=-117 a=-30172,b=66, c=-30106 a=-30172,b=-16940, c=-47112 a=-16940,b=-16940, c=-33880 a=-1233214851,b=-5152, c=-1233220003 a=-5152,b=-5152, c=-10304 a=-16,b=-29706, c=-29722 a=-29706,b=-29706, c=-59412 a=-29706,b=116, c=-29590 a=29696,b=90, c=29786 a=29696,b=29696, c=59392 a=-11446,b=-21185, c=-32631 a=-21185,b=-21185, c=-42370 a=-12,b=16437, c=16425 a=-12,b=16437, c=16425 a=3202,b=53, c=3255 a=3202,b=3202, c=6404 a=-98,b=3, c=-95 a=82691970030325711417874227410289695610,b=1316378701, c=82691970030325711417874227411606074311 a=82691970030325711417874227410289695610,b=82691970030325711417874227410289695610, c=165383940060651422835748454820579391220 a=24100,b=14385, c=38485 a=24100,b=14385, c=38485 a=24100,b=24100, c=48200 a=12293,b=-106, c=12187 a=12293,b=27280, c=39573 a=27280,b=27280, c=54560 a=-18887,b=-5530, c=-24417 a=-18887,b=-18887, c=-37774 a=4738,b=122351151658095310625663643505383743930, c=122351151658095310625663643505383748668 a=-24601163521689169516616964879873921492,b=565838202, c=-24601163521689169516616964879308083290 a=4738,b=122351151658095310625663643281738736058, c=122351151658095310625663643281738740796 a=-96098295006598318424285019062007505,b=25207226, c=-96098295006598318424285019036800279