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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

)白盒測試又叫結構測試,邏輯驅動測試或基于程序本身的測試。

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

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

復合邏輯下的控制流圖aorbx++x--(a)(b)(c)ax++x++x--b請編寫程序:求正整數(shù)m和n的最大公約數(shù)和最小公倍數(shù)。繪制控制流圖。練習邏輯覆蓋(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.語句覆蓋設計若干條測試用例,使程序中每條可執(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.判定覆蓋(分支覆蓋)設計測試用例,使程序中的每個邏輯判斷的取真和取假的分支至少經歷一次。用例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判定覆蓋

只作到判定覆蓋將無法確定判定內部條件的錯誤。(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

因此判定覆蓋仍是弱的覆蓋標準。a(A>1)AND

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

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í)行一次。判定-條件覆蓋能同時滿足判定、條件兩種覆蓋標準。滿足判定-條件覆蓋的一組測試用例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.條件組合覆蓋設計用例,使得每個判斷表達式中條件的各種可能組合都至少出現(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.路徑覆蓋設計足夠多的測試用例,覆蓋程序中的每條可能路徑。上述滿足條件組合覆蓋的測試用例不能覆蓋路徑acd。滿足路徑覆蓋的一組測試用例用例ABX執(zhí)行路徑Case1203aceCase7101abdCase8211abeCase11301acd小結語句覆蓋判定覆蓋條件覆蓋判定/條件覆蓋條件組合覆蓋路徑覆蓋例: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)設計測試用例語句覆蓋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;設計測試用例使每個條件分別取真和取假;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設計測試用例(續(xù))判定-條件覆蓋要求同時滿足判定和條件覆蓋,設計的測試用例為: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設計測試用例(續(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設計測試用例(續(xù))設計測試用例(續(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習題1.三角形問題編寫程序實現(xiàn)三角形問題,然后用條件覆蓋設計測試用例。2.NextDate問題編寫程序實現(xiàn)NextDate問題,然后用邏輯覆蓋各方法設計測試用例。例:求完數(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)路復雜性基路徑測試循環(huán)測試路徑覆蓋的困難含4個分支,循環(huán)次數(shù)≤20,從A到B的可能路徑:AB=5+5+..+5+5≈1020121914問題引入1.程序環(huán)路復雜性

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

圖形矩陣定義:有m個節(jié)點的控制流圖矩陣,是一個m×m矩陣:A=(a(i,j)),其中a(i,j)是1,當且僅當從節(jié)點i到節(jié)點j有一條弧,否則該元素為0??刂屏鲌D矩陣n1n2n3n4n5n6n7n10100000n20010001n30001100n40000010n50000010n60100000n70000000(b)控制流圖矩陣根據(jù)圖形矩陣能計算圈復雜度和獨立路徑嗎?6354217e1e2e3e4e5e6e8e7R1R2R3(a)控制流圖2.基路徑測試如果把覆蓋的路徑數(shù)壓縮到一定限度內,例如程序中的循環(huán)體只執(zhí)行零次和一次,就成為基路徑測試?;韭窂綔y試法通過分析程序控制流圖的環(huán)路的復雜性,導出基本路徑集合,從而設計測試用例,保證這些路徑至少通過一次?;韭窂綔y試步驟:1.導出程序的控制流圖;2.計算控制流圖的環(huán)路復雜度V(G);3.確定只包含獨立路徑的基本路徑集;4.設計測試用例;基本路徑測試法課堂練習: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)計算此程序段的圈復雜度;(2)用基本路徑法給出測試路徑;(3)為各測試路徑設計測試用例。能直接看圈復雜度嗎?案例:選擇排序(續(xù)1)(a)程序流程圖k=i;j=i+1;k=jj++j<na[j]<a[k]i

ka[j]]

a[k]i++i<n-1FalseTrueFalse開始結束n=a.length;i=0TrueFalseTrueTrueFalse1234876510911(b)控制流圖案例:選擇排序(續(xù)2)基路徑測試計算圈復雜度V(G)=e–n+2;基本路徑集找出獨立路徑設計測試用例設計測試數(shù)據(jù),覆蓋基本路徑集5.3.2循環(huán)測試循環(huán)可以劃分為簡單循環(huán)串接循環(huán)嵌套循環(huán)非結構循環(huán)簡單循環(huán)串接循環(huán)嵌套循環(huán)非結構循環(huán)循環(huán)結構簡單循環(huán)測試需設計五種測試:零次循環(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)可按照下面的方法進行測試:從最內層循環(huán)開始,將所有其它層的循環(huán)設置為最小值;對最內層循環(huán)使用簡單循環(huán)的全部測試。由內向外構造下一個循環(huán)的測試。測試時保持所有外層循環(huán)的循環(huán)變量取最小值,并使其它嵌套內層循環(huán)的循環(huán)變量取“典型”值;反復進行,直到測試所有的循環(huán)。串接循環(huán)兩個或多個簡單的循環(huán)串接在一起,稱為串接循環(huán)。如果兩個或多個循環(huán)毫不相干,則應作為獨立的簡單循環(huán)測試。如果兩個循環(huán)串接起來,而第一個循環(huán)是第二個循環(huán)的初始值,則這兩個循環(huán)并不是獨立的。如果循環(huán)不獨立,則推薦使用嵌套循環(huán)的方法進行測試。非結構循環(huá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)測試方法進行測試。從程序流程圖可以看出,只有一個簡單循環(huán),根據(jù)簡單循環(huá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);}

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

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

定義/使用測試定義1:定義節(jié)點節(jié)點n∈G(P)是變量v∈V的定義節(jié)點,記做DEF(v,n),當且僅當變量的值由對應節(jié)點n的語句片斷處定義。定義節(jié)點語句:輸入語句賦值語句循環(huán)語句和過程調用定義2:使用節(jié)點節(jié)點n∈G(P)是變量v∈V的使用節(jié)點,記做USE(v,n),當且僅當變量v的值在對應節(jié)點n的語句片斷處使用。使用節(jié)點語句:輸出語句賦值語句條件語句循環(huán)控制語句過程調用定義3:謂詞使用、計算使用使用節(jié)點USE(v,n)是一個謂詞使用(記做P-use),當且僅當語句n是謂詞語句;否則,USE(v,n)是計算使用(記做C-use)對應于謂詞使用的節(jié)點,其外度≥2對應于計算使用的節(jié)點,其外度≤1定義4:定義-使用路徑定義-使用路徑(記做du-path):是PATHS(P)中的路徑,使得對某個v∈V,存在定義和使用節(jié)點DEF(v,m)和USE(v,n),使得m和n是該路徑的最初和最終節(jié)點。定義5:定義-清除路徑定義清除路徑(記做dc-path):是具有最初和最終節(jié)點DEF(v,m)和USE(v,n)的PATHS(P)中的路徑,使得該路徑中沒有其他節(jié)點是v的定義節(jié)點。案例: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內的完全數(shù)。請用數(shù)據(jù)流測試方法對其進行分析。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}練習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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論