複製鏈接
請複製以下鏈接發送給好友

邏輯覆蓋

鎖定
邏輯覆蓋是以程序內部的邏輯結構為基礎的設計測試用例的技術。它屬白盒測試白盒測試的測試方法有代碼檢查法、靜態結構分析法、靜態質量度量法、邏輯覆蓋法、基本路徑測試法、域測試、符號測試、Z路徑覆蓋、程序變異。白盒測試法的覆蓋標準有邏輯覆蓋、循環覆蓋和基本路徑測試
中文名
邏輯覆蓋
外文名
Logic cover
術語拼音
Luójí Fùgài
分    類
白盒測試

邏輯覆蓋術語概述

邏輯覆蓋術語分類

邏輯覆蓋是通過對程序邏輯結構的遍歷實現程序的覆蓋。它是一系列測試過程的總稱,這組測試過程逐漸進行越來越完整的通路測試。 [1] 
根據覆蓋目標的不同和覆蓋源程序語句的詳盡程度,邏輯覆蓋又可分為:
4. 條件/判定覆蓋(C/DC)
5. 條件組合覆蓋(MCC)
6.多條件覆蓋(MCC)
7.修正判定條件覆蓋(MCDC)
9. 邊覆蓋
10.路徑覆蓋 [1] 
幾種邏輯覆蓋標準發現錯誤的能力呈由弱至強的變化。

邏輯覆蓋舉例

public class Coverage
{
public void Main()
{
1 System.out.println("start main function:path a...");
2 int A,B,X;
3 if(A>1 and B==0){
4 X=X/A;
5 System.out.println("path c");
5 } else {
6 System.out.println("path b");
7 }
8 if(A==2 or X>1){
9 X=X+1;
10 System.out.println("path e");
11 } else {
12 System.out.println("path d");
13 }
14 System.out.println("end main function.");
}
} [1] 

邏輯覆蓋術語詳解與舉例

邏輯覆蓋語句覆蓋

語句覆蓋 SC(Statement Coverage),就是設計若干個測試用例,運行被測程序,使得程序中每一可執行語句至少執行一次。這裏的“若干個”,意味着使用測試用例越少越好。語句覆蓋在測試中主要發現缺陷或錯誤語句。 [1] 
例如上邊的Coverage類代碼,從path a到path c再到path e的路徑就是所有可執行的語句路徑,所以選擇path ace路徑設計測試用例即可覆蓋所有可執行語句。 [1] 
語句覆蓋率的公式:語句覆蓋率=被評價到的語句數量/可執行的語句總數 x 100% [1] 
語句覆蓋的缺點:對程序執行邏輯的覆蓋很低。 [1] 

邏輯覆蓋判定覆蓋(分支覆蓋)

判定覆蓋DC(Decision coverage),有時也稱分支覆蓋,就是指設計若干測試用例,運行被測程序,使得每個判定的取真分支和取假分支至少評價一次。例如上邊的Coverage類代碼,path ace,path abd,path abe,path acd 四條路徑均是符合判定覆蓋要求的路徑。 [1] 
判定覆蓋的公式: 判定覆蓋率=被評價到的判定分支個數/判定分支的總數X100% [1] 
判定路徑覆蓋率(DDP)=被評價到的判定路徑數量/判定路徑的總數X100% [1] 
判定覆蓋的缺點:判定覆蓋雖然把程序所有分支均覆蓋到了,但其主要對整個表達式最終取值進行度量,忽略了表達式內部取值。 [1] 
例如上邊的Coverage類代碼的第8行“if(A==2 or X>1)”, [1] 
當A==2或者X>1時都會執行第9行代碼,判定覆蓋只考慮整個“(A==2 or X>1)”表達式的取值,並沒有考慮到表達式內部變量的取值(應該將A==2和X>1的情況均考慮)。 [1] 

邏輯覆蓋條件覆蓋

