White-Box Testing
白盒測試是關注測試用例覆蓋程序邏輯(源代碼)的程度。最終的白盒測試是執行程序中的每個路徑。但對于大多數的程序(例如帶有循環的程序),完全意義上的全路徑覆蓋是不現實的。
Logic Coverage Testing
你可能會覺得一個值得追求的目標是至少執行程序中的每一條語句。不幸的是,這是一個很弱的標準。假設下面這個圖表示一個要測試的小程序。相應的Java代碼片段如下:
你可以通過編寫一條單獨的測試用例來執行到路徑ace。也就是說,在a點設置A=2,B=0和X=3,每個語句將被執行一次。
不幸的是,這個標準相當差。
第一個條件可能是或而不是與。如果是這樣,這個bug將不會被檢測到。
第二個條件如果是是X>0,這個bug也不會被檢測到。
此外,程序中有一條路徑,X沒有改變(路徑abd)。如果這里存在一個錯誤,也不會被檢測到。
更強的邏輯覆蓋標準稱為條件覆蓋或分支覆蓋。這個標準規定,你必須編寫足夠的測試用例,使每個條件至少有一個true和一個false。以及每個分支方向必須至少遍歷一次。分支或條件語句的例子包括switch-case、do-while和if-else語句,以及在某些編程語言(如Fortran)中的多路徑GOTO語句。
在上圖中,分支覆蓋可以用兩個測試用例覆蓋路徑ace和abd,或者覆蓋路徑acd和abe。如果我們選擇后者,那么兩個測試用例的輸入分別是A=3, B=0, X=3和A=2, B=1, X=1。條件覆蓋是比語句覆蓋更強的標準,但它仍然很弱。因為,此時我們仍然沒有探索到x沒有改變的路徑(abd)。
如果第二個判斷有誤(寫成X<1而不是X>1),那么這個bug就不會被前面的測試用例(A=2, B=1, X=1)檢測到。
有時比分支覆蓋更強的標準是條件覆蓋。在這種情況下,你需要編寫足夠的測試用例來確保每個條件至少有一次取得所有可能的結果。上圖中有四個條件:A>1, B=0, A=2, 和X>1。因此,需要足夠多的測試用例來覆蓋以下情況:
在點a處A>1, A<=1, B=0, 和B!=0;
在點b處A=2, A!=2, X>1, 和X<=1。
盡管條件覆蓋標準乍一看似乎滿足分支覆蓋標準,但并不總是如此。例如,兩個測試用例 A = 1,B = 0,X = 3 和A = 2,B = 1,X = 1 涵蓋了所有條件結果,但只涵蓋了四個分支中的兩個(它們都涵蓋了路徑abe,因此不會執行第一個分支的true結果和第二個分支的false結果)。
擺脫這種困境的明顯方法是一種稱為分支+條件覆蓋的標準。它需要足夠的測試用例,以便每個分支判斷中的每個條件至少有一次取得所有可能的結果。
最后,大家再思考下,現有的仿真驗證的代碼覆蓋率有哪些類型的代碼覆蓋率,其實是會考慮所有分支里面的所有條件的輸入和輸出結果的組合的。
另外請再思考下,功能覆蓋率能夠覆蓋哪些代碼覆蓋率無法描述的場景組合呢?
編輯:黃飛
-
軟件測試
+關注
關注
2文章
229瀏覽量
18586 -
白盒測試
+關注
關注
1文章
14瀏覽量
10613 -
芯片驗證
+關注
關注
5文章
34瀏覽量
47222
原文標題:從軟件測試看芯片驗證-白盒測試
文章出處:【微信號:數字芯片實驗室,微信公眾號:數字芯片實驗室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論