官术网_书友最值得收藏!

2.2.2 白盒測試

另一種測試策略稱為白盒測試或稱邏輯驅(qū)動的測試,允許我們檢查程序的內(nèi)部結(jié)構(gòu)。這種測試策略對程序的邏輯結(jié)構(gòu)進行檢查,從中獲取測試數(shù)據(jù)(遺憾的是,常常忽略了程序的規(guī)范)。

在這里我們的目標是針對這種測試策略,建立起與黑盒測試中窮舉輸入測試相似的測試方法。也許有一個解決的辦法,即將程序中的每條語句至少執(zhí)行一次。但是我們不難證明,這還是遠遠不夠的。這種方法通常稱為窮舉路徑測試,在本書第4章中將進一步進行深入探討,在這里就不多加敘述。所謂窮舉路徑測試,即如果使用測試用例執(zhí)行了程序中所有可能的控制流路徑,那么程序有可能得到了完全測試。

然而,這個論斷存在兩個問題。首先,程序中不同邏輯路徑的數(shù)量可能達到天文數(shù)字。圖2-1所示的小程序顯示了這一點。該圖是一個控制流圖,每一個結(jié)點或圓圈都代表一個按順序執(zhí)行的語句段,通常以一個分支語句結(jié)束。每一條邊或弧線表示語句段之間的控制(分支)的轉(zhuǎn)換。圖2-1描述的是一個有著10~20行語句的程序,包含一個迭代20次的DO循環(huán)。在DO循環(huán)體中,包含一系列嵌套的IF語句。要確定不同邏輯路徑的數(shù)量,也相當(dāng)于要確定從點a~點b之間所有不同路徑的數(shù)量(假定程序中所有的判斷語句都是相互獨立的)。這個數(shù)量大約是1014,即100萬億,是從520+519……+51計算而來,5是循環(huán)體內(nèi)的路徑數(shù)量。由于大多數(shù)的人難以對這個數(shù)字有一個直觀的概念,不妨設(shè)想一下:如果在每五分鐘內(nèi)可以編寫、執(zhí)行和確認一個測試用例,那么需要大約10億年才能測試完所有的路徑。假如可以快上300倍,每一秒就完成一次測試,也得用漫長的320萬年才能完成這項工作。

figure_0022_0002
圖 2-1 一個小型程序的控制流圖

當(dāng)然,在實際程序中,判斷并非都是彼此獨立的,這意味著可能實際執(zhí)行的路徑數(shù)量要稍微少一些。但是,從另一方面來講,實際應(yīng)用的程序要比圖2-1所描述的簡單程序復(fù)雜得多。因此,窮舉路徑測試就如同窮舉輸入測試,非但不可能,也是不切實際的。

“窮舉路徑測試即完全的測試”論斷存在的第二個問題是,雖然我們可以測試到程序中的所有路徑,但是程序可能仍然存在著錯誤。這有三個原因。

第一,即使是窮舉路徑測試也決不能保證程序符合其設(shè)計規(guī)范。舉例來說,如果要編寫一個升序排序程序,但卻錯誤地編成了一個降序排序程序,那么窮舉路徑測試就沒多大價值了;程序仍然存在著一個缺陷:它是個錯誤的程序,因為不符合設(shè)計的規(guī)范。

第二,程序可能會因為缺少某些路徑而存在問題。窮舉路徑測試當(dāng)然不能發(fā)現(xiàn)缺少了哪些必需路徑。

第三,窮舉路徑測試可能不會暴露數(shù)據(jù)敏感錯誤。這樣的例子有很多,舉一個簡單的例子就能說明問題。假設(shè)在某個程序中要比較兩個數(shù)值是否收斂,也就是檢查兩個數(shù)值之間的差異是否小于某個既定的值。我們可能會這樣編一條Java語言的IF語句:

figure_0023_0003

當(dāng)然,這條語句明顯錯了,因為程序原意是將c與a-b的絕對值進行比較。然而,要找出這樣的錯誤,取決于a和b所取的值,而僅僅執(zhí)行程序中的每條路徑并不一定能找出錯誤來。

總之,盡管窮舉輸入測試要強于窮舉路徑測試,但兩者都不是有效的方法,因為這兩種方法都不可行。那么,也許存在別的方法,將黑盒測試和白盒測試的要素結(jié)合起來,形成一個合理但并不十分完美的測試策略。本書的第4章將深入討論這個話題。

主站蜘蛛池模板: 胶南市| 莒南县| 新和县| 汶川县| 桐梓县| 达孜县| 鸡泽县| 鹤壁市| 从江县| 通化市| 淅川县| 观塘区| 呼和浩特市| 丹寨县| 杂多县| 高尔夫| 牙克石市| 福建省| 安徽省| 双峰县| 聂荣县| 田阳县| 六枝特区| 涟源市| 社旗县| 新巴尔虎右旗| 勐海县| 九寨沟县| 交口县| 福贡县| 聂荣县| 永川市| 怀宁县| 龙江县| 玉树县| 淮南市| 两当县| 义马市| 扎囊县| 寿光市| 阿勒泰市|