在G.J.Myers的經(jīng)典著作《軟件測試之藝術》(The Art of Software Testing)中,給出了測試的定義:“程序測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程”。這個定義,被業(yè)界所認可,經(jīng)常被引用。除此之外,G.J.Myers還給出了與測試相關的三個重要觀點,那是:

  測試是為了證明程序有錯,而不是證明程序無錯誤;

  一個好的測試用例是在于它能發(fā)現(xiàn)至今未發(fā)現(xiàn)的錯誤;

  一個成功的測試是發(fā)現(xiàn)了至今未發(fā)現(xiàn)的錯誤的測試。

  實際上,這里暗示了“軟件測試”在不同側面上的含義,也決定了對軟件測試不同的定義和不同的理解。根據(jù)作者多年的經(jīng)驗和理解,軟件測試的不同視野,概括為如下5類:

  軟件測試的狹義論和廣義論??靜態(tài)和動態(tài)的測試

  軟件測試的辨證論??正向思維和反向思維

  軟件測試的風險論??測試是評估

  軟件測試的經(jīng)濟學觀點??為盈利而測試

  軟件測試的標準論??驗證和確認

  1. 軟件測試的狹義論和廣義論

  G.J.Myers所給出了測試定義??“程序測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程”,實際是一個狹義的概念,因為他認為測試是執(zhí)行程序的過程,也是傳統(tǒng)意義上的測試??在代碼完成后,通過運行程序來發(fā)現(xiàn)程序代碼或軟件系統(tǒng)中錯誤。但是,這種意義上的測試是不能在代碼完成之前發(fā)現(xiàn)軟件系統(tǒng)需求、發(fā)現(xiàn)設計上的問題,把需求、發(fā)現(xiàn)設計上的問題遺留到后期,這樣會可能造成設計、編程的部分返工。增加軟件開發(fā)的成本、延長開發(fā)的周期等。需求階段和設計階段的缺陷產(chǎn)生的放大效應會加大。這非常不利于保證軟件質量。這種狹義論是受軟件開發(fā)瀑布模型影響。

  正是為了更早地發(fā)現(xiàn)問題,所以將測試延伸到需求評審、設計審查活動中去,也是將“軟件質量保證”的部分活動歸為測試活動。實際上,在軟件開發(fā)實際操作中,常常將軟件測試和質量保證??這兩種努力(efforts)合并起來。

  延伸后的軟件測試,被認為是一種軟件測試的廣義概念。這引出軟件測試的兩個概念“靜態(tài)測試”和“動態(tài)測試”,如 測試方法的辯證統(tǒng)一 (1)所述,這樣由靜態(tài)測試和動態(tài)測試構成一個全過程的、完整的軟件測試,而且靜態(tài)測試顯得更為重要。

  2.軟件測試的辨證論

  G.J.Myers的第2個觀點“測試是為了證明程序有錯,而不是證明程序無錯誤”,引出了軟件測試的另外一個爭論,軟件測試究竟是證明所有軟件的功能特性是正確的呢?還是其反向思維??對軟件系統(tǒng)進行各種試探和攻擊,找出軟件系統(tǒng)中不正;虿还ぷ鞯牡胤侥?從我個人理解,這兩個方面都有一定道理,前者(證明所有軟件的功能特性是正確的)是從質量保證的角度來思考軟件測試,后者(證明程序有錯)從軟件測試的直接目標和測試效率來思考,兩者應該相輔相成。在后者的思想背景下,我們認為,測試不是為了證明所有的功能可以正常工作,恰恰相反,測試是為了找出那些不能正常工作、不一致性的地方。也是說,測試的一般工作是發(fā)現(xiàn)缺陷 (detect bug),即在軟件開發(fā)過程中,分析、設計與編碼等工作都是建設性的,而測試是帶有“破壞性”的工作。

  對于不同的應用領域,兩者的比重是不一樣的,如國防、航天、銀行等軟件系統(tǒng),承受不了任何系統(tǒng)失效,因為一次系統(tǒng)的失效完全有可能導致災難性的損失,所以強調(diào)前者以保證非常高的軟件質量。而一般的軟件服務應用則不同,強調(diào)后者,質量目標設置在“用戶可接受水平”,不要國度追求質量,從而可以降低軟件開發(fā)成本。作者建議,在我們實際操作中,可以分階段實施不同的測試思想,在早期階段集中在“證明程序有錯”?? 發(fā)現(xiàn)Bug,后期集中在驗證所有特性是否正常工作??降低風險,見作者的另外一篇討論:測試執(zhí)行中非常有效的策略

  下面是這兩種觀點的基本描述:

  驗證軟件是驗證軟件是“工作的”,以正向思維,針對軟件系統(tǒng)的所有功能點,逐個驗證其正確性。其代表人物是軟件測試領域的先驅Dr. Bill Hetzel (代表論著《The Complete Guide to Software Testing》)。

  證明軟件是“不工作的”,以反向思維方式,不斷思考開發(fā)人員理解的誤區(qū)、不良的習慣、程序代碼的邊界、無效數(shù)據(jù)的輸入以及系統(tǒng)的弱點,試圖破壞系統(tǒng)、摧毀系統(tǒng),目標是發(fā)現(xiàn)系統(tǒng)中各種各樣的問題。其代表人物是上面多次提到的G.J.Myers。他強調(diào),一個成功的測試必須是發(fā)現(xiàn)Bug Bug的測試,不然沒有價值。
