兩類經典的軟件測試方法:

  傳統(tǒng)上認為軟件測試的方法從總體上分為兩類。第一類測試方法是試圖驗證軟件是“工作的”,所謂“工作的”是指軟件的功能是按照預先的設計執(zhí)行的;而第二類測試方法則是設法證明軟件是“不工作的”。

  提出第一類方法的代表人物是軟件測試領域的先驅Dr. Bill Hetzel(代表論著《The Complete Guide to Software Testing》),他曾于1972年6月在美國的北卡羅來納大學組織了歷史上第一次正式的關于軟件測試的論壇。他首先在1973年給軟件測試一個這樣的定義:“是建立一種信心,認為程序能夠按預期的設想運行。Establish confidence that a program does what it is supposed to do. ”后來在1983年他又將定義修訂為:“評價一個程序和系統(tǒng)的特性或能力,并確定它是否達到預期的結果。軟件測試是以此為目的的任何行為。 Any activities aimed at evaluating an attribute or capability of a program or system. ”在他的定義中的“設想”和“預期的結果”其實是我們現(xiàn)在所說的用戶需求或功能設計。他還把軟件的質量定義為“符合要求”。

  第一類測試可以簡單抽象地描述為這樣的過程:在設計規(guī)定的環(huán)境下運行軟件的功能,將其結果與用戶需求或設計結果相比較,如果相符則測試通過,如果不相符則視為Bug。這一過程的目標是將軟件的所有功能在所有設計規(guī)定的環(huán)境全部運行,并通過。

  在軟件行業(yè)中一般把第一類方法奉為主流和行業(yè)標準。1990年的IEEE/ANSI標準將軟件測試進行了這樣的定義:“是在既定的狀況條件下,運行一個系統(tǒng)或組建,觀察記錄結果,并對其某些方面進行評價的過程。The process of operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component (IEEE/ANSI, 1990 [Std 610.12-1990]”這里所謂“既定的狀況”也可理解為需求或設計。

  盡管如此,這一方法還是受到很多業(yè)界權威的質疑和挑戰(zhàn)。代表人物是Glenford J. Myers(代表論著《The Art of Software Testing》)。他認為測試不應該著眼于驗證軟件是工作的,相反應該首先認定軟件是有錯誤的,然后去發(fā)現(xiàn)盡可能多的錯誤。他還從人的心理學的角度論證,將 “驗證軟件是工作的”作為測試的目的,非常不利于測試人員發(fā)現(xiàn)軟件的錯誤。于是他于1979年提出了他對軟件測試的定義:“是以發(fā)現(xiàn)錯誤為目的而運行程序的過程。The process of executing a program or system with the intent of finding errors.” 這是軟件測試的第二類方法,簡單地說是驗證軟件是“不工作的”,或者說是有錯誤的。他甚至極端地認為,一個成功的測試必須是發(fā)現(xiàn)Bug的測試,不然沒有價值。這如同一個病人(假定此人確有病),到醫(yī)院做一項醫(yī)療檢查,結果各項指標都正常,那說明該項醫(yī)療檢查對于診斷該病人的病情是沒有價值的,是失敗的。我并不完全同意這一看法。

  第二類軟件測試方法在業(yè)界也很流行,受到很多學術界專家的支持。大家熟悉的Ron Patton在《軟件測試》( 中文版由機械工業(yè)出版社出版,具說此書是目前國內測試新手入門的經典教材)一書的第10頁,有一個明確而簡潔的定義:“軟件測試員的目標是找到軟件缺陷,盡可能早一些,并確保其得以修復!庇行┸浖髽I(yè)以Bug數量來作為考核測試人員業(yè)績的一項指標,其實是接受了這樣的方法。

  兩類方法的優(yōu)劣對比

  雖然軟件測試總的目的是為了軟件產品的質量,但很明顯這兩類測試方法在具體目標、或指導思想上截然相反。由此也決定了它們在思路、過程和測重點上有很大的差別,并各有利弊的。

  第一類測試方法以需求和設計為本,因此有利于界定測試工作的范疇,更便于部署測試的側重點,加強針對性。這一點對于大型軟件的測試,尤其是在有限的時間和人力資源情況下顯得格外重要。而第二類測試方法與需求和設計沒有必然的關聯(lián),如果計劃管理不當,測試活動很容易丟失重點,走入歧途。

  第一類測試方法可以與軟件的架構和軟件開發(fā)的計劃相配合,使軟件測試活動逐層次的展開,從而使軟件的功能和質量有計劃地逐步完善和提高(關于測試的層次問題,我會在今后的討論中專門介紹)。第二類測試方法不具備這種過程的漸進性。

  第一類測試方法的缺點是缺乏靈活性,不利于測試人員主觀能動性的發(fā)揮,正像Myers先生所說,不容易找到軟件的錯誤(Bug)。而這方面正是第二類測試方法的長處。