前言
白盒測試主要是檢查程序的內(nèi)部結(jié)構(gòu)、邏輯、循環(huán)和路徑。白盒測試的常用用例設(shè)計(jì)方法有邏輯覆蓋和基本路徑測試。
根據(jù)覆蓋測試的目標(biāo)不同,邏輯覆蓋又可分為語句覆蓋、判斷覆蓋、條件覆蓋、判斷/條件覆蓋、條件組合覆蓋及路徑覆蓋。
1. 一個(gè)程序模塊的例子
?
圖1 一個(gè)程序模塊的例圖
從圖中可知,該程序模塊有4條不同的路徑、4個(gè)可執(zhí)行語句。這4條路徑可分別表示為:
L1(a→c→e)簡化為ace;
L2(a→b→d)簡化為abd;
L3(a→b→e)簡化為abe;
L4(a→c→d)簡化為acd;
4條路徑應(yīng)該滿足的邏輯表達(dá)式分別為:
記M={(A>1)and(B=0)},N={(A=2)or(X>1)}
L1(a→c→e)= M and N
L2(a→b→d)= /M and /N
L3(a→b→e)= /M and N
L4(a→c→d)= M and /N
其中,“/M”表示M的反,“/N”表示N的反,或者將4條路徑應(yīng)該滿足的邏輯表達(dá)式寫為:
L1(a→c→e)= {(A>1)and(B=0)} and {(A=2)or(X/A>1)} ;
L2(a→b→d)= / {(A>1)and(B=0)} and / {(A=2)or(X>1)} ;
L3(a→b→e)=/ {(A>1)and(B=0)} and {(A=2)or(X>1)} ;
L4(a→c→d)= {(A>1)and(B=0)} and / {(A=2)or(X/A>1)};
其中,由符號“and”連接起來的語句是為了遍歷這條路徑各個(gè)輸入變量應(yīng)取值的范圍,而由“or”劃分了幾組可選的取值。根據(jù)上面導(dǎo)出的邏輯表達(dá)式,就可以用來設(shè)計(jì)測試用例。
2. 語句覆蓋
語句覆蓋就是設(shè)計(jì)若干個(gè)測試用例,運(yùn)行所測程序,使得每一條可執(zhí)行語句至少執(zhí)行一次。對上面的例子,所有的可執(zhí)行語句都在路徑L1上,所以選擇路徑L1來設(shè)計(jì)測試用例,就要覆蓋所有的可執(zhí)行語句。
測試用例設(shè)計(jì)的格式如下:
[輸入的(A,B,X),輸出的(A,B,X)]為覆蓋路徑:L1(a→c→e)= M and N,{(A>1)and(B=0)} and {(A=2)or(X/A>1)}。可設(shè)計(jì)出滿足語句覆蓋的測試用例是:
[(2,0,4),(2,0,3)],覆蓋ace[L1]。
從每個(gè)執(zhí)行語句都得到執(zhí)行這一點(diǎn)來看,語句覆蓋的方法似乎能能夠比較全面地檢驗(yàn)每個(gè)可執(zhí)行語句,但實(shí)際上并非如此。
語句覆蓋的不足之處是:假如該程序段中的兩個(gè)邏輯運(yùn)算有問題,例如,第一個(gè)判斷中的邏輯運(yùn)算符“&&”寫成了“||”,或者第二個(gè)判斷中的邏輯運(yùn)算符“||”錯(cuò)寫成了“&&”,利用上面的測試用例,仍然可覆蓋所有4個(gè)可執(zhí)行語句,這說明雖然做到了語句覆蓋測試,但可能發(fā)現(xiàn)不了判斷時(shí)邏輯運(yùn)算中出現(xiàn)的錯(cuò)誤。語句覆蓋是最弱的邏輯覆蓋準(zhǔn)則。
3. 判斷覆蓋
判斷覆蓋就是設(shè)計(jì)若干個(gè)測試用例,運(yùn)行所測程序,使得程序中每個(gè)判斷的取TRUE分支和取FALSE分支至少經(jīng)歷一次。判斷覆蓋又稱為分支覆蓋。
根據(jù)定義,可分別選擇路徑L1和L2或者路徑L3和L4設(shè)計(jì)測試用例。
如果選擇路徑L1和L2,則可得到滿足要求的測試用例:
[(2,0,4),(2,0,3)],覆蓋ace[L1]
[(1,1,1),(1,2,1)],覆蓋abd[L2]
如果選擇路徑L3和L4,則可設(shè)計(jì)另一組測試用例:
[(2,1,1),(2,1,2)],覆蓋abe[L3]
[(3,0,3),(3,0,1)],覆蓋acd[L4]
可見,測試用例的選擇不唯一。
判斷覆蓋的不足之處是:假如第二個(gè)判斷中的條件X>1被錯(cuò)寫成了X<1,利用上面的兩組測試用例仍能得到同樣的結(jié)果。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-816057.html
4.?條件覆蓋
條件覆蓋就是設(shè)計(jì)若干個(gè)測試用例,運(yùn)行所測程序,使得程序中每個(gè)判斷的每個(gè)條件的可能取值至少執(zhí)行一次。因此,首先要對所有的條件加以標(biāo)記。
對第一個(gè)判斷:
- 條件A>1取TRUE時(shí)為T1,取FALSE時(shí)為F1;
- 條件B=0取TRUE時(shí)為T2,取FALSE時(shí)為F2;
對第二個(gè)判斷:
- 條件A=2取TRUE時(shí)為T3,取FALSE時(shí)為F3;
- 條件X>1取TRUE時(shí)為T4,取FALSE時(shí)為F4。
根據(jù)這8個(gè)條件取值,可分別設(shè)計(jì)如下兩組測試用例,如表1和表2所列。
表1 第一組
測試用例 |
通過路徑 |
條件取值 |
覆蓋分支 |
[(1,0,3),(1,0,4)] |
abe(L3) |
F1,T2,F3,T4 |
b,e |
[(2,1,1),(2,1,2)] |
abe(L3) |
T1,F2,T3,F4 |
b,e |
表2 第二組
測試用例 |
通過路徑 |
條件取值 |
覆蓋分支 |
[(2,0,4),(2,0,3)] |
ace(L1) |
T1,T2,T3,T4 |
c,e |
[(1,0,1),(1,0,1)] |
abd(L2) |
F1,T2,F3,F4 |
b,d |
[(2,1,1),(2,1,2)] |
abe(L3) |
T1,F2,T3,,F4 |
b,e |
?
由表1和表2可以看出,兩組測試用例都滿足了條件覆蓋,即覆蓋了所有的體哦阿健取值。條件覆蓋的不足之處是:第一組測試用例不滿足判斷(分支)覆蓋的要求。
5. 判斷-條件覆蓋
判斷-條件覆蓋就是設(shè)計(jì)足夠的測試用例,使得判斷中每個(gè)條件的所有可能取值至少執(zhí)行一次,同時(shí)每個(gè)判斷的所有可能判斷結(jié)果至少執(zhí)行一次。也就是說,要求各個(gè)判斷的所有可能的條件取值組合至少執(zhí)行一次。
根據(jù)判斷-條件覆蓋的定義,只需設(shè)計(jì)下面兩個(gè)測試用例來覆蓋例子的8個(gè)條件取值以及4個(gè)判斷分支,如表3所列。
表3 判斷分支列表
測試用例 |
通過路徑 |
條件取值 |
覆蓋分支 |
[(2,0,4),(2,0,3)] |
ace(L1) |
T1,T2,T3,T4 |
c,e |
[(2,1,1),(2,1,2)] |
abd(L2) |
F1,F2,F3,F4 |
b,d |
?
判斷-條件覆蓋的不足之處是:從表面上看來,判斷-條件覆蓋測試了所有條件的取值,但實(shí)際上并非如此,而是某些條件掩蓋了另一些條件(由于多重條件判定),例如,對條件表達(dá)式(A>1)AND(B=0)來說,若(A>1)的測試結(jié)果為FALSE,可以立即確定表達(dá)式的結(jié)果為FALSE,這時(shí)往往就不再測試(B=0)的取值了,因此,條件(B=0)就沒有被檢查。同樣,對條件表達(dá)式(A=2)OR(X>1)來說,若(A=2)的測試結(jié)果為TRUE,就立即確定表達(dá)式的結(jié)果為TRUE,這時(shí),條件(X>1)就沒有被檢查。
因此,采用判斷-條件覆蓋測試,邏輯表達(dá)式中的錯(cuò)誤不一定能夠檢查的出來。
6. 條件組合覆蓋
條件組合覆蓋就是設(shè)計(jì)足夠的測試用例,運(yùn)行所測程序,使得每個(gè)判斷的所有可能的條件取值組合至少執(zhí)行一次。
針對上面的例子,先對各個(gè)判斷的條件取值組合加以標(biāo)記,如表4所列。
表4 判斷條件取值組合表
組合編號 |
條件取值的組合 |
標(biāo)記 |
說明 |
① |
A>1,B=0 |
T1,T2 |
屬第一個(gè)判斷的取TRUE分支 |
② |
A>1,B!=0 |
T1,F2 |
屬第一個(gè)判斷的取FLASE分支 |
③ |
A<=1,B=0 |
F1,T2 |
屬第一個(gè)判斷的取FLASE分支 |
④ |
A<=1,B!=0 |
F1,F2 |
屬第一個(gè)判斷的取FLASE分支 |
⑤ |
A=2,X>1 |
T3,T4 |
屬第二個(gè)判斷的取TRUE分支 |
⑥ |
A=2,X<=1 |
T3,F4 |
屬第二個(gè)判斷的取TRUE分支 |
⑦ |
A!=2,X>A |
F3,T4 |
屬第二個(gè)判斷的取TRUE分支 |
⑧ |
A!=2,X<=1 |
F3,F4 |
屬第二個(gè)判斷的取FLASE分支 |
對每個(gè)判斷,要求所有可能的條件取值的組合都必須取到。每個(gè)判斷各有兩個(gè)條件,所以各有4個(gè)條件取值的組合。
注意:這里沒有要求第一個(gè)判斷的4個(gè)組合再與第二個(gè)判斷的4個(gè)組合進(jìn)行組合成16個(gè)組合。
設(shè)計(jì)4個(gè)測試用例,就可覆蓋上面的8種條件組合,如表5所列。
表5 4個(gè)測試取值組合列表
測試用例 |
通過路徑 |
覆蓋條件 |
覆蓋組合號 |
[(2,0,4),(2,0,3)] |
ace(L1) |
T1,T2,T3,T4 |
①⑤ |
[(2,1,1),(2,1,2)] |
abe(L3) |
T1,F2,T3,F4 |
②⑥ |
[(1,0,3),(1,0,4)] |
abe(L3) |
F1,T2,F3,T4 |
③⑦ |
[(1,1,1),(1,1,1)] |
abd(L2) |
F1,F2,F3,F4 |
④⑧ |
?
這些測試用例覆蓋了所有條件的可能取值的組合,覆蓋了所有判斷的可取分支。條件組合覆蓋的不足之處:沒有覆蓋路徑L4,這樣的測試還不完全。
7.?路徑覆蓋
路徑覆蓋就是設(shè)計(jì)足夠的測試用例,覆蓋程序中所有可能的路徑??稍O(shè)計(jì)下面的4個(gè)測試用例,覆蓋全部4條路徑。表6所列是對應(yīng)實(shí)例程序的路徑覆蓋測試用例。
表6 設(shè)計(jì)4個(gè)測試用例覆蓋全部4條路徑
測試用例 |
通過路徑 |
覆蓋條件 |
覆蓋組合號 |
[(2,0,4),(2,0,3)] |
ace(L1) |
T1,T2,T3,T4 |
①⑤ |
[(1,1,1),(1,1,1)] |
abd(L2) |
F1,F2,F3,F4 |
④⑧ |
[(1,1,2),(1,1,3)] |
abe(L3) |
F1,F2,F3,T4 |
④⑦ |
[(3,0,3),(3,0,1)] |
acd(L4) |
T1,T2,F3,F4 |
①⑧ |
路徑覆蓋的不足之處,沒有全部覆蓋判斷的條件取值的組合,如②③⑥。
8. 測試用例的組合和優(yōu)化
對該例子,采用邏輯覆蓋方法中的任何一種都不能滿足所有需求,如果每個(gè)方法都采用,又有測試用例的重復(fù)。如何用最少的測試用例滿足最多的需求呢?在設(shè)計(jì)中,這是一個(gè)值得考慮和解決的問題。
對于本例,我們采用條件組合覆蓋和路徑覆蓋兩種方法設(shè)計(jì)測試用例,并進(jìn)行優(yōu)化,可得到如表7所列的測試用例。
表7 采用條件組合覆蓋和路徑覆蓋設(shè)計(jì)測試用例表
測試用例 |
通過路徑 |
覆蓋條件 |
覆蓋組合號 |
[(2,0,4),(2,0,3)] |
ace(L1) |
T1,T2,T3,T4 |
①⑤ |
[(1,1,1),(1,1,1)] |
abd(L2) |
F1,F2,F3,F4 |
④⑧ |
[(1,1,2),(1,1,3)] |
abe(L3) |
F1,F2,F3,T4 |
④⑦ |
[(3,0,3),(3,0,1)] |
acd(L4) |
T1,T2,F3,F4 |
①⑧ |
[(2,0,4),(2,0,3)] |
ace(L1) |
T1,T2,T3,T4 |
①⑤ |
[(2,1,1),(2,1,2)] |
abe(L3) |
T1,F2,T3,F4 |
②⑥ |
[(1,0,3),(1,0,4)] |
abe(L3) |
F1,T2,F3,T4 |
③⑦ |
[(1,1,1),(1,1,1)] |
abd(L2) |
F1,F2,F3,F4 |
④⑧ |
采用上面的8個(gè)測試用例,可滿足所有邏輯覆蓋測試。?
感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
?
這些資料,對于【軟件測試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴上萬個(gè)測試工程師們走過最艱難的路程,希望也能幫助到你!有需要的小伙伴可以點(diǎn)擊下方小卡片領(lǐng)取?
文章來源:http://www.zghlxwxcb.cn/news/detail-816057.html
?
到了這里,關(guān)于【白盒測試】邏輯覆蓋和路徑測試的設(shè)計(jì)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!