《軟件測試技術(shù)》課件5白盒測試_第1頁
《軟件測試技術(shù)》課件5白盒測試_第2頁
《軟件測試技術(shù)》課件5白盒測試_第3頁
《軟件測試技術(shù)》課件5白盒測試_第4頁
《軟件測試技術(shù)》課件5白盒測試_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

白盒測試白盒測試白盒測試(WhiteBoxTesting

)白盒測試又叫結(jié)構(gòu)測試,邏輯驅(qū)動測試或基于程序本身的測試。

白盒測試測試用例被測程序源程序分析覆蓋情況分析執(zhí)行路徑例:含4個分支,循環(huán)次數(shù)≤20,計算從A到B的可能路徑。徹底的白盒測試AB白盒測試白盒測試方法:

控制流測試邏輯覆蓋路徑測試數(shù)據(jù)流測試基于程序片的測試本章主要內(nèi)容程序結(jié)構(gòu)分析邏輯覆蓋測試基路徑測試數(shù)據(jù)流測試基于程序片的測試5.1程序結(jié)構(gòu)分析程序流程圖控制流圖基本概念有向圖路徑半路徑可達(dá)簡單路徑回路路徑A覆蓋路徑B程序控制流圖控制流圖是退化的程序流程圖,圖中每個處理都退化成一個結(jié)點(diǎn),流線變成連接不同結(jié)點(diǎn)的有向弧。在控制流圖中用圓“○”表示節(jié)點(diǎn),一個圓代表一條或多條語句。控制流圖中的基本元素:節(jié)點(diǎn)邊基本控制流圖順序結(jié)構(gòu)IF選擇結(jié)構(gòu)While循環(huán)結(jié)構(gòu)Until循環(huán)結(jié)構(gòu)Case多分支結(jié)構(gòu)例:(a)程序流程圖i=0i<100i++n=n+il=l+ii%2==0開始結(jié)束FalseFalseTrueTrue(b)控制流圖6354217e1e2e3e4e5e6e8e7R1R2R3

