- 軟件測試的藝術(shù)(原書第3版)
- (美)Glenford J.Myers Tom Badgett Corey Sandler
- 1295字
- 2021-01-14 16:50:40
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萬年才能完成這項工作。
當(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語句:
當(dāng)然,這條語句明顯錯了,因為程序原意是將c與a-b的絕對值進行比較。然而,要找出這樣的錯誤,取決于a和b所取的值,而僅僅執(zhí)行程序中的每條路徑并不一定能找出錯誤來。
總之,盡管窮舉輸入測試要強于窮舉路徑測試,但兩者都不是有效的方法,因為這兩種方法都不可行。那么,也許存在別的方法,將黑盒測試和白盒測試的要素結(jié)合起來,形成一個合理但并不十分完美的測試策略。本書的第4章將深入討論這個話題。
- OpenStack Cloud Computing Cookbook(Third Edition)
- UML和模式應(yīng)用(原書第3版)
- Java應(yīng)用開發(fā)與實踐
- Android Application Development Cookbook(Second Edition)
- 移動界面(Web/App)Photoshop UI設(shè)計十全大補
- 精通Python自動化編程
- Windows Phone 7.5:Building Location-aware Applications
- ASP.NET程序開發(fā)范例寶典
- Buildbox 2.x Game Development
- .NET Standard 2.0 Cookbook
- SwiftUI極簡開發(fā)
- Redmine Cookbook
- Python網(wǎng)絡(luò)爬蟲實例教程(視頻講解版)
- Clojure High Performance Programming(Second Edition)
- Microsoft Exchange Server 2016 PowerShell Cookbook(Fourth Edition)