用Python爲接口自動生成測試用例

基於屬性的測試會產生大量的、隨機的參數,特別適合爲單元測試和接口測試生成測試用例

儘管早在2006年haskell語言就有了QuickCheck來進行”基於屬性的測試“,但是目前來看這依然是一個比較小衆的領域,參考資料有限,本文如有不足,歡迎指正。


1. 基於表的測試

在過去的測試實踐中,執行測試時通常需要明確的內容(Value):

  1. 條件
  2. 輸入
  3. 結果

這些內容可以通過”判定樹“或者”判斷表“來表示,然後測試的執行過程變成了這樣

“給定輸入 X,我們期望 Y”

可以稱爲 基於表的測試

在最初,這給了我們測試的方向,但是缺點也非常明顯:

你要足夠多的"X->Y" 才能可能覆蓋到隱蔽的bug。

這裏請大家回答幾個問題:

  1. 你是否已經爲每一個測試編寫了足夠多的用例,以至於你十分確定真的不需要再增加用例了
  2. 這麼多的用例,你編寫的是否開心?是否高效?是否願意繼續堅持?

如果以上問題的答案不是yes,那麼基於屬性的測試就是你需要掌握的東西!


2. 基於屬性的測試

基於屬性的測試和基於表的測試,最大的區別可以這樣描述:

“給定輸入 X值,我們期望 Y值”

vs

“給定輸入 X類,我們期望 Y類”

於是利用工具生成大量的X類數據,進行測試,並驗證結果是否Y類。

值得注意的是:

  1. 關注輸入的類型,而不是輸入的值
  2. 根據類型自動生成大量的、隨機的輸入值

換言之,它在自動的生成測試用例,雖然輸入值是隨機的,但是值得類型符合規範要求


3. 如何進行基於屬性的測試

在不同的語言中有不同的工具來實現,比如:

  • haskell中的QuickCheck
  • java中的quicktheories
  • python中的hypothesis

本文以python爲例進行演示:

假設有add函數,接收兩個類型整數參數,並返回它們的相加結果

def add(a: int, b: int) -> int: pass

首先寫出一個簡單的測試用例

def test_add(): assert 3 == add(1, 2)

正如前面所說,一個這樣的用例,根本沒信心覆蓋全部的場景,例如:

  • 參數是0
  • 參數是負數
  • 參數值特別大
  • 其他...

所以接下來怎麼辦?

改爲基於屬性的測試

import hypothesis.strategies as st from hypothesis import given @given(st.integers(), st.integers()) def test_add(a, b): c = add(a, b) print(f"{a=},{b=}, {c=}") assert isinstance(c, int) assert c == a + b

執行結果

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