|
一、 白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動測試,它是按照程序內(nèi)部的結(jié)構(gòu)測試程序,通過測試來檢測產(chǎn)品內(nèi)部動作是否按照設(shè)計規(guī)格說明書的規(guī)定正常進(jìn)行,檢驗程序中的每條通路是否都能按預(yù)定要求正確工作。 這一方法是把測試對象看作一個打開的盒子,測試人員依據(jù)程序內(nèi)部邏輯結(jié)構(gòu)相關(guān)信息,設(shè)計或選擇測試用例,對程序所有邏輯路徑進(jìn)行測試,通過在不同點檢查程序的狀態(tài),確定實際的狀態(tài)是否與預(yù)期的狀態(tài)一致。 二、概述
白盒測試又稱結(jié)構(gòu)測試、透明盒測試、邏輯驅(qū)動測試或基于代碼的測試。白盒測試是一種測試用例的設(shè)計方法,盒子對應(yīng)的是被測試的測試,"白盒"法全面了解程序內(nèi)部邏輯結(jié)構(gòu)、對所有邏輯路徑進(jìn)行測試。"白盒"法是窮舉路徑測試。測試者必須檢查程序的內(nèi)部結(jié)構(gòu),從檢查程序的邏輯著手,得出測試數(shù)據(jù)。 三、基本方法 強(qiáng)度由低到高:語句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。 (1)語句覆蓋:就是設(shè)計若干個測試用例,運行被測程序,使得每一可執(zhí)行語句至少執(zhí)行一次。 (2)判定覆蓋:使設(shè)計的測試用例保證程序中每個判斷的每個取值分支至少經(jīng)歷一次。 (3)條件覆蓋:條件覆蓋是指選擇足夠的測試用例,使得運行這些測試用例時,判定中每個條件的所有可能結(jié)果至少出現(xiàn)一次,但未必能覆蓋全部分支 (4)判定條件覆蓋:判定-條件覆蓋就是設(shè)計足夠的測試用例,使得判斷中每個條件的所有可能取值至少執(zhí)行一次,同時每個判斷的所有可能判斷結(jié)果至少執(zhí)行,即要求各個判斷的所有可能的條件取值組合至少執(zhí)行一次。 (5)條件組合覆蓋:在白盒測試法中,選擇足夠的測試用例,使所有判定中各條件判斷結(jié)果的所有組合至少出現(xiàn)一次,滿足這種覆蓋標(biāo)準(zhǔn)成為條件組合覆蓋。 (6)路徑覆蓋:是每條可能執(zhí)行到的路徑至少執(zhí)行一次。 補(bǔ)充:(1)語句覆蓋在所有的測試方法中是一種最弱的覆蓋。 (2)判定覆蓋和條件覆蓋比語句覆蓋強(qiáng),滿足判定/條件覆蓋標(biāo)準(zhǔn)的測試用例一定也滿足判定覆蓋、條件覆蓋和語句覆蓋(3)路徑覆蓋也是一種比較強(qiáng)的覆蓋,但未必考慮判定條件結(jié)果的組合,并不能代替條件覆蓋和條件組合覆蓋。
四、優(yōu)缺點
1. 優(yōu)點
a.迫使測試人員去仔細(xì)思考軟件的實現(xiàn)
b.可以檢測代碼中的每條分支和路徑
c.揭示隱藏在代碼中的錯誤
d.對代碼的測試比較徹底
e.最優(yōu)化
2. 缺點
a.代價昂貴
b.無法檢測代碼中遺漏的路徑和數(shù)據(jù)敏感性錯誤
c.不驗證規(guī)格的正確性
五、白盒測試中設(shè)計到圈復(fù)雜度的計算
首先要畫出控制流圖(這里不再加以說明)
圈復(fù)雜度計算公式為:V(G)=e-n+2。其中,e表示控制流圖中邊的數(shù)量,n表示控制流圖中節(jié)點的數(shù)量。
此外圈復(fù)雜度的計算還有更直觀的方法,因為圈復(fù)雜度所反映的是“判定條件”的數(shù)量,所以圈復(fù)雜度實際上就是等于判定節(jié)點的數(shù)量再加上1,也即控制流圖的區(qū)域數(shù),
此外對應(yīng)與控制流圖區(qū)域數(shù)還有一個圈復(fù)雜度計算公式:V(G)=區(qū)域數(shù)=判定節(jié)點數(shù)+1。其中判定節(jié)點是控制流圖中出現(xiàn)的判斷條件。
下面附上一個實例,實例并不是很好,但是很全,由于包含細(xì)節(jié)較多,如有錯誤,還望見諒。
被測程序:尋找最大數(shù)程序:max.numbers
程序操作說明:從鍵盤輸入3個整數(shù)(間隔為空格),找出并輸出其中數(shù)值最大的那一個。如果其中有一個以上的最大數(shù)(相等的情況),也要表示出來。
#include<stdio.h> 1 void main() 2 { 3 int i,a,b,c; 4 i = 0; 5 while(i<100) { 6 printf("Enter numbers: "); 7 scanf("%d %d%d",&a,&b,&c); 8 if(a>b) 9 { 10 if(a>c) 11 printf("max. a=%d\n",a); 12 else if(a==c) 13 printf("max. a=c=%d\n",c); 14 else 15 printf("max.c=%d\n",c); 16 } 17 else{ 18 if(a==b) 19 { 20 if(a>c) 21 printf("max.a=b=%d\n",a); 22 else 23 if(a==c) 24 printf("max.a=b=c=%d\n",c); 25 else 26 printf("max.c=%d\n",c); 27 } 28 else{ 29 if(b>c) 30 printf("max.b=%d\n",b); 31 else 32 if(b==c) 33 printf("max. b=c=%d\n",b); 34 else 35 printf("max. c=%d\n",c); 36 } 37 } 38 i++; 39 } 40 }
實驗要求:依據(jù)語句覆蓋、判斷覆蓋、條件覆蓋、判斷/條件覆蓋、條件組合覆蓋、基本路徑測試分別給出測試用例?;韭窂綔y試要求畫出程序流圖、控制流圖、計算圈復(fù)雜度、給出路徑并導(dǎo)出測試用例。
整個程序?qū)?yīng)的流程圖如下和控制流圖對應(yīng)如下:
(1) 語句覆蓋 由控制流圖可知:測試用例需要9組 a. a=3,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,10,11,16.38,39 b. a=2,b=1,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,13,16.38,39 c. a=2,b=1,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,15,16.38,39 d. a=2,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,21,27.38,39 e. a=b=c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39 f. a=2,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39 g. a=1,b=3,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,30,37, 38,39 h. a=1,b=2,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39 i. a=1,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
(2) 判斷覆蓋
由控制流圖可知:測試用例需要9組 a. a=3,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,10,11,16.38,39 b. a=2,b=1,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,13,16.38,39 c. a=2,b=1,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,15,16.38,39 d. a=2,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,21,27.38,39 e. a=b=c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39 f. a=2,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39 g. a=1,b=3,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,30,37, 38,39 h. a=1,b=2,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39 i. a=1,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
(3) 條件覆蓋 整個測試所覆蓋的條件: 1.a>b 真為T1,假為F1 2.a>c 真為T2,假為F2 3.a=c 真為T3,假為F3 4.a=b 真為T4,假為F4 5.b>c 真為T5,假為F5 6.b=c 真為T6,假為F6
(4) 判斷/條件覆蓋
a. a=3,b=2,c=1 覆蓋路徑經(jīng)過為:1,3,4,5,6,7,8,10,11,16.38,39 覆蓋條件:T1,T2 b. a=2,b=1,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,13,16.38,39 覆蓋條件:T1, F2,T3 c. a=2,b=1,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,15,16.38,39 覆蓋條件:T1,F2,F3 d . a=2,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,21,27.38,39 覆蓋條件:F1,T4,T2 e. a=b=c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39 覆蓋條件:F1,T4,F2,T3 f. a=2,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39 覆蓋條件:F1,T4,F2,F3 g. a=1,b=3,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,30,37, 38,39 覆蓋條件:F1,F4,T5 h. a=1,b=2,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39 覆蓋條件:F1,F4,F5,T6 i. a=1,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39 覆蓋條件:F1,F4,F5,F6
(5) 條件組合覆蓋 所有可能的條件組合:
1.a>b 真為T1,假為F1 2.a>c 真為T2,假為F2 3.a=c 真為T3,假為F3 4.a=b 真為T4,假為F4 5.b>c 真為T5,假為F5 6.b=c 真為T6,假為F6
測試用例:
(7)基本路徑測
a. a=3,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,10,11,16.38,39 b. a=2,b=1,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,13,16.38,39 c. a=2,b=1,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,10,12,15,16.38,39 d. a=2,b=2,c=1 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,21,27.38,39 e. a=b=c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39 f. a=2,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39 g. a=1,b=3,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,30,37, 38,39 h. a=1,b=2,c=2 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39 i. a=1,b=2,c=3 路徑經(jīng)過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
每個測試用例對應(yīng)的路徑: 路徑1: 1-3-4-5-6-7-8-10-11-16-38-39 路徑2: 1-3-4-5-6-7-8-10-12-13-16-38-39 路徑3: 1-3-4-5-6-7-8-10-12-15-16-38-39 路徑4: 1-3-4-5-6-7-8-18-20-21-27-37-38-39 路徑5: 1-3-4-5-6-7-8-18-20-23-24-27-37-38-39 路徑6:1-3-4-5-6-7-8-18-20-23-26-27-37-38-39 路徑7: 1-3-4-5-6-7-8-18-29-30-36-37-38-39 路徑8:1-3-4-5-6-7-8-18-29-32-33-36-37-38-39 路徑9:1-3-4-5-6-7-8-18-29-32-35-36-37-38-39
圈復(fù)雜度V(G)=判斷節(jié)點數(shù)+1=9+1=10
|
|
|