在G.J.Myers的經典著作《軟件測試之藝術》(The Art of Software Testing)中,給出了測試的定義:“程序測試是為了發現錯誤而執行程序的過程”。這個定義,被業界所認可,經常被引用。除此之外,G.J.Myers還給出了與測試相關的三個重要觀點,那就是:
測試是為了證明程序有錯,而不是證明程序無錯誤;
一個好的測試用例是在于它能發現至今未發現的錯誤;
一個成功的測試是發現了至今未發現的錯誤的測試。
實際上,這里暗示了“軟件測試”在不同側面上的含義,也就決定了對軟件測試不同的定義和不同的理解。根據作者多年的經驗和理解,軟件測試的不同視野,概括為如下5類:
軟件測試的狹義論和廣義論——靜態和動態的測試
軟件測試的辨證論——正向思維和反向思維
軟件測試的風險論——測試是評估
軟件測試的經濟學觀點——為盈利而測試
軟件測試的標準論——驗證和確認
1. 軟件測試的狹義論和廣義論
G.J.Myers所給出了測試定義——“程序測試是為了發現錯誤而執行程序的過程”,實際是一個狹義的概念,因為他認為測試是執行程序的過程,也就是傳統意義上的測試——在代碼完成后,通過運行程序來發現程序代碼或軟件系統中錯誤。但是,這種意義上的測試是不能在代碼完成之前發現軟件系統需求、發現設計上的問題,把需求、發現設計上的問題遺留到后期,這樣就會可能造成設計、編程的部分返工。增加軟件開發的成本、延長開發的周期等。需求階段和設計階段的缺陷產生的放大效應會加大。這非常不利于保證軟件質量。這種狹義論是受軟件開發瀑布模型影響。
正是為了更早地發現問題,所以將測試延伸到需求評審、設計審查活動中去,也就是將“軟件質量保證”的部分活動歸為測試活動。實際上,在軟件開發實際操作中,常常將軟件測試和質量保證——這兩種努力(efforts)合并起來。
延伸后的軟件測試,被認為是一種軟件測試的廣義概念。這就引出軟件測試的兩個概念“靜態測試”和“動態測試”,如 測試方法的辯證統一 (1)所述,這樣就由靜態測試和動態測試構成一個全過程的、完整的軟件測試,而且靜態測試顯得更為重要。
2.軟件測試的辨證論
G.J.Myers的第2個觀點“測試是為了證明程序有錯,而不是證明程序無錯誤”,引出了軟件測試的另外一個爭論,軟件測試究竟是證明所有軟件的功能特性是正確的呢?還是其反向思維——對軟件系統進行各種試探和攻擊,找出軟件系統中不正;虿还ぷ鞯牡胤侥?從我個人理解,這兩個方面都有一定道理,前者(證明所有軟件的功能特性是正確的)是從質量保證的角度來思考軟件測試,后者(證明程序有錯)從軟件測試的直接目標和測試效率來思考,兩者應該相輔相成。在后者的思想背景下,我們認為,測試不是為了證明所有的功能可以正常工作,恰恰相反,測試就是為了找出那些不能正常工作、不一致性的地方。也就是說,測試的一般工作就是發現缺陷 (detect bug),即在軟件開發過程中,分析、設計與編碼等工作都是建設性的,而測試是帶有“破壞性”的工作。
對于不同的應用領域,兩者的比重是不一樣的,如國防、航天、銀行等軟件系統,承受不了任何系統失效,因為一次系統的失效完全有可能導致災難性的損失,所以強調前者以保證非常高的軟件質量。而一般的軟件服務應用則不同,強調后者,質量目標設置在“用戶可接受水平”,不要國度追求質量,從而可以降低軟件開發成本。作者建議,在我們實際操作中,可以分階段實施不同的測試思想,在早期階段集中在“證明程序有錯”—— 發現Bug,后期集中在驗證所有特性是否正常工作——降低風險,見作者的另外一篇討論:測試執行中非常有效的策略
下面就是這兩種觀點的基本描述:
驗證軟件是驗證軟件是“工作的”,以正向思維,針對軟件系統的所有功能點,逐個驗證其正確性。其代表人物是軟件測試領域的先驅Dr. Bill Hetzel (代表論著《The Complete Guide to Software Testing》)。
證明軟件是“不工作的”,以反向思維方式,不斷思考開發人員理解的誤區、不良的習慣、程序代碼的邊界、無效數據的輸入以及系統的弱點,試圖破壞系統、摧毀系統,目標就是發現系統中各種各樣的問題。其代表人物就是上面多次提到的G.J.Myers。他強調,一個成功的測試必須是發現Bug Bug的測試,不然就沒有價值。
文章來源于領測軟件測試網 http://www.kjueaiud.com/