1 白盒測試
白盒測試是對軟件的過程性細節做細致的檢查,把測試對象看作是一個打開的盒子,允許測試人員利用程序內部的邏輯結構以及有關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試。通過在不同點檢查程序狀態,確定實際狀態是否與預期的狀態一致。
白盒測試只測試軟件產品的內部結構和處理過程,而不是測試軟件產品的功能,可以分為靜態和動態兩種:
- 靜態白盒測試就是在不執行測試的情況下有條理仔細審查軟件設計、體系結構和代碼,從而找出軟件缺陷的過程
- 動態白盒測試也叫結構化測試,通過查看並使用代碼的內部結構,設計和執行測試
白盒測試的常見方法包括:
- 邏輯覆蓋法
- 路徑分析
- 控制結構測試
2 邏輯覆蓋法
邏輯覆蓋法又叫控制流覆蓋,是按照程序內部邏輯結構設計測試用例的測試方法,根據程序中的判定和條件控制流覆蓋准則來定量度量測試進行程度,按照覆蓋標准的不同,可以分為:
- 語句覆蓋
- 判定覆蓋
- 條件覆蓋
- 條件判定覆蓋
- 修正條件判定覆蓋
- 條件組合覆蓋
- 路徑覆蓋
2.1 語句覆蓋
語句覆蓋又叫線覆蓋面或者段覆蓋面,含義是選擇足夠數目的測試數據,使被測試程序中每條語句至少執行一次。語句覆蓋可以直接應用於目標代碼,不需要處理源代碼,但是由於對一些控制結構不敏感(比如同樣的測試用例,語句中的邏輯運算符從and
改為or
也同樣通過),邏輯覆蓋率低,因此往往不能發現判斷中邏輯運算符出現的錯誤。
2.2 判定覆蓋
又叫分支覆蓋或所有邊覆蓋,用於測試控制結構中布爾表達式分別為真和假,其中布爾表達式被認為是一個整體,不考慮內部是否包含了“邏輯與”或者“邏輯或”等運算符。判定覆蓋的基本思想是設計的測試用例是的程序中每個判定至少分別取“真”分支和取“假”分支經歷一次,即判斷真假值均被滿足。
判定覆蓋比語句覆蓋提供了更強的測試能力,但是,大部分的判定語句是由多個邏輯條件組合而成的,僅僅判斷最終的邏輯運算結果並不能真正覆蓋所有的測試路徑,這是判定覆蓋的一個缺點。
2.3 條件覆蓋
條件覆蓋是設計測試用例,使得每個判斷中每個條件的可能取值至少滿足一次。
條件覆蓋比判定覆蓋增加了對符合判定情況的測試,增加了測試路徑,但是條件覆蓋只能保證每個條件至少有一次為真,而不考慮所有的判定結果。
2.4 條件/判定覆蓋
條件/判定覆蓋是綜合了條件覆蓋與判定覆蓋的一種方法,含義是通過設計足夠的測試用例,使得判斷條件中所有條件可能至少執行一次取值,同時所有判斷的可能結果至少執行一次。
表面上,條件/判定覆蓋能同時滿足判定覆蓋以及條件覆蓋兩種標准,但實際上並沒有完全覆蓋所有的“真”和“假”取值的條件組合情況,這種情況下需要將判定語句中的復合條件表達式進行分解,形成由多個基本判定嵌套組成的流程圖,以有效檢查所有條件是否正確。
2.5 修正條件/判定覆蓋
修正條件/判定覆蓋(縮寫為MC/DC
)可以解釋為:
- 每個條件的所有可能結果至少出現一次
- 每個判定本身的所有可能結果也至少出現一次
- 每個入口點與出口點至少要喚醒一次
- 每個條件都顯示能單獨影響判定結果
MC/DC
具有如下優點:
- 繼承了多重條件覆蓋的優點
- 線性地增加了測試用例的數量
- 對操作數以及非等式條件變化反應敏感
- 具有更高的目標碼覆蓋率
2.6 條件組合覆蓋
基本思想是,設計測試用例使得:
- 每個條件中的所有可能至少出現一次
- 每個判斷本身的判定結果也至少出現一次
條件組合覆蓋是一種相當強的覆蓋准則,可以有效地檢查各種可能的條件取值的組合是否正確,它不但可以覆蓋所有條件的可能取值組合,還可以覆蓋所有判斷的可取分支,但仍有可能的路徑會遺漏掉,測試還不完全。
2.7 路徑覆蓋
路徑覆蓋的基本思想是,選擇足夠的測試用例,使得程序中所有可能的路徑都至少被執行一次。一條路徑是從函數的入口到出口分支的一個唯一序列。
路徑覆蓋的覆蓋率比前面幾種邏輯覆蓋要大,但是隨着代碼增加,測試工作將呈指數級增長,比如一個函數包括10個判斷語句,那么就需要測試2^10 = 1024
個路徑。
2.8 總結
語句覆蓋的效果最弱,路徑覆蓋的效果最好,如下圖所示:
優缺點集合:
3 路徑分析
路徑分析測試法是在程序控制流程圖的基礎上,通過分析控制構造的環路復雜性,導出獨立路徑集合,設計測試用例的方法。程序的所有路徑作為一個集合,在這些路徑集合中必然存在一個最短路徑,這個最小的路徑稱為基路徑或獨立路徑。
路徑分析與測試法主要步驟如下:
- 繪制控制流圖
- 計算圈復雜性,圈復雜性用於計算程序的基本獨立路徑數目,確保所有語句至少執行一次的測試數量的上界
- 確定獨立路徑的集合,獨立路徑是指至少引入程序的一個新處理語句集合或一個新條件的路徑,即獨立路徑必須包含一條在定義之前不曾使用的邊
- 測試用例生成,設計測試用例的數據輸入和預期結果,確保基本路徑集中每條路徑上的執行
4 控制結構測試
控制結構測試可以分為:
- 條件測試:檢查程序模塊中所包含邏輯條件的測試用例設計方法
- 循環測試:檢測代碼中的簡單循環、嵌套循環以及串接循環,測試用例包括零次循環、一次循環、兩次循環、m次循環、最大循環次數等等
- Z路徑覆蓋:是路徑覆蓋的一個變體,是一種在大量判斷和多個循環組合的情況下減少循環測試次數的方法,Z路徑覆蓋不考慮循環的形式和復雜度如何,也不考慮實際執行循環體次數是多少,只考慮通過循環體零次和一次這兩種情況