政協(xié)網(wǎng)站建設(shè)方案seo北京優(yōu)化
邏輯覆蓋測試用例設(shè)計(jì)
實(shí)驗(yàn)?zāi)繕?biāo)
- 能夠依據(jù)程序畫出程序流程圖
- 理解常用覆蓋方法的內(nèi)涵
- 理解常用覆蓋方法的強(qiáng)弱關(guān)系
- 能夠使用常用覆蓋方法設(shè)計(jì)測試用例
背景知識(shí)
白盒測試通常采用靜態(tài)測試方法和動(dòng)態(tài)測試方法開展。動(dòng)態(tài)測試是參照系統(tǒng)需求或測試規(guī)則,通過預(yù)先設(shè)計(jì)一組測試輸入,并借助此輸入動(dòng)態(tài)運(yùn)行程序,從而達(dá)到發(fā)現(xiàn)程序錯(cuò)誤的過程。
覆蓋是是動(dòng)態(tài)測試中的一類有效測試方法,主要包括邏輯覆蓋、基本路徑測試等.其中,邏輯覆蓋基于程序內(nèi)部的邏輯結(jié)構(gòu),通過對程序邏輯結(jié)構(gòu)的遍歷實(shí)現(xiàn)程序的覆蓋。依據(jù)覆蓋源程序結(jié)構(gòu)的詳盡程度,可分為語句覆蓋、判定覆蓋、條件覆蓋、條件判定覆蓋、條件組合覆蓋和路徑覆蓋六種類型
具體介紹如下
語句覆蓋
語句覆蓋是一類比較弱的測試標(biāo)準(zhǔn),具體是指選擇足夠的測試用例,使程序中的每個(gè)語句至少能被執(zhí)行一次。
局限性:測試不充分,對程序執(zhí)行邏輯的覆蓋率較低,屬于最弱的覆蓋方式。
判定覆蓋
判定覆蓋又稱為分支覆蓋,是比語句覆蓋稍強(qiáng)的一類測試標(biāo)準(zhǔn),具體是指選擇足夠的測試用例,使程序中的每個(gè)判定獲得每一種可能的結(jié)果至少一次,也就是說,各個(gè)判定的每個(gè)分支至少都被執(zhí)行一次
局限性:測試不充分,僅對整個(gè)判定的最終取值進(jìn)行各方面的度量,但判定內(nèi)部每一個(gè)子表達(dá)式的取值未被考慮
條件覆蓋
條件覆蓋是比判定覆蓋更強(qiáng)的一類測試標(biāo)準(zhǔn),具體是指選擇足夠的測試用例,使程序各判定中的每個(gè)條件獲得可能的取值
局限性:測試不充分,雖彌補(bǔ)了判定覆蓋的漏洞,對程序內(nèi)部每一個(gè)子表達(dá)式的取值進(jìn)行了度量,但條件覆蓋并不能滿足判定覆蓋
條件判定覆蓋
條件判定覆蓋綜合了判定覆蓋和條件覆蓋特點(diǎn),是比條件覆蓋更強(qiáng)的一類測試標(biāo)準(zhǔn),具體視選擇足夠的測試用例,使程序中各判定的每個(gè)分支至少都被執(zhí)行一次,且使各判定條件獲得各種可能的取值。
局限性:測試不充分,未考慮單個(gè)判定對整體程序的影響,對程序執(zhí)行邏輯的覆蓋率較低
條件組合覆蓋
條件組合覆蓋是指選取足夠的測試用例,使判定中條件的各種組合都至少被執(zhí)行一次
局限性,測充分,某些情況可遺漏覆蓋部分路徑,且組合數(shù)量相對較大,往往花費(fèi)較多的時(shí)間
路徑覆蓋
路徑覆蓋是相當(dāng)強(qiáng)的一類覆蓋標(biāo)準(zhǔn),具體是指設(shè)計(jì)足夠多的測試用例,使程序中所有可能的路徑被執(zhí)行一次
局限性:測試不充分,測試所需用用例數(shù)量相對較大,使工作量呈指數(shù)級(jí)增長
值得提醒的是,軟件評測師考試中,邏輯覆蓋相關(guān)知識(shí)點(diǎn)往往占據(jù)一定的分支,提醒多采用六種覆蓋方式進(jìn)行測試用例額的設(shè)計(jì)和依據(jù)各類覆蓋的強(qiáng)弱關(guān)系進(jìn)行語句判斷
因此針對各類覆蓋的強(qiáng)弱關(guān)系總結(jié)如下
- 滿足條件組合覆蓋的測試用例一定滿足語句覆蓋、判定覆蓋、條件覆蓋和條件判定覆蓋
- 滿足條件判定覆蓋的測試用例一定滿足語句覆蓋、條件覆蓋、判定覆蓋
- 滿足判定覆蓋的測試用例一定滿足語句覆蓋
- 滿足條件覆蓋的測試用例不一定滿足語句覆蓋及判定覆蓋
綜上所述,各類覆蓋均不是十全十美的,僅使用一種覆蓋往往會(huì)導(dǎo)致測試片面,不充分,實(shí)際測試工作中通常會(huì)綜合采用多種覆蓋。例如,測試通過準(zhǔn)則可能要求語句覆蓋達(dá)到%,判定覆蓋達(dá)到90%等
實(shí)驗(yàn)
針對源程序1采用六種邏輯覆蓋方法設(shè)計(jì)測試用例
#include<stdio.h>
void main(){float A,B,X;scanf("%f %f %f",&A,&B,&X);if((A>1)&&(B==0))X=X/A;if((A==2)||(X>1))X=X+1;print("% f",X);
}
測試用例設(shè)計(jì),繪制程序流程圖,如所示
第二步,設(shè)計(jì)測試用例滿足語句覆蓋,如表所示
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | A=2,B=0,X=3 | ace |
第三部,設(shè)計(jì)測試用例滿足判定覆蓋,如表3.2所示。其中,if((A>1)&&(B==0)),
if ((A==2)||(X>1))為源程序的兩個(gè)判定。在此,考慮兩個(gè)判定的每個(gè)分支被執(zhí)行一次即可。
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | A=3,B=0,X=1 | A-C-D |
2 | A=2,B=1,X=3 | A-B-E |
第四步,設(shè)計(jì)測試用例滿足條件覆蓋。如表3.3所示,if((A>1)&&(B==0)),
if ((A==2)||(X>1))為源程序的兩個(gè)判定。而
A>1 B==0 A==2 X>1
為兩個(gè)判定的4個(gè)條件。在此,考慮
A>1 A<=1 B==0 B!=0 A==2 A!=2 X>1 X<=1
8種取值分別被執(zhí)行一次即可
用例編號(hào) | 測試用例 | 覆蓋條件 |
---|---|---|
1 | A=2,B=0,X=3 | A>1 B=0 A==2 X>1 |
2 | A=-1,B=2,X=1 | A<=1 B!=0 X<=1 |
第五步,設(shè)計(jì)測試用例滿足條件判定覆蓋,如表3.4所示。在此, 需要同時(shí)滿足條件覆蓋和判定覆蓋
條件判定覆蓋測試用例
用例編號(hào) | 測試用例 | 覆蓋路徑 | 覆蓋條件 |
---|---|---|---|
1 | a-c-e | a>1 b=0 a=2 x>1 | 2,0,4 |
2 | a-b-d | a<=1 b!=0 a!=2 x<=1 | 1,2,0 |
第六步,設(shè)計(jì)測試用例滿足條件組合覆蓋。其中,if((A>1)&&(B==0)),
if ((A==2)||(X>1))為源程序的兩個(gè)判定.在此,考慮((A>1)&&(b=0))
(A>1)&&(b!=0) (A<=1)&&(B=0) (A<=1)&&(B!=0) (A==2)||(x>1) (A=2)||(x<=1)
(A!=2)||(x>1) (A!=2)||(x<=1)八種組合情況均被執(zhí)行一次即可
表?xiàng)l件組合覆蓋測試用例
用例編號(hào) | 測試用例 | 覆蓋條件組合 |
---|---|---|
1 | A=2,B=0,X=4 | A>1 B=0 A=2 X>1 |
2 | 2,3,1 | A>1 B!=0 A=2 x<=1 |
3 | 1,0,1 | a<=1 b=0 a!=2, x<=1 |
4 | 1,2,1 | a<=1 b!=0 a!=2 x<=1 |
注意:
條件組合僅僅針對同一個(gè)判定語句內(nèi)存在多個(gè)條件的情況,在此情況下,講這些條件的取值進(jìn)行笛卡爾乘積組合即可。也就是說,對于不同的判定無需考慮條件組合,以及對但條件的判斷語句僅需要滿足自身所有取值即可
第七步,設(shè)計(jì)測試用例滿足路徑覆蓋。再次,需滿足程序中所有可能的路徑被執(zhí)行一次的要求
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | A=1,b=1,x=1 | a-b-d |
2 | 1,1,2 | a-b-e |
3 | 3,0,6 | a-c-d |
4 | 2,0,4 | a-c-e |
注意,實(shí)際設(shè)計(jì)出的覆蓋路徑及輸入數(shù)據(jù)如果與上述設(shè)計(jì)不盡相同,則并非一定有誤,例如在判定覆蓋中,可選擇a-c-e路徑和a-b-d路徑的組合也可以選擇a-b-e和a-c-d的組合,均滿足判定覆蓋的要求。因此,本任務(wù)的操作步驟及用例僅僅用作參考
任務(wù)2:針對源程序2才用6種邏輯覆蓋方法設(shè)計(jì)測試用例
int testing(int x,int y){int software = 0;if((x>0) && (y>0))software = x+y+10;elsesoftware = x+y-10;if(software<0)software = 0return software;
}
第一步,繪制程序流程圖,如3.2所示
第二步,設(shè)計(jì)測試用例滿足語句覆蓋,如表3.7所示
語句覆蓋是用例
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | 1,1 | a-b-e-f |
2 | 1,-1 | a-c-d-f |
第三步,設(shè)計(jì)測試用例滿足判定覆蓋其中。if((x>0)&&(y>0)) if(software<0)為源程序的兩個(gè)判定。再次,考慮兩個(gè)判定的每個(gè)分支執(zhí)行一次即可
判定覆蓋測試用例
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | 1,1 | a-b-e-f |
2 | 1,-1 | a-c-d-f |
第四步,設(shè)計(jì)測試用例滿足條件覆蓋
如表3.9所示,if((x>0)&&(y>0)) if(software<0)為源程序的兩個(gè)判定。而x>0,y>0和software為兩個(gè)判定中的三個(gè)條件,因此,考慮 x>0 x<=0 y>0 y<=0 software<0 software >=0 6種取值均被執(zhí)行一次
條件覆蓋測試用例
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | x=3,y=3 | a-b-e-f |
2 | x=-3,y=0 | a-c-d-f |
第五步,設(shè)計(jì)測試用例滿足條件判定覆蓋,需要同時(shí)滿足條件覆蓋和判定覆蓋
條件判定覆蓋
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | x=3,y=3 | a-b-e-f |
2 | x=-3,y=0 | a-c-d-f |
第六步,設(shè)計(jì)測試用例滿足條件組合覆蓋(x>0)&&(y>0) (x>0)&&(y<=0) (x<0)&&(y>0) (x<=0)&&(y<=0)四種情況,以及software<0和 software>=0兩種 取值均被執(zhí)行一次即可
條件組合覆蓋測試用例
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | 1,1 | a-b-e-f |
2 | -1,0 | |
-1,2 | ||
第七步,設(shè)計(jì)測試用例滿足路徑覆蓋
用例編號(hào) | 測試用例 | 覆蓋路徑 |
---|---|---|
1 | 1,1 | a-b-e-f |
-1,100 | acef | |
abdf | ||
-1,-1 | acdf |