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