標籤:
白盒測試
概念:依照程式內部的結構測試程式,通過測試來檢測產品內部動作是否依照設計規格說明書的規定正常進行。檢驗程式中的每條通路是否都能按預定要求正確工作。
分類:白盒測試是基於覆蓋的測試。儘可能覆蓋程式的結構特性和邏輯路徑。所以其詳細方法有邏輯覆蓋、迴圈覆蓋、基本路徑覆蓋。邏輯覆蓋又可進一步分為語句覆蓋、判定(分支)覆蓋、條件覆蓋、判定-條件覆蓋、條件組合覆蓋等。
白盒測試主要用於單元測試(我們須要瞭解程式原始碼和結構,並且基於輸入輸出。適合單元模組)。以下重點介紹經常使用的幾種白盒測試方法。
語句覆蓋:
定義:僅僅要求覆蓋到全部可運行語句(每一個可運行語句至少運行一次),不關注推斷運算,確保可運行語句處沒有錯誤。
範例:
依照白盒,我們僅僅需覆蓋到全部可運行語句就可以。而為此我們僅僅需用測試用例(X=1。Y=4,Z=9)。這樣三句話都會列印出來。
但假設編碼時將X=1 AND Y>3錯誤寫成X=1 OR Y>3。儘管我們的測試用例能夠覆蓋到全部可運行語句,並且證明可運行語句無誤。但因此我們的password系統面臨巨大風險。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條的原則)。
希望知道的朋友留下評論:)
軟體測試基本方法(二)之白盒測試