條件覆蓋CC(Condition Coverage),設計足夠多的測試用例,運行被測程序,使得每一判定語句中每個邏輯條件的可能取值至少滿足一次。 [1] 
條件覆蓋率的公式:條件覆蓋率=被評價到的條件取值的數量/條件取值的總數X100% [1] 
條件覆蓋的缺點:只考慮到每個判定語句中的每個表達式,沒有考慮到各個條件分支(或者涉及不到全部分支),即不能夠滿足判定覆蓋 [1] 
例如上邊的Coverage類代碼,判定語句有兩個,分別是第3行和第8行代碼。根據條件覆蓋的定義,則應考慮“(A>1 and B==0)”和“(A==2 or X>1)”兩個表達式中的變量取值。 [1] 

邏輯覆蓋判定條件覆蓋

判定條件覆蓋CDC(Condition/ Decision Coverage),設計足夠多的測試用例,使得判定中的每個條件的所有可能(真/假)至少出現一次,並且每個判定本身的判定結果也至少出現一次。 [1] 
判定條件覆蓋率的公式: 條件判定覆蓋率=被評價到的條件取值和判定分支的數量/(條件取值總數+判定分支總數) [1] 
例如上邊的Coverage類代碼,不僅考慮到path ace,path abd,path abe,path acd 四條分支路徑(判定覆蓋),也考慮到了“(A>1 and B==0)”和“(A==2 or X>1)”兩個條件中的每個表達式的取值(條件覆蓋)。 [1] 
判定條件覆蓋的缺點:沒有考慮單個判定對整體結果的影響,無法發現邏輯錯誤。 [1] 
補充:修正判定條件覆蓋 [1] 
修正判定條件覆蓋單元的入口與出口必須至少被調用一次,程序中判斷的每一個分支必須至少被執行一次。對於程序中通過邏輯運算(AND,OR等)組成判斷的基本布爾條件,每個條件必須取遍所有可能的值且每一個條件對判斷的結果具有獨立的作用。 [1] 

邏輯覆蓋條件組合覆蓋

條件組合覆蓋,也稱多條件覆蓋MCC (Multiple Condition Coverage),設計足夠多的測試用例,使得每個判定中條件的各種可能組合都至少出現一次(以數軸形式劃分區域,提取交集,建立最少的測試用例)。這種方法包含了“分支覆蓋”和“條件覆蓋”的各種要求。滿足條件組合覆蓋一定滿足判定覆蓋、條件覆蓋、判定條件覆蓋。
例如上邊的Coverage類中第8行“if(A==2 or X>1)”代碼,所有可能的條件組合為: [1] 
“A==2,X>1”、“A==2,X<=1”和“A!=2,X>1”三種。在條件覆蓋中僅需考慮到這三種的一種即可,而在條件組合覆蓋中需要都考慮到。 [1] 
條件組合覆蓋率的公式:條件組合覆蓋率=被評價到的條件取值組合的數量/條件取值組合的總數
條件組合覆蓋的缺點:判定語句較多時,條件組合值比較多。 [1] 

邏輯覆蓋路徑覆蓋

路徑覆蓋,設計足夠多的測試用例,執行程序所有可能的路徑。
路徑覆蓋率的公式:路徑覆蓋率=被執行到的路徑數/程序中總的路徑數。
優點:路徑覆蓋是覆蓋率最高的一種覆蓋技術。 [1] 
路徑覆蓋測試步驟
1. 將程序流程圖轉換成控制流圖
2. 經過語法分析求的路徑表達式
3. 生成路徑圖;
4. 進行路徑編碼;
5. 經過譯碼得到執行的路徑;
6. 通過路徑枚舉產生特定路徑測試用例
7. 修正的條件判斷覆蓋率(MC/DC) [1] 

邏輯覆蓋修正條件判定覆蓋

每一個程序模塊的入口和出口點都要考慮至少要被調用一次,每個程序的判定到所有可能的結果值要至少轉換一次;程序的判定被分解為通過邏輯操作符(and,or)連接的bool條件,每個條件對於判定的結果值是獨立的。 [1] 
參考資料
  • 1.    徐宏革.白盒測試之道-C++test:北京航空航天大學出版社,2011.04