作為測試人員,熱衷于“技術(shù)”討論和交流是一件可喜可賀的事。從中可以感覺(jué)到軟件測試在中國迅速發(fā)展的開(kāi)端和潛力。但是作為企業(yè)的管理決策者,是否也應該以同樣的熱情來(lái)思考“方法”問(wèn)題呢?特別是當一個(gè)軟件企業(yè)的軟件測試從無(wú)到有,或者當企業(yè)已有一定的軟件測試的投入,但發(fā)現其實(shí)效并不顯著(zhù),甚至由于測試的引入而帶來(lái)了新的管理上的混亂。這個(gè)時(shí)候方法論的思考,更有利于發(fā)現問(wèn)題的根源。即便是一個(gè)基層的測試人員,當積累了一定的技術(shù)經(jīng)驗后,也應該不時(shí)從日常的具體工作中走出來(lái),在一個(gè)較高層次上進(jìn)行回顧總結和借鑒,并試著(zhù)提出一些優(yōu)化和改進(jìn)的措施,這無(wú)論對專(zhuān)業(yè)上還是對事業(yè)上的成長(cháng)都是非常有意義的。
微軟在軟件測試方面有很多值得一提的經(jīng)驗,在此我想以我個(gè)人的體會(huì )和思考,同大家一同進(jìn)行一些探討。這里有一點(diǎn)須要特別說(shuō)明,盡管微軟的方法已被微軟的實(shí)踐多次證明是成功的,非常有效的,但這并不意味著(zhù)這些方法在中國的軟件企業(yè)中有廣泛的可行性。一種方法是否可行還受到很多其他因素的影響,比如企業(yè)類(lèi)型(微軟是生產(chǎn)平臺軟件和通用軟件產(chǎn)品的企業(yè)),企業(yè)管理體制,企業(yè)文化等等。所以我的目的只是給大家一些思路和借鑒。
兩類(lèi)經(jīng)典的軟件測試方法
在具體介紹微軟的軟件測試方法之前,我想首先從概念,或理念的層面上來(lái)理解究竟甚么是軟件測試,目的是從中導出微軟測試方法的理論根源。
傳統上認為軟件測試的方法從總體上分為兩類(lèi)。第一類(lèi)測試方法是試圖驗證軟件是“工作的”,所謂“工作的”就是指軟件的功能是按照預先的設計執行的;而第二類(lèi)測試方法則是設法證明軟件是“不工作的”。
提出第一類(lèi)方法的代表人物是軟件測試領(lǐng)域的先驅Dr. Bill Hetzel(代表論著(zhù)《The Complete Guide to Software Testing》),他曾于1972年6月在美國的北卡羅來(lái)納大學(xué)組織了歷史上第一次正式的關(guān)于軟件測試的論壇。他首先在1973年給軟件測試一個(gè)這樣的定義:“就是建立一種信心,認為程序能夠按預期的設想運行。Establish confidence that a program does what it is supposed to do. ”后來(lái)在1983年他又將定義修訂為:“評價(jià)一個(gè)程序和系統的特性或能力,并確定它是否達到預期的結果。軟件測試就是以此為目的的任何行為。 Any activities aimed at evaluating an attribute or capability of a program or system. ”在他的定義中的“設想”和“預期的結果”其實(shí)就是我們現在所說(shuō)的用戶(hù)需求或功能設計。他還把軟件的質(zhì)量定義為“符合要求”。
第一類(lèi)測試可以簡(jiǎn)單抽象地描述為這樣的過(guò)程:在設計規定的環(huán)境下運行軟件的功能,將其結果與用戶(hù)需求或設計結果相比較,如果相符則測試通過(guò),如果不相符則視為Bug。這一過(guò)程的終極目標是將軟件的所有功能在所有設計規定的環(huán)境全部運行,并通過(guò)。
在軟件行業(yè)中一般把第一類(lèi)方法奉為主流和行業(yè)標準。1990年的IEEE/ANSI標準將軟件測試進(jìn)行了這樣的定義:“就是在既定的狀況條件下,運行一個(gè)系統或組建,觀(guān)察記錄結果,并對其某些方面進(jìn)行評價(jià)的過(guò)程。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ì)疑和挑戰。代表人物是Glenford J. Myers(代表論著(zhù)《The Art of Software Testing》)。他認為測試不應該著(zhù)眼于驗證軟件是工作的,相反應該首先認定軟件是有錯誤的,然后去發(fā)現盡可能多的錯誤。他還從人的心理學(xué)的角度論證,將 “驗證軟件是工作的”作為測試的目的,非常不利于測試人員發(fā)現軟件的錯誤。于是他于1979年提出了他對軟件測試的定義:“就是以發(fā)現錯誤為目的而運行程序的過(guò)程。The process of executing a program or system with the intent of finding errors.” 這就是軟件測試的第二類(lèi)方法,簡(jiǎn)單地說(shuō)就是驗證軟件是“不工作的”,或者說(shuō)是有錯誤的。他甚至極端地認為,一個(gè)成功的測試必須是發(fā)現Bug的測試,不然就沒(méi)有價(jià)值。這就如同一個(gè)病人(假定此人確有?。?,到醫院做一項醫療檢查,結果各項指標都正常,那說(shuō)明該項醫療檢查對于診斷該病人的病情是沒(méi)有價(jià)值的,是失敗的。我并不完全同意這一看法。
第二類(lèi)軟件測試方法在業(yè)界也很流行,受到很多學(xué)術(shù)界專(zhuān)家的支持。大家熟悉的Ron Patton在《軟件測試》( 中文版由機械工業(yè)出版社出版,具說(shuō)此書(shū)是目前國內測試新手入門(mén)的經(jīng)典教材)一書(shū)的第10頁(yè),有一個(gè)明確而簡(jiǎn)潔的定義:“軟件測試員的目標是找到軟件缺陷,盡可能早一些,并確保其得以修復?!?/span>有些軟件企業(yè)以Bug數量來(lái)作為考核測試人員業(yè)績(jì)的一項指標,其實(shí)就是接受了這樣的方法。
兩類(lèi)方法的優(yōu)劣對比
雖然軟件測試總的目的是為了軟件產(chǎn)品的質(zhì)量,但很明顯這兩類(lèi)測試方法在具體目標、或指導思想上截然相反。由此也決定了它們在思路、過(guò)程和測重點(diǎn)上有很大的差別,并各有利弊的。
第一類(lèi)測試方法以需求和設計為本,因此有利于界定測試工作的范疇,更便于部署測試的側重點(diǎn),加強針對性。這一點(diǎn)對于大型軟件的測試,尤其是在有限的時(shí)間和人力資源情況下顯得格外重要。而第二類(lèi)測試方法與需求和設計沒(méi)有必然的關(guān)聯(lián),如果計劃管理不當,測試活動(dòng)很容易丟失重點(diǎn),走入歧途。
第一類(lèi)測試方法可以與軟件的架構和軟件開(kāi)發(fā)的計劃相配合,使軟件測試活動(dòng)逐層次的展開(kāi),從而使軟件的功能和質(zhì)量有計劃地逐步完善和提高(關(guān)于測試的層次問(wèn)題,我會(huì )在今后的討論中專(zhuān)門(mén)介紹)。第二類(lèi)測試方法不具備這種過(guò)程的漸進(jìn)性。
第一類(lèi)測試方法的缺點(diǎn)是缺乏靈活性,不利于測試人員主觀(guān)能動(dòng)性的發(fā)揮,正像Myers先生所說(shuō),不容易找到軟件的錯誤(Bug)。而這方面正是第二類(lèi)測試方法的長(cháng)處。
微軟的策略
正是因為認識到兩類(lèi)測試方法各有利弊,微軟在軟件測試活動(dòng)中將兩類(lèi)方法結合起來(lái),以第一類(lèi)測試方法為基礎和主要線(xiàn)索,階段性地運用第二類(lèi)測試方法。
微軟的第一類(lèi)測試
微軟的第一類(lèi)測試總體上說(shuō)分為三個(gè)步驟進(jìn)行:審核需求和設計—〉設計測試—〉實(shí)施運行測試。
前文已述,第一類(lèi)測試是以需求和設計為本來(lái)驗證軟件的正確性。大家很自然的想到,需求和設計本身也有正確性的問(wèn)題。依據不正確的需求和設計不可能開(kāi)發(fā)出正確的軟件產(chǎn)品,測試也將是徒勞的。因此驗證需求和設計是微軟進(jìn)行第一類(lèi)測試的第一步。有必要指出的是,這里所說(shuō)的需求和設計具體說(shuō)來(lái)它一般包括:(1)由項目經(jīng)理根據用戶(hù)要求(信息來(lái)源于市場(chǎng)部門(mén),用戶(hù)支持部門(mén)等等)而編寫(xiě)的需求文本(Requirement Specification);(2)由項目經(jīng)理根據需求文本而編寫(xiě)的功能設計文本(Functional Design Specification);(3)由開(kāi)發(fā)人員根據功能文本而編寫(xiě)的實(shí)施設計文本(Implementation Design Specification)。微軟的測試人員要參與所有這些文本的審核。作為測試人員,審核重點(diǎn)是檢查文本對用戶(hù)需求定義的完整性、嚴密性和功能設計的可測性。同時(shí)這種審核對于測試人員也是一種熱身活動(dòng),使他們盡早地進(jìn)入技術(shù)和業(yè)務(wù)狀態(tài)。
第二步,測試人員要根據已審核通過(guò)的需求和設計編制測試計劃,設計測試用例。
在前面提到的三種文本中,功能設計文本是主要依據。原因很簡(jiǎn)單,這類(lèi)測試關(guān)心的是軟件是否能正確地實(shí)現功能,而不是這些功能如何被具體實(shí)施的。從這里大家可以看出這是典型的“黑盒測試”。確實(shí)微軟的測試主要是從用戶(hù)角度進(jìn)行的黑盒測試。這一步的完成就意味著(zhù)“測試計劃”和“測試用例設計”兩個(gè)文本的完成?!皽y試計劃” 文本主要闡述測試的范疇、領(lǐng)域、方法、工具、資源和計劃時(shí)間表等等?!皽y試用例設計”文本要列出測試用例、每個(gè)用例的設置、執行步驟和預期結果。測試的這兩個(gè)文本也要被項目經(jīng)理和開(kāi)發(fā)人員審核。這樣經(jīng)過(guò)各種相互的審核,大家對項目形成了基本的共識。
第三步的實(shí)施運行測試是整個(gè)開(kāi)發(fā)過(guò)程中最長(cháng)最復雜的一個(gè)階段。
從總體上說(shuō)就是將上一步設計的測試用例按計劃付諸實(shí)施的過(guò)程。這包括編寫(xiě)自動(dòng)化測試程序、反復運行自動(dòng)化測試程序,也包括階段性執行手動(dòng)測試用例。這一階段的測試必須在周密的計劃下進(jìn)行,在前面我已提到,這正是第一類(lèi)測試的特點(diǎn)和長(cháng)處。這種計劃性首先體現在開(kāi)發(fā)和測試的相互協(xié)調配合,根據產(chǎn)品的架構和功能模塊的依賴(lài)關(guān)系,按照項目的總體計劃共同推進(jìn)。從測試的過(guò)程來(lái)看,總是先運行或執行簡(jiǎn)單用例,然后再復雜用例;先驗證單一的基本功能,再綜合的端到端的功能;先發(fā)現解決表面的,影響面大的Bug,再深層的,不容易重現的Bug。因此隨著(zhù)項目開(kāi)發(fā)和測試的進(jìn)程,產(chǎn)品的功能不斷完善,質(zhì)量不斷提高。這里有一點(diǎn)要特別指出,有很多測試用例是要反復運行的,特別是基本的自動(dòng)化測試每一天,每一個(gè)Build上都要運行。盡管這些測試大多數情況下都是通過(guò)的,很少再發(fā)現新的Bug,但其價(jià)值是顯而易見(jiàn)的,就是為了防止質(zhì)量回歸??梢?jiàn)Myers的理論在這里是不適用的。這一階段測試人員還有一項繁瑣但卻很重要的工作,就是對已有的測試用例的維護。比如通常以下兩種情況下要新增一些測試用例,一是對于當初測試設計不周全的領(lǐng)域,二是對于外部的Bug(比如從Beta客戶(hù)報告來(lái)的),沒(méi)有被現有測試用例所覆蓋。當產(chǎn)品的功能設計出現更改時(shí)(在微軟這是常事),所涉及的測試用例當然也要相應地修改。
微軟的第二類(lèi)測試
微軟的第二類(lèi)測試是階段性的,常常根據需要而帶有隨機性和突擊性。對于這類(lèi)測試,在微軟有一個(gè)專(zhuān)門(mén)的名稱(chēng):“Bug Bash(Bug大掃除)”。
Bug Bash通常發(fā)生在項目開(kāi)發(fā)各階段(微軟叫里程碑)的末期,比如Beta版發(fā)布前,劃出一個(gè)專(zhuān)門(mén)的時(shí)間段(通常1-3天),在這期間所有參與項目的人員,集中全部精力,運用各方面的知識,盡全部智慧來(lái)搜尋項目的Bug。這是一個(gè)非常有意思的活動(dòng),但要組織好這樣的活動(dòng)并非易事。一般有以下要點(diǎn):(1)盡管這是一個(gè)測試活動(dòng),但參與者并不僅限于測試人員。項目經(jīng)理,開(kāi)發(fā)人員甚至于高層管理人員都應參加,如同全民動(dòng)員。目的是要集思廣益;(2)要鼓勵各部門(mén),領(lǐng)域交叉搜索,因為新的思路和視角通常有助于發(fā)現更多的Bug;(3)為調動(dòng)積極性,增強趣味性,可以適當引入競爭機制,比如當活動(dòng)結束時(shí),評出發(fā)現Bug最多,發(fā)現最嚴重Bug的個(gè)人,給以物質(zhì)和精神獎勵。(4)可以分專(zhuān)題展開(kāi),比如安全性、用戶(hù)界面可用性、國際化和本地化等等。
微軟的第二類(lèi)測試除了Bug Bash外,經(jīng)常還有一些專(zhuān)業(yè)性的測試,最典型的是針對安全性攻擊測試。一般會(huì )邀請公司內部,或業(yè)界的專(zhuān)家來(lái)搜尋產(chǎn)品的安全漏洞。
以上我從傳統軟件測試概念的角度,介紹了微軟的策略和兩類(lèi)傳統測試方法的具體做法,及其側重點(diǎn)。這其實(shí)僅僅是一個(gè)基礎,一個(gè)很原始的基礎。軟件測試在微軟軟件產(chǎn)品開(kāi)發(fā)中的作用、地位遠不是這些原始的方法所能達到的,也不是傳統軟件測試概念所函蓋的。微軟在軟件測試方面有很多特有的做法,和概念上的突破,比如“軟件測試的信息服務(wù)功能”、“以用戶(hù)為中心的宏觀(guān)質(zhì)量體系”、“分級測試”、“項目的質(zhì)量管理系統”、“Bug三方會(huì )審”、“測試自動(dòng)化”和“軟件測試的軟硬件—部門(mén)、團隊、人和基礎設施”等等。這些我會(huì )在以后的討論中分專(zhuān)題進(jìn)行介紹。
聯(lián)系客服