有一個函數如下:
1 public static void SortNum(int numA, int numB) 2 { 3 int x = 0; 4 int y = 0; 5 while (numA--> 0) 6 { 7 if (numB == 0) 8 x = y +2; 9 else 10 if (numB == 1) 11 x = y + 10; 12 else 13 x = y +20; 14 } 15 }
下面先畫出程序控制流圖
根據以上的控制流圖,可以計算出以下路徑:
路徑1:5-7-8-14-5-15
路徑2:5-10-11-14-5-15
路徑3:5-13-14-5-15
路徑4:5-15
導出測試用例:
下面使用語句覆蓋測試:
通過路徑 | 輸入數據 | 預期結果 | 測試結果 | |
case1 | 5-7-8-14-5-15 | numA=2,numB=0 | X=2 | X=2 |
case2 | 5-10-11-14-5-15 | numA=2,numB=1 | X=10 | X=10 |
case3 | 5-13-14-5-15 | numA=2,numB=3 | X=20 | X=20 |
case4 | 5-15 | numA=0,numB=1 | X=0 | X=0 |
二、下面來做一道面試題目
使用基本路徑測試方法,為以下程序段設計測試用例。
1 public static void DoSomething(int X, int A, int B) 2 { 3 if ((A > 1) && (B == 0)) 4 X = X / A; 5 if ((A == 1) && (X > 1)) 6 X = X + 1; 7 }
(1) 畫出程序的控制流圖
(2) 導出基本路徑集,確定程序的獨立路徑,並設計測試用例,寫出的輸入數據和預期輸出
(1)答:
(2)答:使用白盒測試的路徑測試方法:
A.語句覆蓋進行測試用例的設計:
通過路徑 | 輸入數據 | 預期結果 | 測試結果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 5-6-7 | X=10, A=1, B=0 | X=11 | X=11 |
B.判定覆蓋進行測試用例的設計:特點:條件中只要有一個真一個假,就完成了判定覆蓋;
比如需要設計:
- case1的時候需要讓條件1:if ((A > 1) && (B == 0))條件真的
- case2的時候需要讓條件2:if ((A == 1) && (X > 1))條件真的
- case3的時候需要讓條件1:if ((A > 1) && (B == 0))條件假的,並且需要讓條件2:if ((A == 1) && (X > 1))條件假的
通過路徑 | 輸入數據 | 預期結果 | 測試結果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 5-6-7 | X=10, A=1, B=0 | X=11 | X=11 |
case3 | T-7 | X=10, A=2, B=3 | X=10 | X=10 |
C.條件覆蓋進行測試用例的設計:特點是必須考慮到IF分支里面的各個條件的真/假
比如需要設計:
- case1的時候需要讓條件1:if ((A > 1) && (B == 0))條件里面的值全真的
- case2的時候需要讓條件2:if ((A == 1) && (X > 1))條件里面的值全真的,並且需要讓條件1:if ((A > 1) && (B == 0))條件里面的值全假的
- case3的時候需要讓條件1:if ((A > 1) && (B == 0))條件里面的值全假的,並且需要讓條件2:if ((A == 1) && (X > 1))條件里面的值全假的
通過路徑 | 輸入數據 | 預期結果 | 測試結果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 5-6-7 | X=10, A=1, B=2 | X=11 | X=11 |
case3 | T-7 | X=-1, A=-1, B=2 | X=-1 | X=-1 |
D.判定/條件覆蓋進行測試用例的設計:特點是必須考慮到IF分支里面的各個條件的真/假,並且每個分支的真和假都要出現一次
比如需要設計:
- case1的時候需要讓條件1:if ((A > 1) && (B == 0))條件為真;需要讓條件2:if ((A == 1) && (X > 1))條件為假
- case2的時候需要讓條件1:if ((A > 1) && (B == 0))條件為假;需要讓條件2:if ((A == 1) && (X > 1))條件為假
- case3的時候需要讓條件2:if ((A == 1) && (X > 1))條件為真;需要讓條件1:if ((A > 1) && (B == 0))條件為假
- case4的時候需要讓條件2:if ((A == 1) && (X > 1))條件為假;需要讓條件1:if ((A > 1) && (B == 0))條件為假
通過路徑 | 輸入數據 | 預期結果 | 測試結果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 3-4-5 | X=10, A=-2, B=2 | X=10 | X=10 |
case3 | 5-6-7 | X=10, A=1, B=2 | X=11 | X=11 |
case4 | 5-6-7 | X=10, A=-2, B=2 | X=10 | X=10 |
由表格可以看出case2和case4相同,所以合並為一個case
E.組合覆蓋進行測試用例的設計:特點是必須考慮到IF分支里面的各個條件的各個值的真/假,並且每個分支的值的真和假都要出現一次
比如需要設計:
- case1的時候需要讓條件1:if ((A > 1) && (B == 0))條件為真;需要讓條件2:if ((A == 1) && (X > 1))條件為假
- case2的時候需要讓條件1:(A > 1) 為真,(B == 0)為假;需要讓條件2:if ((A == 1) && (X > 1))條件為假
- case3的時候需要讓條件1:(A > 1) 為假,(B == 0)為真;需要讓條件2:if ((A == 1) && (X > 1))條件為假
- case4的時候需要讓條件2:if ((A == 1) && (X > 1))條件為真;需要讓條件1:if ((A > 1) && (B == 0))條件為假
- case5的時候需要讓條件2:(A == 1)為真,(X > 1)條件為假;需要讓條件1:if ((A > 1) && (B == 0))條件為假
- case6的時候需要讓條件2:(A == 1)為假,(X > 1)條件為真;需要讓條件1:if ((A > 1) && (B == 0))條件為假
- case7的時候需要讓條件2:(A == 1)為假,(X > 1)條件為假並且讓條件1:if ((A > 1) && (B == 0))條件為假
通過路徑 | 輸入數據 | 預期結果 | 測試結果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 3-4-5 | X=10, A=2, B=2 | X=10 | X=10 |
case3 | 3-4-5 | X=10, A=-1, B=0 | X=10 | X=10 |
case4 | 5-6-7 | X=10, A=1, B=2 | X=11 | X=11 |
case5 | 5-6-7 | X=1, A=1, B=2 | X=1 | X=1 |
case6 | 5-6-7 | X=10, A=0, B=2 | X=10 | X=10 |
case7 | T-7 | X=1, A=0, B=2 | X=1 | X=1 |