白盒測試又稱結構測試、透明盒測試、邏輯驅動測試或基于代碼的測試。白盒測試是一種測試用例設計方法,盒子指的是被測試的軟件,白盒指的是盒子是可視的,你清楚盒子內部的東西以及里面是如何運作的。"白盒"法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。"白盒"法是窮舉路徑測試。白盒測試并不是簡單的按照代碼設計用例,而是需要根據不同的測試需求,結合不同的測試對象,使用適合的方法進行測試。
白盒測試用例設計的一個很重要的評估標準就是對代碼的覆蓋度。白盒測試中常見的覆蓋方法有六種:語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。下面我們就分別看看這幾種不同的覆蓋吧。
一、語句覆蓋(Statement Coverage)
- 主要特點:語句覆蓋是最起碼的結構覆蓋要求,語句覆蓋需要選擇足夠的測試用例,使我們設計出來的測試用例要保證程序中的每一個語句至少被執行一次。
- 優點:可以很直觀地從源代碼得到測試用例,無須細分每條判定表達式。
- 缺點:由于這種測試方法僅僅針對程序邏輯中顯式存在的語句,但對于隱藏的條件和可能到達的隱 式邏輯分支,是無法測試的。
- 舉例
public int foo(int a,int b)
{
return a/b;
}
這是一個求兩數之商的函數。如果我們設計如下的測試用例:
TestCase: a =2, b =1
此時,該函數的代碼覆蓋率達到了100%,并且設計的case可以順利通過測試。但是顯然該函數有一個很明顯的bug:當 b=0
時,會拋出異常。
二、判定覆蓋(Decision Coverage)
- 主要特點:判定覆蓋又稱為分支覆蓋,它要求選擇足夠的測試用例,使得運行這些測試用例時,每個判定的所有可能結果至少出現一次。
- 優點:判定覆蓋比語句覆蓋要多幾乎一倍的測試路徑,當然也就具有比語句覆蓋更強的測試能力。同樣判定覆蓋也具有和語句覆蓋一樣的簡單性,無須細分每個判定就可以得到測試用例。
- 缺點:往往大部分的判定語句是由多個邏輯條件組合而成(如,判定語句中包含AND、OR、CASE),若僅僅判斷其整個最終結果,而忽略每個條件的取值情況,必然會遺漏部分測試路徑。
-
舉例
X Y 路徑
90 90 OAE
50 50 OBDE
90 70 OBCE
三、條件覆蓋(Condition Coverage)
- 主要特點:要求所設計的測試用例能使每個判定中的每一個條件都獲得可能的取值,即每個條件至少有一次真值、有一次假值。
- 優點:顯然條件覆蓋比判定覆蓋,增加了對符合判定情況的測試,增加了測試路徑。條件覆蓋使得判定中的每一個條件都取到了不同的結果,這一點判定覆蓋則無法保證。
- 缺點:要達到條件覆蓋,需要足夠多的測試用例,但條件覆蓋并不能保證判定覆蓋。條件覆蓋只能保證每個條件至少有一次為真,而不考慮所有的判定結果。
- 舉例
X Y 路徑
90 70 OBC
40 OBD