兩類經(jīng)典的軟件測試方法:

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

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

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

  在軟件行業(yè)中一般把第一類方法奉為主流和行業(yè)標(biāo)準(zhǔn)。1990年的IEEE/ANSI標(biāo)準(zhǔn)將軟件測試進(jìn)行了這樣的定義:“是在既定的狀況條件下,運(yùn)行一個系統(tǒng)或組建,觀察記錄結(jié)果,并對其某些方面進(jìn)行評價的過程。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]”這里所謂“既定的狀況”也可理解為需求或設(shè)計。

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

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

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

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

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

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

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