白盒測(cè)試基本要求
- 保證一個(gè)模塊中的所有獨(dú)立路徑至少被執(zhí)行一次;
- 對(duì)所有的邏輯值均需要測(cè)試真俏竞、假兩個(gè)分支至非;
- 在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán);
- 檢查內(nèi)部數(shù)據(jù)結(jié)構(gòu)以確保其有效性勾怒。
測(cè)試覆蓋標(biāo)準(zhǔn)
- 語(yǔ)句覆蓋:是一個(gè)比較弱的測(cè)試標(biāo)準(zhǔn)婆排,它的含義是:選擇足夠的測(cè)試用例,使得程序中每個(gè)語(yǔ)句至少都能被執(zhí)行一次笔链。
- 它是最弱的邏輯覆蓋段只,效果有限,必須與其它方法交互使用鉴扫。
- 判定覆蓋(也稱為分支覆蓋):執(zhí)行足夠的測(cè)試用例赞枕,使得程序中的每一個(gè)分支至少都通過(guò)一次。
- 判定覆蓋只比語(yǔ)句覆蓋稍強(qiáng)一些坪创,但實(shí)際效果表明炕婶,只是判定覆蓋,還不能保證一定能查出在判斷的條件中存在的錯(cuò)誤莱预。因此柠掂,還需要更強(qiáng)的邏輯覆蓋準(zhǔn)則去檢驗(yàn)判斷內(nèi)部條件。
- 條件覆蓋:執(zhí)行足夠的測(cè)試用例依沮,使程序中每個(gè)判斷的每個(gè)條件的每個(gè)可能取值至少執(zhí)行一次涯贞。
- 條件覆蓋深入到判定中的每個(gè)條件,但可能不能滿足判定覆蓋的要求悉抵。
- 判定/條件覆蓋:執(zhí)行足夠的測(cè)試用例肩狂,使得判定中每個(gè)條件取到各種可能的值,并使每個(gè)判定取到各種可能的結(jié)果姥饰。
- 條件組合覆蓋:執(zhí)行足夠的例子傻谁,使得每個(gè)判定中條件的各種可能組合都至少出現(xiàn)一次。
- 這是一種相當(dāng)強(qiáng)的覆蓋準(zhǔn)則列粪,可以有效地檢
查各種可能的條件取值的組合是否正確审磁。 - 它不但可覆蓋所有條件的可能取值的組合,還可覆蓋所有判斷的可取分支岂座,但可能有的路徑會(huì)遺漏掉态蒂。
- 測(cè)試還不完全。
主要方法
- 邏輯驅(qū)動(dòng)測(cè)試
- 語(yǔ)句覆蓋
- 判定覆蓋
- 條件覆蓋
- 判定/條件覆蓋
- 條件組合覆蓋
- 路徑測(cè)試
- 路徑測(cè)試就是設(shè)計(jì)足夠多的測(cè)試用例费什,覆蓋被測(cè)試對(duì)象中的所有可能路徑钾恢。這是最強(qiáng)的覆蓋準(zhǔn)則。
- 基本路徑測(cè)試:設(shè)計(jì)足夠多的測(cè)試用例,運(yùn)行所測(cè)程序瘩蚪,要覆蓋程序中所有可能的路徑泉懦。但在路徑數(shù)目很大時(shí),真正做到完全覆蓋是很困難的疹瘦,必須把覆蓋路徑數(shù)目壓縮到一定限度崩哩。例如程序中的循環(huán)體只執(zhí)行一次。
語(yǔ)句覆蓋
例1:
PROCEDURE M(VAR A言沐,B邓嘹,X:REAL);
BEGIN
IF ((A>1) AND (B=0)) THEN X:=X/A险胰;
IF ((A=2) OR (X>1)) THEN X:=X+1汹押;
END.
為使程序中每個(gè)語(yǔ)句至少執(zhí)行一次,只需設(shè)計(jì)一個(gè)能通過(guò)路徑ace的例子就可以了鸯乃,例如選擇輸入數(shù)據(jù)為: A=2鲸阻,B=0,X=3
從上例可看出缨睡,語(yǔ)句覆蓋實(shí)際上是很弱的鸟悴,如果第一個(gè)條件語(yǔ)句中的AND錯(cuò)誤地編寫成OR,上面的測(cè)試用例是不能發(fā)現(xiàn)這個(gè)錯(cuò)誤的奖年;又如第三個(gè)條件語(yǔ)句中X>1誤寫成X>0细诸,這個(gè)測(cè)試用例也不能暴露它,此外陋守,沿著路徑abd執(zhí)行時(shí)震贵,X的值應(yīng)該保持不變,如果這一方面有錯(cuò)誤水评,上述測(cè)試數(shù)據(jù)也不能發(fā)現(xiàn)它們猩系。
例2:
void DoWork(int x,int y,int z)
{ int k=0,j=0;
if((x>3)&&(z<10))
{ k=x*y-1; //語(yǔ)句塊1
j=sqrt(k);
}
if((x= =4)||(y>5))
{ j=x*y+10; //語(yǔ)句塊2
}
j=j%3; //語(yǔ)句塊3
}
為了測(cè)試語(yǔ)句覆蓋率只要設(shè)計(jì)一個(gè)測(cè)試用例就可以把三個(gè)執(zhí)行語(yǔ)句塊中的語(yǔ)句覆蓋了。測(cè)試用例輸入為:x=4中燥、y=5寇甸、z=5,程序執(zhí)行的路徑是:abd
該測(cè)試用例雖然覆蓋了可執(zhí)行語(yǔ)句疗涉,但并不能檢查判斷邏輯是否有問(wèn)題拿霉,例如在第一個(gè)判斷中把&&錯(cuò)誤的寫成了||,則上面的測(cè)試用例仍可以覆蓋所有的執(zhí)行語(yǔ)句咱扣。
判定覆蓋
例1:
如果設(shè)計(jì)兩個(gè)例子绽淘,使它們能通過(guò)路徑ace和abd,或者通過(guò)路徑acd和abe闹伪,就可達(dá)到“判定覆蓋”標(biāo)準(zhǔn)沪铭,為此壮池,可以選擇輸入數(shù)據(jù)為:
① A=3,B=0伦意,X=1(沿路徑acd執(zhí)行)
② A=2火窒,B=1,X=3(沿路徑abe執(zhí)行)
例2:
如果設(shè)計(jì)兩個(gè)測(cè)試用例則可以滿足條件覆蓋的要求驮肉。測(cè)試用例的輸入為:
x=4、y=5已骇、z=5【a b d】
x=2离钝、y=5、z=5【a c e】
上面的兩個(gè)測(cè)試用例雖然能夠滿足條件覆蓋的要求褪储,但是也不能對(duì)判斷條件進(jìn)行檢查卵渴,例如把第二個(gè)條件y>5錯(cuò)誤的寫成y<5,、上面的測(cè)試用例同樣滿足了分支覆蓋鲤竹。
注意:程序中含有判定的語(yǔ)句包括IF-THEN-ELSE浪读、DO-WHILE、REPEAT-UNTIL等辛藻,除了雙值的判定語(yǔ)句外碘橘,還有多值的判定語(yǔ)句,如PASCAL中的CASE語(yǔ)句吱肌、FORTRAN中帶有三個(gè)分支的IF語(yǔ)句等痘拆。所以“分支覆蓋”更一般的含義是:使得每一個(gè)分支獲得每一種可能的結(jié)果。
條件覆蓋
一個(gè)判定中往往包含了若干個(gè)條件氮墨,如例1的程序中纺蛆,判定 (A>1) AND (B=0)包含了兩個(gè)條件: A>1以及 B=0,所以可引進(jìn)一個(gè)更強(qiáng)的覆蓋標(biāo)準(zhǔn)——“條件覆蓋”规揪。
例1的程序有四個(gè)條件:
A>1桥氏、 B=0、A=2猛铅、X>1
為了達(dá)到“條件覆蓋”標(biāo)準(zhǔn)字支,需要執(zhí)行足夠的測(cè)試用例使得在a點(diǎn)有: A>1、A≤1奕坟、B=0祥款、B≠0 等各種結(jié)果出現(xiàn),以及在b點(diǎn)有: A=2月杉、A≠2刃跛、X>1、X≤1 等各種結(jié)果出現(xiàn)苛萎。
現(xiàn)在只需設(shè)計(jì)以下兩個(gè)測(cè)試用例就可滿足這一標(biāo)準(zhǔn):
① A=2桨昙,B=0检号,X=4 (沿路徑ace執(zhí)行)
② A=1,B=1蛙酪,X=1 (沿路徑abd執(zhí)行)
對(duì)例2中的所有條件取值加以標(biāo)記齐苛。
對(duì)于第一個(gè)判斷:
條件x>3 取真值為T1,取假值為-T1
條件z<10 取真值為T2桂塞,取假值為-T2對(duì)于第二個(gè)判斷:
條件x=4 取真值為T3凹蜂,取假值為-T3
條件y>5 取真值為T4,取假值為-T4-
則可以設(shè)計(jì)測(cè)試用例如下
條件覆蓋測(cè)試用例
注意:
“條件覆蓋”通常比“分支覆蓋”強(qiáng)阁危,因?yàn)樗挂粋€(gè)判定中的每一個(gè)條件都取到了兩個(gè)不同的結(jié)果玛痊,而判定覆蓋則不保證這一點(diǎn)。
“條件覆蓋”并不包含“分支覆蓋”狂打,如對(duì)語(yǔ)句IF(A AND B)THEN S 設(shè)計(jì)測(cè)試用例使其滿足"條件覆蓋",即使A為真并使B為假,以及使A為假而且B為真,但是它們都未能使語(yǔ)句S得以執(zhí)行擂煞。
如對(duì)例2設(shè)計(jì)了下面的測(cè)試用例,則雖然滿足了條件覆蓋趴乡,但只覆蓋了第一個(gè)條件的取假分支和第二個(gè)條件的取真分支对省,不滿足分支覆蓋的要求。
分支(判定)/條件覆蓋
針對(duì)上面的問(wèn)題引出了另一種覆蓋標(biāo)準(zhǔn)——“分支(判定)/條件覆蓋”晾捏,它的含義是:執(zhí)行足夠的測(cè)試用例蒿涎,使得分支中每個(gè)條件取到各種可能的值,并使每個(gè)分支取到各種可能的結(jié)果粟瞬。
- 對(duì)例1的程序同仆,前面的兩個(gè)例子
① A=2,B=0裙品,X=4 (沿ace路徑)
② A=1俗批,B=1,X=1 (沿abd路徑)
是滿足這一標(biāo)準(zhǔn)的市怎。 -
對(duì)例2岁忘,根據(jù)定義只需設(shè)計(jì)以下兩個(gè)測(cè)試用例便可以覆蓋8個(gè)條件值以及4個(gè)判斷分支。
分支(判定)/條件覆蓋測(cè)試用例
分支/條件覆蓋從表面來(lái)看区匠,它測(cè)試了所有條件的取值干像,但是實(shí)際上某些條件掩蓋了另一些條件。
- 例如對(duì)于條件表達(dá)式(x>3)&&(z<10)來(lái)說(shuō)驰弄,必須兩個(gè)條件都滿足才能確定表達(dá)式為真麻汰。
- 如果(x>3)為假則一般的編譯器不在判斷是否z<10了。對(duì)于第二個(gè)表達(dá)式(x==4)||(y>5)來(lái)說(shuō)戚篙,若x==4測(cè)試結(jié)果為真五鲫,就認(rèn)為表達(dá)式的結(jié)果為真,這時(shí)不再檢查(y>5)條件了岔擂。
- 因此位喂,采用分支/條件覆蓋浪耘,邏輯表達(dá)式中的錯(cuò)誤不一定能夠查出來(lái)了。
條件組合覆蓋
針對(duì)上述問(wèn)題又提出了另一種標(biāo)準(zhǔn)——“條件組合覆蓋”塑崖。它的含義是:執(zhí)行足夠的例子七冲,使得每個(gè)判定中條件的各種可能組合都至少出現(xiàn)一次。滿足“條件組合覆蓋”的測(cè)試用例是一定滿足“分支覆蓋”规婆、“條件覆蓋”和“分支/條件覆蓋”的澜躺。
- 再看例1的程序,我們需要選擇適當(dāng)?shù)睦恿兀沟孟旅?種條件組合都能夠出現(xiàn):
1) A>1, B=0 2) A>1, B≠0
3) A≤1, B=0 4) A≤1, B≠0
5) A=2, X>1 6) A=2, X≤1
7) A≠2, X>1 8) A≠2, X≤1
5)苗踪、 6)、 7)削锰、8)四種情況是第二個(gè) IF語(yǔ)句的條件組合,而X的值在該語(yǔ)句之前是要經(jīng)過(guò)計(jì)算的毕莱,所以還必須根據(jù)程序的邏輯推算出在程序的入口點(diǎn)X的輸入值應(yīng)是什么器贩。
下面設(shè)計(jì)的四個(gè)例子可以使上述 8種條件組合至少出現(xiàn)一次:
① A=2,B=0朋截,X=4
使 1)蛹稍、5)兩種情況出現(xiàn);
② A=2部服,B=1唆姐,X=1
使 2)、6)兩種情況出現(xiàn)廓八;
③ A=1奉芦,B=0,X=2
使 3)剧蹂、7)兩種情況出現(xiàn)声功;
④ A=1,B=1宠叼,X=1
使 4)先巴、8)兩種情況出現(xiàn)。
上面四個(gè)例子雖然滿足條件組合覆蓋冒冬,但并不能覆蓋程序中的每一條路徑伸蚯,例如路徑acd就沒(méi)有執(zhí)行,因此简烤,條件組合覆蓋標(biāo)準(zhǔn)仍然是不徹底剂邮。
- 現(xiàn)對(duì)例2中的各個(gè)判斷的條件取值組合加以標(biāo)記如下:
1、x>3,z<10 記做T1 T2乐埠,第一個(gè)判斷的取真分支
2抗斤、x>3,z>=10 記做T1 -T2囚企,第一個(gè)判斷的取假分支
3、x<=3,z<10 記做-T1 T2瑞眼,第一個(gè)判斷的取假分支
4龙宏、x<=3,z>=10 記做-T1 -T2,第一個(gè)判斷的取假分支
5伤疙、x=4,y>5 記做T3 T4银酗,第二個(gè)判斷的取真分支
6、x=4,y<=5 記做T3 -T4徒像,第二個(gè)判斷的取真分支
7黍特、x!=4,y>5 記做-T3 T4,第二個(gè)判斷的取真分支
8锯蛀、x!=4,y<=5 記做-T3 -T4灭衷,第二個(gè)判斷的取假分支
根據(jù)定義取4個(gè)測(cè)試用例,就可以覆蓋上面8種條件取值的組合旁涤。
測(cè)試用例如下表:
上面的測(cè)試用例覆蓋了所有條件的可能取值的組合翔曲,覆蓋了所有判斷的可取分支,但是卻丟失了一條路徑abe劈愚。
路徑測(cè)試
-
對(duì)于例1瞳遍,下面的測(cè)試用例則可對(duì)程序進(jìn)行全部的路徑覆蓋。
路徑測(cè)試測(cè)試用例 -
對(duì)于例2菌羽,下面的測(cè)試用例則可對(duì)程序進(jìn)行全部的路徑覆蓋掠械。
路徑覆蓋測(cè)試用例
基本路徑測(cè)試
基本路徑測(cè)試在程序控制圖的基礎(chǔ)上,通過(guò)分析控制構(gòu)造的環(huán)行(圈注祖,loop)復(fù)雜性猾蒂,導(dǎo)出基本可執(zhí)行路徑集合,從而設(shè)計(jì)測(cè)試用例的方法氓轰。設(shè)計(jì)出的測(cè)試用例要保證在測(cè)試中程序的每一個(gè)可執(zhí)行語(yǔ)句至少執(zhí)行一次婚夫。 包括以下4個(gè)步驟和一個(gè)工具方法。
4個(gè)步驟:
- 程序的控制流圖:描述程序控制流的一種圖示方法
- 程序圈復(fù)雜度:McCabe復(fù)雜性度量署鸡。從程序的環(huán)路復(fù)雜性可導(dǎo)出程序基本路徑集合中的獨(dú)立路徑條數(shù)案糙。
- 導(dǎo)出測(cè)試用例:根據(jù)圈復(fù)雜度和程序結(jié)構(gòu)設(shè)計(jì)用例數(shù)據(jù)輸入和預(yù)期結(jié)果。
- 準(zhǔn)備測(cè)試用例:確毖デ欤基本路徑集中的每一條路徑的執(zhí)行时捌。
一個(gè)方法:
圖形矩陣:是在基本路徑測(cè)試中起輔助作用的軟件工具,利用它可以實(shí)現(xiàn)自動(dòng)地確定一個(gè)基本路徑集炉抒。
控制流圖的符號(hào)
在介紹基本路徑方法之前奢讨,必須先介紹一種簡(jiǎn)單的控制流表示方法,即流圖焰薄。
流圖是對(duì)待測(cè)試程序過(guò)程處理的一種表示拿诸。
-
流圖使用下面的符號(hào)描述邏輯控制流扒袖,每一種結(jié)構(gòu)化構(gòu)成元素有一個(gè)相應(yīng)的流圖符號(hào)。
控制流圖的符號(hào) 流圖只有二種圖形符號(hào)
圖中的每一個(gè)圓稱為流圖的結(jié)點(diǎn)亩码,代表一條或多條語(yǔ)句季率。
流圖中的箭頭稱為邊或連接,代表控制流描沟。
在將程序流程圖簡(jiǎn)化成控制流圖時(shí)飒泻,應(yīng)注意:
在選擇或多分支結(jié)構(gòu)中,分支的匯聚處應(yīng)有一個(gè)匯聚結(jié)點(diǎn)吏廉。
-
邊和結(jié)點(diǎn)圈定的區(qū)域叫做區(qū)域泞遗,當(dāng)對(duì)區(qū)域計(jì)數(shù)時(shí),圖形外的區(qū)域也應(yīng)記為一個(gè)區(qū)域席覆。
程序流程圖簡(jiǎn)化成控制流圖 如果判斷中的條件表達(dá)式是由一個(gè)或多個(gè)邏輯運(yùn)算符 (OR, AND, NAND, NOR) 連接的復(fù)合條件表達(dá)式史辙,則需要改為一系列只有單條件的嵌套的判斷。例如:
1 if a or b
2 x
3 else
4 y
對(duì)應(yīng)的邏輯為
獨(dú)立路徑
獨(dú)立路徑:至少沿一條新的邊移動(dòng)的路徑
-
第一步:畫出控制流圖
流程圖用來(lái)描述程序控制結(jié)構(gòu)佩伤。
可將流程圖映射到一個(gè)相應(yīng)的流圖(假設(shè)流程圖的菱形決定框中不包含復(fù)合條件)髓霞。
在流圖中,每一個(gè)圓畦戒,稱為流圖的結(jié)點(diǎn),代表一個(gè)或多個(gè)語(yǔ)句结序。
一個(gè)處理方框序列和一個(gè)菱形決測(cè)框可被映射為一個(gè)結(jié)點(diǎn)障斋,流圖中的箭頭,稱為邊或連接徐鹤,代表控制流垃环,類似于流程圖中的箭頭。
一條邊必須終止于一個(gè)結(jié)點(diǎn)返敬,即使該結(jié)點(diǎn)并不代表任何語(yǔ)句(例如:if-else-then結(jié)構(gòu))遂庄。
由邊和結(jié)點(diǎn)限定的范圍稱為區(qū)域。
-
計(jì)算區(qū)域時(shí)應(yīng)包括圖外部的范圍劲赠。
代碼
第一步 -
第二步:計(jì)算圈復(fù)雜度
圈復(fù)雜度是一種為程序邏輯復(fù)雜性提供定量測(cè)度的軟件度量涛目,將該度量用于計(jì)算程序的基本的獨(dú)立路徑數(shù)目。獨(dú)立路徑必須包含一條在定義之前不曾用到的邊凛澎。
有以下三種方法計(jì)算圈復(fù)雜度:
- 流圖中區(qū)域的數(shù)量對(duì)應(yīng)于環(huán)型的復(fù)雜性霹肝;
- 給定流圖G的圈復(fù)雜度V(G),定義為V(G)=E-N+2塑煎,E是流圖中邊的數(shù)量沫换,N是流圖中結(jié)點(diǎn)的數(shù)量;
-
給定流圖G的圈復(fù)雜度V(G)最铁,定義為V(G)=P+1讯赏,P是流圖G中判定結(jié)點(diǎn)的數(shù)量垮兑。
計(jì)算圈復(fù)雜度
-
第三步:導(dǎo)出測(cè)試用例
根據(jù)上面的計(jì)算方法,可得出四個(gè)獨(dú)立的路徑漱挎。(V(G)值正好等于該程序的獨(dú)立路徑的條數(shù)系枪。)
路徑1:4-14
路徑2:4-6-7-14
路徑3:4-6-8-10-13-4-14
路徑4:4-6-8-11-13-4-14
根據(jù)上面的獨(dú)立路徑,去設(shè)計(jì)輸入數(shù)據(jù)识樱,使程序分別執(zhí)行到上面四條路徑嗤无。
-
第四步:準(zhǔn)備測(cè)試用例
為了確保基本路徑集中的每一條路徑的執(zhí)行怜庸,根據(jù)判斷結(jié)點(diǎn)給出的條件当犯,選擇適當(dāng)?shù)臄?shù)據(jù)以保證某一條路徑可以被測(cè)試到,滿足上面例子基本路徑集的測(cè)試用例是:
必須注意割疾,一些獨(dú)立的路徑嚎卫,往往不是完全孤立的,有時(shí)它是程序正常的控制流的一部分宏榕,這時(shí)拓诸,這些路徑的測(cè)試可以是另一條路徑測(cè)試的一部分。
工具方法:圖形矩陣
- 導(dǎo)出控制流圖和決定基本測(cè)試路徑的過(guò)程均需要機(jī)械化麻昼,為了開(kāi)發(fā)輔助基本路徑測(cè)試的軟件工具奠支,稱為圖形矩陣的數(shù)據(jù)結(jié)構(gòu)很有用。
- 利用圖形矩陣可以實(shí)現(xiàn)自動(dòng)地確定一個(gè)基本路徑集抚芦。
- 一個(gè)圖形矩陣是一個(gè)方陣倍谜,其行/列數(shù)控制流圖中的結(jié)點(diǎn)數(shù),每行和每列依次對(duì)應(yīng)到一個(gè)被標(biāo)識(shí)的結(jié)點(diǎn)叉抡,矩陣元素對(duì)應(yīng)到結(jié)點(diǎn)間的連接(即邊)尔崔。
- 在圖中,控制流圖的每一個(gè)結(jié)點(diǎn)都用數(shù)字加以標(biāo)識(shí)褥民,每一條邊都用字母加以標(biāo)識(shí)季春。
- 如果在控制流圖中第i個(gè)結(jié)點(diǎn)到第j個(gè)結(jié)點(diǎn)有一個(gè)名為x的邊相連接,則在對(duì)應(yīng)的圖形矩陣中第i行/第j列有一個(gè)非空的元素x消返。
對(duì)每個(gè)矩陣項(xiàng)加入連接權(quán)值载弄,圖矩陣就可以用于在測(cè)試中評(píng)估程序的控制結(jié)構(gòu),連接權(quán)值為控制流提供了另外的信息侦副。最簡(jiǎn)單情況下侦锯,連接權(quán)值是 1(存在連接)或0(不存在連接),但是秦驯,連接權(quán)值可以賦予更有趣的屬性:
1. 執(zhí)行連接(邊)的概率尺碰。
2. 穿越連接的處理時(shí)間。
3. 穿越連接時(shí)所需的內(nèi)存。
4. 穿越連接時(shí)所需的資源亲桥。
連接權(quán)為“1”表示存在一個(gè)連接洛心,在圖中如果一行有兩個(gè)或更多的元素“1”,則這行所代表的結(jié)點(diǎn)一定是一個(gè)判定結(jié)點(diǎn)题篷,通過(guò)連接矩陣中有兩個(gè)以上(包括兩個(gè))元素為“1”的個(gè)數(shù)词身,就可以得到確定該圖圈復(fù)雜度的另一種算法。