上篇文章:嵌入式基礎知識-測試基礎概念,介紹了軟件測試相關的基礎概念,其中白盒測試中的邏輯覆蓋率知識點比較復雜,本篇通過實例來講解各種覆蓋率的測試用例該如何設計。
1 基礎示例
1.1 例題一
有如下程序,設計分別滿足語句覆蓋和分支覆蓋的最有效力的測試用例。
int x = 0;
int y = 0;
if (x > 0 && y > 0)
{
y = y/x;
}
if (x > 1 || y > 1)
{
y = y + 1;
}
x = x + y;
分析:
語句覆蓋只需要所有的語句都被執(zhí)行過即可,針對此程序,只需要使兩個if語句都為true即可,例如x=2,y=0。
分支覆蓋,也叫判定覆蓋,只需要所有的判斷都能取到所有可能的值即可,針對此程序,只需要使兩個if語句各自都取到true和false即可,例如x=2,y=0(兩個if都是true); x=0,y=0(兩個if都是false)需要兩條用例。
1.2 例題二
有如下程序,變量i取什么值能效力最高的滿足判斷覆蓋?
void main()
{
int i = 0;
int sum = 0;
scanf("%d", &i);
while(i <= 10)
{
sum += i;
i++;
}
printf("%dn", sum);
}
分析:
此程序中,while語句是路徑分支。效力最高的滿足判斷覆蓋,即在最小的循環(huán)執(zhí)行次數(shù)下,判斷可以取到true和false。因此,取i=10,滿足true,下一輪循環(huán)i變?yōu)榱?1,滿足false。
1.3 例題三
有如下程序,滿足判定覆蓋至少需要幾條測試用例?
int func(int n)
{
if (n == 0)
{
return 33;
}
if (n == 1)
{
return 66;
}
if (n > 1)
{
return func(n - 1) + func(n - 2) + func(n - 3) ;
}
else
{
return 99;
}
}
分析:
此程序中,2個if和1個if-else組成了所有的判斷,滿足判定覆蓋,即需要讓所有的判定各取true和false。最簡單直觀的是用4條用例n=0; n=1; n=2; n=-1即可滿足,注意到程序里有遞歸調用,實際上取n=2,會調用return func(1) + func(0) + func(-1) ;即可滿足。
2 進階示例
有如下程序,設計各種邏輯覆蓋的測試用例:
int test (int x, int y)
{
int ret = 0;
if (x > 0 && y > 0)
{
ret = x + y + 10; //語句塊1
}
else
{
ret = x + y - 10; //語句塊2
}
if (ret < 0)
{
ret = 0; //語句塊3
}
return ret; //語句塊4
}
分析:根據(jù)程序,先畫出流程圖:
2.1 語句覆蓋SC
設計滿足語句覆蓋(SC)的測試用例,即運行完測試用例,能將程序中每條可執(zhí)行語句至少被執(zhí)行一次。
本例中,就是要把語句塊1~語句塊4都執(zhí)行一遍。
用例數(shù)據(jù) | 語句塊1 | 語句塊2 | 語句塊3 | 語句塊4 |
---|---|---|---|---|
{x=3, y=3} | √ | - | abef | √ |
{x=-3, y=0} | False | √ | √ | √ |
2.2 判定覆蓋DC
設計滿足判定覆蓋(DC)的測試用例,即運行完測試用例,使得程序中每個判斷的True和False分支至少被執(zhí)行一次。
判定覆蓋,也叫分支覆蓋
用例數(shù)據(jù) | P1(x>0&&y>0) | P2(ret<0) |
---|---|---|
{x=3, y=3} | True | False |
{x=-3, y=0} | False | True |
2.3 條件覆蓋CC
設計滿足條件覆蓋(CC)的測試用例,即運行完測試用例,使得程序中每個邏輯條件的可能值至少被滿足一次。
用例數(shù)據(jù) | C1(x>0) | C2(y>0) | C3(ret<0) | P1(x>0&&y>0) | P2(ret<0) |
---|---|---|---|---|---|
{x=3, y=0} | True | False | True | False | True |
{x=-3, y=15} | False | True | False | False | False |
2.4 條件判定覆蓋C/DC
設計滿足條件判定覆蓋(C/DC)的測試用例,即運行完測試用例,使得程序中每個判斷的True和False分支至少被執(zhí)行一次,同時,使得程序中每個邏輯條件的可能值至少被滿足一次。
用例數(shù)據(jù) | C1(x>0) | C2(y>0) | C3(ret<0) | P1(x>0&&y>0) | P2(ret<0) |
---|---|---|---|---|---|
{x=3, y=3} | True | True | False | True | False |
{x=-3, y=0} | False | False | True | False | True |
2.5 條件組合覆蓋MCC
設計滿足組合覆蓋(MCC)的測試用例,即運行完測試用例,使得程序中每個判斷的所有可能條件取值的組合至少被滿足一次。
注意幾點:
- 條件組合只針對同一個判斷語句內存在多個條件的情況不同的判斷語句內的條件直接無需組合對于單條件的判斷語句,只需滿足自己的所有取值即可
用例數(shù)據(jù) | C1(x>0) | C2(y>0) | C3(ret<0) | P1(x>0&&y>0) | P2(ret<0) | 路徑 |
---|---|---|---|---|---|---|
{x=-3, y=0} | False | False | True | False | True | acdf |
{x=-3, y=2} | False | True | True | False | True | acdf |
{x=3, y=0} | True | False | True | False | True | acdf |
{x=3, y=3} | True | True | False | True | False | abef |
2.6 路徑覆蓋PC
設計滿足路徑覆蓋(PC)的測試用例,即運行完測試用例,使得程序中每條路徑至少被覆蓋一次。
用例數(shù)據(jù) | C1(x>0) | C2(y>0) | C3(ret<0) | P1(x>0&&y>0) | P2(ret<0) | 路徑 |
---|---|---|---|---|---|---|
不可能路徑 | - | - | - | - | - | abdf |
{x=0, y=2} | False | True | True | False | True | acdf |
{x=3, y=5} | True | True | True | True | True | abef |
{x=-10, y=30} | False | True | False | False | False | acef |
3 修正的條件判定覆蓋MC/DC
修正的條件判定覆蓋MC/DC,這里再描述一下含義:
MC/DC要求設計適當數(shù)量的測試用例,滿足以下條件:
保證在一個程序中每一種輸入輸出至少出現(xiàn)一次在程序中的每一個條件必須產(chǎn)生所有可能的輸出結果至少一次并且每個判斷中的每個條件必須能獨立影響一個判斷的輸出(即在其它條件不變的前提下,僅改變這個條件的值,而使判斷結果改變)
有如下程序,若要滿足修正的條件判定覆蓋,最少的測試用例需要幾條:
bool func(bool x, bool y, bool z)
{
if (x && (y || z))
{
return true;
}
return false;
}
先畫出流程圖,這里給出兩種畫法:
對于修正的條件判定覆蓋:
- 首先需要先進行條件組合,本例中P1判定內包含3個布爾值的條件x、y、z,對其組合有8種情況然后再分別對每個條件的用例進行計算,規(guī)則為:
-
- 條件Cx所在的判定內(本例即P1),除條件Cx外,其它條件的取值完全相同(例如對于C1,就是找到與x的值相反,y和z相同的用例 )判定的結果與之相反(例如對于C1,用例2和用例6的判定結果就是相反的)
按照以上規(guī)則,可以得到如下表:
觀察表格:
- 對于條件z,需要選用用例5和6對于條件y,需要選用用例5和7對于條件x,需要選用用例2和6,或用例3和7,或用例2和8
為了實現(xiàn)最少的用例能滿足MC/DC,可選的用例組合為:
- 組合1:用例2、用例5、用例6、用例7組合2:用例3、用例5、用例6、用例7
即最少需要4條用例才能滿足MC/DC。
例如選擇組合1,將冗余的用例去除,得到如下表:
再來分析一次:
- 對于條件x,使用用例2和6來測試,y和z的值相同(y=0,z=1),P1判定結果剛好是不同值(0和1)對于條件y,使用用例5和7來測試,x和z的值相同(x=1,z=0),P1判定結果剛好是不同值(0和1)對于條件z,使用用例5和6來測試,x和y的值相同(x=1,y=0),P1判定結果剛好是不同值(0和1)
最后,再來通過在流程圖上標注來對比看下,加深理解:
4 總結
本篇介紹了軟件測試中,白盒測試中邏輯覆蓋的各種實例情況,包括語句覆蓋SC、判定覆蓋DC、條件覆蓋CC、條件判定覆蓋C/DC、條件組合覆蓋MCC、路徑覆蓋PC、修正的條件判定覆蓋MC/DC的實例。