$News_page$

  3.軟件測試的風險論

  測試被定義為“對軟件系統(tǒng)中潛在的各種風險進行評估的活動”,這是軟件測試的風險論。軟件測試自身的風險性是大家公認的,測試的覆蓋度不能做到。測試的這種風險定義一方面源于這層含義,另外軟件測試的標準有時不清楚,“軟件規(guī)格說明書(Specification/ Spec)”是其中的一個標準,但也不是的,因為Spec中有些內(nèi)容完全有可能是錯誤的。所以,我們常常強調(diào)軟件測試人員應該站在客戶的角度去進行測試,除了發(fā)現(xiàn)程序中的錯誤,還要發(fā)現(xiàn)需求定義的錯誤、設計上的缺陷,可以針對Spec 去報Bug。但是,測試在大多數(shù)時間/情況下,是由工程師完成,而不是客戶自己來做,所以又怎么能保證工程師和客戶想得一樣呢?

  有人把開發(fā)比作打靶,目標明確,是按照Spec 去實現(xiàn)系統(tǒng)的功能。而把測試比作撈魚,目標不明確,自己判斷哪些地方魚多,去哪些地方撈;如果只撈大魚(嚴重缺陷),網(wǎng)眼可以大些、撒網(wǎng)區(qū)域相對比較集中(測試點集中在主要功能-major features)。如果想把大大小小的魚撈上來,網(wǎng)眼要小、普遍撒網(wǎng),不放過任何一塊區(qū)域(測試點遍及所有功能??all features)。

  在“風險”論的框架下,軟件測試可以被看作是一個動態(tài)的監(jiān)控過程,對軟件開發(fā)全過程進行檢測,隨時發(fā)現(xiàn)不健康的征兆,發(fā)現(xiàn)問題、報告問題,并重新評估新的風險,設置新的監(jiān)控基準,不斷地持續(xù)下去,包括回歸測試。這時,軟件測試可以完全看作是軟件質量控制的過程。

  對應這種觀點,產(chǎn)生基于風險的測試策略,首先評估測試的風險,功能出問題的概率有多大?哪些是用戶常用的20%功能??Pareto原則(也叫80/20原則)?如果某個功能出問題,其對用戶的影響有多大?然后根據(jù)風險大小確定測試的優(yōu)先級。優(yōu)先級高的測試,優(yōu)先得到執(zhí)行,一般來講,針對用戶常用的20%功能(優(yōu)先級高)的測試會得到完全執(zhí)行,而低優(yōu)先級的測試(另外用戶不經(jīng)常用的80%功能)不是必要的,如果時間或經(jīng)費不夠,暫時不做或少做。

  4.軟件測試的經(jīng)濟學觀點

  “一個好的測試用例是在于它能發(fā)現(xiàn)至今未發(fā)現(xiàn)的錯誤”,體現(xiàn)了軟件測試的經(jīng)濟學觀點。實際上,軟件測試經(jīng)濟學問題至今仍是業(yè)界關注的問題之一。經(jīng)濟學的核心是要盈利,盈利的基礎是要有一個清楚的商業(yè)性目標。同樣,商業(yè)性目標是否正確,直接決定了企業(yè)是否盈利的結果。多數(shù)情況下,軟件測試是在公司內(nèi)的執(zhí)行。正是公司的行為目的,決定了軟件測試含義或定義的經(jīng)濟性一面。正如,對軟件質量的定義不僅僅局陷于“和客戶需求的一致性、適用性”,而且要增加其它的要求??“預算內(nèi)、按時發(fā)布、易于維護”。

  軟件測試也一樣,要盡快盡早地發(fā)現(xiàn)更多的缺陷,并督促和幫助開發(fā)人員修正缺陷。原因很簡單:平均而言,如果在需求階段修正一個錯誤的代價是1,那么,在設計階段是它的3~6倍,在編程階段是它的10倍,在內(nèi)部測試階段是它的20~40倍,在外部測試階段是它的30~70倍,而到了產(chǎn)品發(fā)布出去時,這個數(shù)字是 40~ 1000倍。修正錯誤的代價不是隨時間線性增長,而幾乎是呈指數(shù)級增長的。

  5. 軟件測試的標準論

  如果從標準論來看軟件測試,可以定義為軟件測試是“驗證(Verification)”和“有效性確認(Validation)”活動構成的整體,即軟件測試 = V&V。

  “驗證”是檢驗軟件是否已正確地實現(xiàn)了產(chǎn)品規(guī)格書所定義的系統(tǒng)功能和特性。驗證過程提供證據(jù)表明軟件相關產(chǎn)品與所有生命周期活動的要求(如正確性、完整性、一致性、準確性等)相一致。相當于,以Spec為標準進行軟件測試活動,驗證軟件產(chǎn)品和Spec的一致性。

  “有效性確認”是確認所開發(fā)的軟件是否滿足用戶真正需求的活動。相當于,保持對軟件需求定義、設計的懷疑,一切從客戶出發(fā),理解客戶的需求,發(fā)現(xiàn)需求定義和產(chǎn)品設計中的問題。這主要通過各種軟件評審活動來實現(xiàn)。

  需要說明的是,軟件測試的對象是產(chǎn)品(包括階段性產(chǎn)品,如市場需求說明書、產(chǎn)品規(guī)格說明書、技術設計文檔、數(shù)據(jù)字典、程序包、用戶文檔等),而質量保證和管理的對象集中在軟件開發(fā)的標準、流程和方法等。

  究竟什么是軟件測試呢?綜上所述,軟件測試的定義為:

  軟件測試是貫穿整個軟件開發(fā)生命周期、對軟件產(chǎn)品(包括階段性產(chǎn)品)進行驗證和確認的活動過程,

  其目的是盡快盡早地發(fā)現(xiàn)在軟件產(chǎn)品中所存在的各種問題??與用戶需求、預先定義的不一致性。