白盒測試
概念:按照程式內部的結構測試程式,通過測試來檢測產品內部動作是否按照設計規格說明書的規定正常進行,檢驗程式中的每條通路是否都能按預定要求正確工作。
分類:白盒測試是基於覆蓋的測試,儘可能覆蓋程式的結構特性和邏輯路徑,所以其具體方法有邏輯覆蓋、迴圈覆蓋、基本路徑覆蓋。邏輯覆蓋又可進一步分為語句覆蓋、判定(分支)覆蓋、條件覆蓋、判定-條件覆蓋、條件組合覆蓋等。白盒測試主要用於單元測試(我們需要瞭解程式源碼和結構,而且基於輸入輸出,適合單元模組)。下面重點介紹常用的幾種白盒測試方法。
語句覆蓋:
定義:只要求覆蓋到所有可執行語句(每個可執行語句至少運行一次),不關注判斷運算,確保可執行語句處沒有錯誤。
例子:
按照白盒,我們只需覆蓋到所有可執行語句即可,而為此我們只需用測試案例(X=1,Y=4,Z=9)。這樣三句話都會列印出來。但如果編碼時將X=1 AND Y>3錯誤寫成X=1 OR Y>3,雖然我們的測試案例可以覆蓋到所有可執行語句,而且證明可執行語句無誤,但因此我們的密碼系統面臨巨大風險,Y只要大於3就能攻破第一道防線。而我們對此渾然不知。所以語句覆蓋不能滿足我們的需求(有人說它是最弱的邏輯覆蓋準則)。
判定(分支)覆蓋:
定義:每個判斷的取真分支和取假分支至少經曆一次。彌補語句覆蓋對判斷邏輯的不足。
例子:同上。
(X=1,Y=4,Z=9)—— 通過路徑T->T (X=0,Y=4,Z=0)—— 通過路徑F->F 上面兩個測試案例,將兩個判斷條件的真假值都遍曆了,是執行判定覆蓋的最少測試案例。這樣當將X=1 AND Y>3誤寫成X=1 OR Y>3時,第二個測試案例就能發現錯誤。但如果選擇的測試案例是(X=0,Y=0,Z=0)還是不能發現錯誤。試試下面的覆蓋。
條件覆蓋: 定義:使每個判斷中每個條件的真假至少滿足一次。
例子:同上。 第一個判斷中有兩個條件X=1和Y>3,第二個判斷中有一個條件Z=9。 (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真 (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假 也是兩個測試案例即可。這種覆蓋有兩個問題: 任然不能解決那個OR問題 如果選擇的測試案例是(X=1,Y=2,Z=9)和(X=0,Y=4,Z=0),雖然符合條件覆蓋,但第一個判斷只執行了假分支,這會遺漏邏輯錯誤。
判定——條件覆蓋: 定義:是判定覆蓋和條件覆蓋的結合。保證每個判斷中每個條件的真假至少滿足一次,同時每個判斷的取真分支和取假分支至少經曆一次。
例子:同上。 (X=1,Y=4,Z=9) (X=0,Y=0,Z=0) 這樣既讓每個判斷的真假分支都取到,也讓每個判斷中每個條件的真假也都取到。但這同樣解決不了OR問題——當AND誤寫為OR時,兩個用例的執行路徑不變,所以僅憑這兩個用例是無法察覺錯誤的。
條件組合覆蓋: 定義:對於每個判斷,組合其中的條件的真假值(假如這個判斷中由兩個條件組成,那麼應設計T1T2、T1F2、F1T2、F1F2這樣的組合),並讓每個判斷的真假值都取到。
例子:同上。 (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆蓋路徑:T-T (X=1,Y=0,Z=0)—— X=1真,Y>3假,Z=9假——覆蓋路徑:F-F (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆蓋路徑:F-T
(X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆蓋路徑:F-F
當OR問題出現時,上述第二、三個用例的路徑就會發生改變,察覺到錯誤。這樣便解決了OR問題,因為第一個判斷中條件真假的組合中一真一假的組合是區分AND和OR的根本手段。雖然OR問題解決了,但我們發現有一條路徑沒有覆蓋到——T-F。
路徑覆蓋: 定義:覆蓋所有可能執行的路徑。
例子:同上。 讓我們在條件組合覆蓋用例的基礎上修改第二個用例。 (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆蓋路徑:T-T (X=1,Y=4,Z=0)—— X=1真,Y>3真,Z=9假——覆蓋路徑:T-F (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆蓋路徑:F-T
(X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆蓋路徑:F-F 雖然路徑都覆蓋了,但路徑覆蓋沒有覆蓋所有的條件組合。
總結:
可見沒有一種覆蓋能完全覆蓋所有的測試案例。因此,在實際的測試案例設計中,往往將多種覆蓋進行組合,達到最高的覆蓋率。像本例中,最終測試案例是在在條件組合覆蓋的基礎上補上路徑覆蓋所涉及的。 (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆蓋路徑:T-T (X=1,Y=0,Z=0)—— X=1真,Y>3假,Z=9假——覆蓋路徑:F-F (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆蓋路徑:F-T
(X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆蓋路徑:F-F (X=1,Y=4,Z=0)—— X=1真,Y>3真,Z=9假——覆蓋路徑:T-F 補:
基本路徑測試法:
(1)程式流程圖
上述例子的流程圖為:
(2)計算程式環路複雜度。 V(G) = 地區數目。地區是由邊界和節點包圍起來的形狀所構成,計算地區時包括圖的外部地區,將其作為一個地區。所以上圖有3個地區,也就是有3條基本路徑。 V(G) = 邊界數目-節點數目+2。這樣V(G) = 6 - 5 + 2 = 3。 V(G) = 判斷節點數目 + 1。上圖的判斷節點是A和C,所以V(G) = 2 + 1 = 3——一般用它作為圈的複雜度,而循環複雜度是路徑數的上限,下面就來看一看基本路徑是哪些。 (3)確定基本路徑。
上圖所示的程式有3條基本路徑,下面是一組基本路徑: A-C-end A-B-C-end A-B-C-D-end 。基本路徑是什麼,3條基本路徑是如何得出的(為什麼有3條,選擇這3條的原則)。希望知道的朋友留下評論:)