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