復(fù)合邏輯下的控制流圖aorbx++x--(a)(b)(c)ax++x++x--b請編寫程序:求正整數(shù)m和n的最大公約數(shù)和最小公倍數(shù)。繪制控制流圖。練習(xí)邏輯覆蓋(LogicCoverageTesting)語句覆蓋判定覆蓋(分支覆蓋)條件覆蓋判定-條件覆蓋條件組合覆蓋路徑覆蓋5.2邏輯覆蓋例子程序:if((A>1)&&(B==0))X=X/A;if((A==2)||(X>1))X=X+1;程序框圖(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc1.語句覆蓋設(shè)計若干條測試用例,使程序中每條可執(zhí)行語句至少執(zhí)行一次。用例ABX執(zhí)行路徑Case1203aceCase2213abe√×語句覆蓋Case1:A=2,B=0,X=3(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc語句覆蓋Case2:A=2,B=1,X=3(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc此語句未覆蓋語句覆蓋Case1:A=2,B=0,X=3(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc錯寫成OR錯寫成AND語句覆蓋是最弱的覆蓋語句覆蓋2.判定覆蓋(分支覆蓋)設(shè)計測試用例,使程序中的每個邏輯判斷的取真和取假的分支至少經(jīng)歷一次。用例ABX執(zhí)行路徑Case1203aceCase3101abdCase1:A=2,B=0,X=3(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc判定覆蓋Case3:A=1,B=0,X=1(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc判定覆蓋

只作到判定覆蓋將無法確定判定內(nèi)部條件的錯誤。(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc錯寫成X<1判定覆蓋Case4:A=3,B=0,X=3

Case5:A=2,B=1,X=1

因此判定覆蓋仍是弱的覆蓋標(biāo)準(zhǔn)。a(A>1)AND

(B==0)(A==2)OR(X>1)X=X/AX=X+1eFFTTbdc錯寫成X<1例:說明:以上僅考慮了兩出口的判斷,我們還應(yīng)把判定覆蓋準(zhǔn)則擴(kuò)充到多出口判斷(如Case語句)的情況。因此,判定覆蓋更為廣泛的含義應(yīng)該是使得每一個判定獲得每一種可能的結(jié)果至少一次。16352789410判定覆蓋3.條件覆蓋設(shè)計若干測試用例,使程序的每個判定中的每個條件的可能取值至少滿足一次上例中設(shè)條件:

A>1T1F1B=0T2F2A=2T3F3X>1T4F4取真表為取假表為滿足條件覆蓋的一組測試用例ABX路徑覆蓋分支覆蓋條件Case6211abebeT1F2T3F4Case7103abebeF1T2F3T43.條件覆蓋條件覆蓋

Case6:A=2,B=1,X=1

Case7:A=1,B=0,X=3(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc

兩個測試用例覆蓋了四個條件八種可能取值。但未覆蓋c、d分支,不滿足判定覆蓋的要求。條件覆蓋條件覆蓋不一定包含判定覆蓋判定覆蓋也不一定包含條件覆蓋

為解決這一矛盾,需要對條件和分支兼顧,為此引入了判定-條件覆蓋。4.判定-條件覆蓋使判定中每個條件的可能取值至少滿足一次,并且使每個判定分支至少執(zhí)行一次。判定-條件覆蓋能同時滿足判定、條件兩種覆蓋標(biāo)準(zhǔn)。滿足判定-條件覆蓋的一組測試用例ABX路徑覆蓋分支覆蓋條件Case1203aceceT1T2T3T4Case8111abdbdF1F2F3F4(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdcCase1:A=2,B=0,X=3Case8:A=1,B=1,X=1(A>1)AND

(B==0)(A==2)OR(X>1)aX=X/AX=X+1eFFTTbdc5.條件組合覆蓋設(shè)計用例,使得每個判斷表達(dá)式中條件的各種可能組合都至少出現(xiàn)一次;上例中需考慮4個條件的8種組合①A>1,B=0T1T2判定一為真②A>1,B≠0T1F2③A≤1,B=0F1T2判定一為假④A≤1,B≠0F1F2

⑤A=2,X>1T3T4⑥A=2,X≤1T3F4

判定二為真⑦A≠2,X>1F3T4⑧A≠2,X≤1F3

F4判定二為假滿足條件組合覆蓋的一組測試用例ABX路徑覆蓋組號覆蓋條件Case1203ace①⑤T1T2T3T4Case8211abe②⑥T1F2T3F4Case9103abe③⑦F1T2F3T4Case10111abd④⑧F1F2F3F46.路徑覆蓋設(shè)計足夠多的測試用例,覆蓋程序中的每條可能路徑。上述滿足條件組合覆蓋的測試用例不能覆蓋路徑acd。滿足路徑覆蓋的一組測試用例用例ABX執(zhí)行路徑Case1203aceCase7101abdCase8211abeCase11301acd小結(jié)語句覆蓋判定覆蓋條件覆蓋判定/條件覆蓋條件組合覆蓋路徑覆蓋例:publicvoidwork(intx,inty,intz){1

intk=0,j=0;2if((x>3)&&(z<10)){3k=x*y-1;4j=sqrt(k);5}6if((x==4)||(y>5))7j=x*y+10;8j=j%3;}(1)程序流程圖和控制流圖

程序流程圖控制流圖12834657(x>3)and(z<10)(x==4)or(y>5))j=j%3;j=x*y+10;k=x*y-1;k=0,j=0;j=sqrt(k);(2)設(shè)計測試用例語句覆蓋x=4、y=5、z=5。判定覆蓋x=4、y=5、z=5,其執(zhí)行路徑是:1-2-3-4-5-6-7-8x=2、y=5、z=5,其執(zhí)行路徑是:1-2-5-5-6-8條件覆蓋本例有四個條件:x>3;z<10;x=4;y>5;設(shè)計測試用例使每個條件分別取真和取假;x=2、y=6、z=5,其執(zhí)行路徑是:1-2-5-6-7-8x=4、y=5、z=15,其執(zhí)行路徑是:1-2-5-6-7-8設(shè)計測試用例(續(xù))判定-條件覆蓋要求同時滿足判定和條件覆蓋,設(shè)計的測試用例為:x=4、y=6、z=5,其執(zhí)行路徑是:1-2-3-4-5-6-7-8x=2、y=5、z=15,其執(zhí)行路徑是:1-2-5-6-8設(shè)計測試用例(續(xù))條件組合覆蓋條件組合覆蓋要求每個判定的所有可能條件取值組合至少執(zhí)行一次。選取的一組測試用例如下:x=4、y=6、z=5,其執(zhí)行路徑是:1-2-3-4-5-6-7-8x=4、y=5、z=15,其執(zhí)行路徑是:1-2-5-6-7-8x=2、y=6、z=5,其執(zhí)行路徑是:1-2-5-6-7-8x=2、y=5、z=15,其執(zhí)行路徑是:1-2-5-6-8設(shè)計測試用例(續(xù))設(shè)計測試用例(續(xù))路徑覆蓋路徑覆蓋要求覆蓋程序中所有可能的路徑。本例中可能的執(zhí)行路徑有四條:x=4、y=6、z=5,其執(zhí)行路徑是:1-2-3-4-5-6-7-8x=4、y=5、z=15,其執(zhí)行路徑是:1-2-5-6-7-8x=5、y=5、z=5,其執(zhí)行路徑是:1-2-3-4-5-6-8x=2、y=5、z=15,其執(zhí)行路徑是:1-2-5-6-8習(xí)題1.三角形問題編寫程序?qū)崿F(xiàn)三角形問題,然后用條件覆蓋設(shè)計測試用例。2.NextDate問題編寫程序?qū)崿F(xiàn)NextDate問題,然后用邏輯覆蓋各方法設(shè)計測試用例。例:求完數(shù)#

include

<iostream>

using

namespace

std;//求1到k之間的完數(shù)

voidperfect_number

(intk)

{

int

n,i,sum;

for(n=2;n<k;n++)

{

sum=0;

for

(i=1;i<n;i++)

{

if

(n%i==0)

sum

=sum+i;

}

if

(sum

==n)

cout

<<n<<endl;

}

}

如何測試?5.3路徑測試程序環(huán)路復(fù)雜性基路徑測試循環(huán)測試路徑覆蓋的困難含4個分支,循環(huán)次數(shù)≤20,從A到B的可能路徑:AB=5+5+..+5+5≈1020121914問題引入1.程序環(huán)路復(fù)雜性

程序的環(huán)路復(fù)雜性即McCabe復(fù)雜性度量,簡單的定義為控制流圖的區(qū)域數(shù)。程序環(huán)路復(fù)雜性又叫圈復(fù)雜度。圈復(fù)雜度圈復(fù)雜度:是一種為程序邏輯復(fù)雜性提供定量測度的軟件度量,將該度量用于計算程序的基本的獨(dú)立路徑數(shù)目。程序圖的圈復(fù)雜度計算方法(三種):V(G)=e–n+2p;e:邊數(shù),n:節(jié)點(diǎn)數(shù),p:連接區(qū)域數(shù)當(dāng)p=1時,V(G)=e–n+2;V(G)=P+1;P是圖G中判定節(jié)點(diǎn)的數(shù)量程序圖中區(qū)域的數(shù)量對應(yīng)于環(huán)路的復(fù)雜性;圈復(fù)雜度(續(xù))例:計算圈復(fù)雜度3EDBACFG9187654210R1R5R4R3R2獨(dú)立路徑獨(dú)立路徑:包括一組以前沒有處理的語句或條件的一條路徑。選擇獨(dú)立路徑時必須包含一條在定義之前不曾用到的邊。(每一條新的路徑至少包含一條新的邊)控制流圖中所有獨(dú)立路徑的集合就構(gòu)成了基本路徑集。例:716548143921312111015控制流圖請找出獨(dú)立路徑計算圈復(fù)雜度獨(dú)立路徑圖形矩陣為了提高測試效率,導(dǎo)出控制流圖和選擇基本測試路徑的過程均需要自動化。對于開發(fā)輔助基本路徑測試的軟件工具,圖形矩陣(graphmatrix)的數(shù)據(jù)結(jié)構(gòu)很有用。

圖形矩陣定義:有m個節(jié)點(diǎn)的控制流圖矩陣,是一個m×m矩陣:A=(a(i,j)),其中a(i,j)是1,當(dāng)且僅當(dāng)從節(jié)點(diǎn)i到節(jié)點(diǎn)j有一條弧,否則該元素為0??刂屏鲌D矩陣n1n2n3n4n5n6n7n10100000n20010001n30001100n40000010n50000010n60100000n70000000(b)控制流圖矩陣根據(jù)圖形矩陣能計算圈復(fù)雜度和獨(dú)立路徑嗎?6354217e1e2e3e4e5e6e8e7R1R2R3(a)控制流圖2.基路徑測試如果把覆蓋的路徑數(shù)壓縮到一定限度內(nèi),例如程序中的循環(huán)體只執(zhí)行零次和一次,就成為基路徑測試?;韭窂綔y試法通過分析程序控制流圖的環(huán)路的復(fù)雜性,導(dǎo)出基本路徑集合,從而設(shè)計測試用例,保證這些路徑至少通過一次?;韭窂綔y試步驟:1.導(dǎo)出程序的控制流圖;2.計算控制流圖的環(huán)路復(fù)雜度V(G);3.確定只包含獨(dú)立路徑的基本路徑集;4.設(shè)計測試用例;基本路徑測試法課堂練習(xí):publicvoidf(intRecordNum,intType){intx=0;inty=0;while(RecordNum>0){ if(Type==0) x=y+2;else{ if(Type==1) x=y+5;elsex=y+10;}RecordNum--}}請用基本路徑法測試右邊的程序代碼。繪制控制流圖5176438911210publicvoidf(intRecordNum,intType){intx=0;inty=0;while(RecordNum>0){ if(Type==0) x=y+2;else{ if(Type==1) x=y+5;elsex=y+10;}RecordNum--}}案例:選擇排序publicvoidselect_sort(inta[]){inti,j,k,t,n=a.length;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){

if(a[j]<a[k]) k=j;}if(i!=k){ t=a[k]; a[k]=a[i]; a[i]=t;}}}要求:(1)計算此程序段的圈復(fù)雜度;(2)用基本路徑法給出測試路徑;(3)為各測試路徑設(shè)計測試用例。能直接看圈復(fù)雜度嗎?案例:選擇排序(續(xù)1)(a)程序流程圖k=i;j=i+1;k=jj++j<na[j]<a[k]i

ka[j]]

a[k]i++i<n-1FalseTrueFalse開始結(jié)束n=a.length;i=0TrueFalseTrueTrueFalse1234876510911(b)控制流圖案例:選擇排序(續(xù)2)基路徑測試計算圈復(fù)雜度V(G)=e–n+2;基本路徑集找出獨(dú)立路徑設(shè)計測試用例設(shè)計測試數(shù)據(jù),覆蓋基本路徑集5.3.2循環(huán)測試循環(huán)可以劃分為簡單循環(huán)串接循環(huán)嵌套循環(huán)非結(jié)構(gòu)循環(huán)簡單循環(huán)串接循環(huán)嵌套循環(huán)非結(jié)構(gòu)循環(huán)循環(huán)結(jié)構(gòu)簡單循環(huán)測試需設(shè)計五種測試:零次循環(huán);一次循環(huán);兩次通過循環(huán);m次通過循環(huán),m<循環(huán)最大次數(shù);n-1,n,n+1次通過循環(huán)。其中n是允許通過循環(huán)的最大次數(shù)。為了提高測試效率,至少需要5個測試用例,即循環(huán)次數(shù)等于0,1,m,n,n,n+1。嵌套循環(huán)測試嵌套循環(huán)可按照下面的方法進(jìn)行測試:從最內(nèi)層循環(huán)開始,將所有其它層的循環(huán)設(shè)置為最小值;對最內(nèi)層循環(huán)使用簡單循環(huán)的全部測試。由內(nèi)向外構(gòu)造下一個循環(huán)的測試。測試時保持所有外層循環(huán)的循環(huán)變量取最小值,并使其它嵌套內(nèi)層循環(huán)的循環(huán)變量取“典型”值;反復(fù)進(jìn)行,直到測試所有的循環(huán)。串接循環(huán)兩個或多個簡單的循環(huán)串接在一起,稱為串接循環(huán)。如果兩個或多個循環(huán)毫不相干,則應(yīng)作為獨(dú)立的簡單循環(huán)測試。如果兩個循環(huán)串接起來,而第一個循環(huán)是第二個循環(huán)的初始值,則這兩個循環(huán)并不是獨(dú)立的。如果循環(huán)不獨(dú)立,則推薦使用嵌套循環(huán)的方法進(jìn)行測試。非結(jié)構(gòu)循環(huán)不能測試,盡量重新設(shè)計為結(jié)構(gòu)化的程序結(jié)構(gòu)后再進(jìn)行測試。案例:求一組數(shù)中的最大值

intmax(inta[],intn){ inti=0,j,k; k=i; for(j=i+1,j<n;j++){ if(a[j]>a[k]) k=j; } returna[k];}假如n等于3,請用循環(huán)測試方法進(jìn)行測試。從程序流程圖可以看出,只有一個簡單循環(huán),根據(jù)簡單循環(huán)的測試原則進(jìn)行測試。aed

ci=0;k=ij=i+1j<n?a[j]>a[k]?k=jj++returna[k]開始返回

bvoidmain(){intn,i;printf("\npleaseinputanumber:\n");scanf("%d",&n);printf("%d=",n);for(i=2;i<=n;i++){

while(n!=i)

{

if(n%i==0)

{printf("%d*",i);

n=n/i;

}

else

break;

}}printf("%d",n);}

課堂練習(xí)將一個正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5。

請進(jìn)行基路徑測試和循環(huán)測試。5.4數(shù)據(jù)流測試數(shù)據(jù)流測試數(shù)據(jù)流定義和使用測試基于程序片的測試數(shù)據(jù)流測試數(shù)據(jù)流測試按照程序中的變量定義和使用的位置來選擇程序的測試路徑;數(shù)據(jù)流測試關(guān)注變量接收值的點(diǎn)和使用這些值的點(diǎn);一種簡單的數(shù)據(jù)流測試策略是要求覆蓋每個定義-使用路徑一次;數(shù)據(jù)流測試用做路徑測試的“真實(shí)性檢查”。早期的數(shù)據(jù)流分析常常集中于定義/引用異常的缺陷:變量被定義,但從來沒有使用;所使用的變量沒有被定義;變量在使用之前被定義兩次;

定義/使用測試定義1:定義節(jié)點(diǎn)節(jié)點(diǎn)n∈G(P)是變量v∈V的定義節(jié)點(diǎn),記做DEF(v,n),當(dāng)且僅當(dāng)變量的值由對應(yīng)節(jié)點(diǎn)n的語句片斷處定義。定義節(jié)點(diǎn)語句:輸入語句賦值語句循環(huán)語句和過程調(diào)用定義2:使用節(jié)點(diǎn)節(jié)點(diǎn)n∈G(P)是變量v∈V的使用節(jié)點(diǎn),記做USE(v,n),當(dāng)且僅當(dāng)變量v的值在對應(yīng)節(jié)點(diǎn)n的語句片斷處使用。使用節(jié)點(diǎn)語句:輸出語句賦值語句條件語句循環(huán)控制語句過程調(diào)用定義3:謂詞使用、計算使用使用節(jié)點(diǎn)USE(v,n)是一個謂詞使用(記做P-use),當(dāng)且僅當(dāng)語句n是謂詞語句;否則,USE(v,n)是計算使用(記做C-use)對應(yīng)于謂詞使用的節(jié)點(diǎn),其外度≥2對應(yīng)于計算使用的節(jié)點(diǎn),其外度≤1定義4:定義-使用路徑定義-使用路徑(記做du-path):是PATHS(P)中的路徑,使得對某個v∈V,存在定義和使用節(jié)點(diǎn)DEF(v,m)和USE(v,n),使得m和n是該路徑的最初和最終節(jié)點(diǎn)。定義5:定義-清除路徑定義清除路徑(記做dc-path):是具有最初和最終節(jié)點(diǎn)DEF(v,m)和USE(v,n)的PATHS(P)中的路徑,使得該路徑中沒有其他節(jié)點(diǎn)是v的定義節(jié)點(diǎn)。案例:publicvoidfunction(){ 1intn=1,i=1; 2while(i<10000){ 3intsum=0,j=1; 4 while(j<i){ 5 if(i%j==0){ 6 sum=sum+j; 7 } 8 j++; 9 } 10 if(sum==i){ 11 System.out.print(i+String.valueOf('\t'));12n++; 13 if(n%3==0){ 14 System.out.println();15 } 16 } 17 i++; 18} 19}求1-10000內(nèi)的完全數(shù)。請用數(shù)據(jù)流測試方法對其進(jìn)行分析。12123410571981469111315161718程序控制流圖publicvoidfunction(){ 1intn=1,i=1; 2while(i<10000){ 3intsum=0,j=1; 4 while(j<i){ 5 if(i%j==0){ 6 sum=sum+j; 7 } 8 j++; 9 } 10 if(sum==i){ 11 System.out.print…….;12n++; 13 if(n%3==0){ 14 System.out.println();15 }16 }17 i++; 18} 19}練習(xí)voidcompute(){1floatx,y,z,u,w;2scanf(“%f%f%f”,&x,&y,&z);3u=(x-y)*2;4if(x>Y)5w=u;6elsew=y;7if((w+z)>100){8x=x-2;9y=y+w;10printf(“Linear”);}else{11if(x*x–z*z>=100){12y=x*z+1;13printf(“NonLinear:A”);}14else{15y=x+u;16printf(“NonLinear:B”);}}其他白盒測試方法程序插裝域測試符號測試程序變異白盒測試工具Java語言:Junit,C++:CppUnit、VisualUnit等

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論