微軟的軟件測試方法開發者在線
本文關鍵詞: 微軟 軟件測試
這里的“技術”指的是具體的戰術問題,比如說如何使用某種工具來解決某一特定測試問題,或者某一類型軟件有哪些測試手段等等。而這里的“方
法”指的是宏觀的戰略問題,或者叫方法論,這包括從軟件測試的概念或理念,到企業軟件質量控制體系;從軟件測試的過程,到測試團隊的設置及其職責的界定等
等。
作為測試人員,熱衷于“技術”討論和交流是一件可喜可賀的事。從中可以感覺到軟件測試在中國迅速發展的開端和潛力。但是作為企業的管理決策者,是否
也應該以同樣的熱情來思考“方法”問題呢?特別是當一個軟件企業的軟件測試從無到有,或者當企業已有一定的軟件測試的投入,但發現其實效并不顯著,甚至由
于測試的引入而帶來了新的管理上的混亂。
這個時候方法論的思考,更有利于發現問題的根源。
即便是一個基層的測試人員,當積累了一定的技術經驗后,也應該不時從日常的具體工作中走出來,在一個較高層次上進行回顧總結和借鑒,并試著提出一些
優化和改進的措施,這無論對專業上還是對事業上的成長都是非常有意義的。微軟在軟件測試方面有很多值得一提的經驗,在此我想以我個人的體會和思考,同大家
一同進行一些探討。
這里有一點須要特別說明,盡管微軟的方法已被微軟的實踐多次證明是成功的,非常有效的,但這并不意味著這些方法在中國的軟件企業中有廣泛的可行性。
一種方法是否可行還受到很多其他因素的影響,比如企業類型(微軟是生產平臺軟件和通用軟件產品的企業),企業管理體制,企業文化等等。所以我的目的只是給
大家一些思路和借鑒。
兩類經典的軟件測試方法
在具體介紹微軟的軟件測試方法之前,我想首先從概念,或理念的層面上來理解究竟甚么是軟件測試,目的是從中導出微軟測試方法的理論根源。
傳統上認為軟件測試的方法從總體上分為兩類。
第一類測試方法是試圖驗證軟件是“工作的”,所謂“工作的”就是指軟件的功能是按照預先的設計執行的;而第二類測試方法則是設法證明軟件是“不工作的”。
提出第一類方法的代表人物是軟件測試領域的先驅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年他又將定義修訂為:“評價一個程序和系統的特性或能力,并確定它是否達到預期的結果。軟件測試就是以此為目的的任何行為。 Any
activities aimed at evaluating an attribute or capability of a program
or system. ”在他的定義中的“設想”和“預期的結果”其實就是我們現在所說的用戶需求或功能設計。他還把軟件的質量定義為“符合要求”。
第一類測試可以簡單抽象地描述為這樣的過程:在設計規定的環境下運行軟件的功能,將其結果與用戶需求或設計結果相比較,如果相符則測試通過,如果不相符則視為Bug。這一過程的終極目標是將軟件的所有功能在所有設計規定的環境全部運行,并通過。
在軟件行業中一般把第一類方法奉為主流和行業標準。1990年的IEEE/ANSI標準將軟件測試進行了這樣的定義:“就是在既定的狀況條件下,運
行一個系統或組建,觀察記錄結果,并對其某些方面進行評價的過程。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]”這里所謂“既定的狀況”也可理解為需求或設計。
盡管如此,這一方法還是受到很多業界權威的質疑和挑戰。代表人物是Glenford J. Myers(代表論著《The Art of
Software
Testing》)。他認為測試不應該著眼于驗證軟件是工作的,相反應該首先認定軟件是有錯誤的,然后去發現盡可能多的錯誤。他還從人的心理學的角度論
證,將
“驗證軟件是工作的”作為測試的目的,非常不利于測試人員發現軟件的錯誤。于是他于1979年提出了他對軟件測試的定義:“就是以發現錯誤為目的而運行程
序的過程。The process of executing a program or system with the intent of
finding errors.”
這就是軟件測試的第二類方法,簡單地說就是驗證軟件是“不工作的”,或者說是有錯誤的。他甚至極端地認為,一個成功的測試必須是發現Bug的測試,
不然就沒有價值。這就如同一個病人(假定此人確有病),到醫院做一項醫療檢查,結果各項指標都正常,那說明該項醫療檢查對于診斷該病人的病情是沒有價值
的,是失敗的。
我并不完全同意這一看法。第二類軟件測試方法在業界也很流行,受到很多學術界專家的支持。大家熟悉的Ron Patton在《軟件測試》(
中文版由機械工業出版社出版,具說此書是目前國內測試新手入門的經典教材)一書的第10頁,有一個明確而簡潔的定義:“軟件測試員的目標是找到軟件缺陷,
盡可能早一些,并確保其得以修復。”有些軟件企業以Bug數量來作為考核測試人員業績的一項指標,其實就是接受了這樣的方法。
兩類方法的優劣對比
雖然軟件測試總的目的是為了軟件產品的質量,但很明顯這兩類測試方法在具體目標、或指導思想上截然相反。由此也決定了它們在思路、過程和測重點上有很大的差別,并各有利弊的。
第一類測試方法以需求和設計為本,因此有利于界定測試工作的范疇,更便于部署測試的側重點,加強針對性。這一點對于大型軟件的測試,尤其是在有限的
時間和人力資源情況下顯得格外重要。而第二類測試方法與需求和設計沒有必然的關聯,如果計劃管理不當,測試活動很容易丟失重點,走入歧途。
第一類測試方法可以與軟件的架構和軟件開發的計劃相配合,使軟件測試活動逐層次的展開,從而使軟件的功能和質量有計劃地逐步完善和提高(關于測試的層次問題,我會在今后的討論中專門介紹)。第二類測試方法不具備這種過程的漸進性。
第一類測試方法的缺點是缺乏靈活性,不利于測試人員主觀能動性的發揮,正像Myers先生所說,不容易找到軟件的錯誤(Bug)。而這方面正是第二類測試方法的長處。
微軟的策略
正是因為認識到兩類測試方法各有利弊,微軟在軟件測試活動中將兩類方法結合起來,以第一類測試方法為基礎和主要線索,階段性地運用第二類測試方法。
微軟的第一類測試
微軟的第一類測試總體上說分為三個步驟進行:審核需求和設計—〉設計測試—〉實施運行測試。
前文已述,第一類測試是以需求和設計為本來驗證軟件的正確性。大家很自然的想到,需求和設計本身也有正確性的問題。依據不正確的需求和設計不可能開發出正確的軟件產品,測試也將是徒勞的。因此驗證需求和設計是微軟進行第一類測試的第一步。
有必要指出的是,這里所說的需求和設計具體說來它一般包括:
由項目經理根據用戶要求(信息來源于市場部門,用戶支持部門等等)而編寫的需求文本(Requirement Specification);
由項目經理根據需求文本而編寫的功能設計文本(Functional Design Specification);
由開發人員根據功能文本而編寫的實施設計文本(Implementation Design Specification)。
微軟的測試人員要參與所有這些文本的審核。作為測試人員,審核重點是檢查文本對用戶需求定義的完整性、嚴密性和功能設計的可測性。同時這種審核對于測試人員也是一種熱身活動,使他們盡早地進入技術和業務狀態。
第二步,測試人員要根據已審核通過的需求和設計編制測試計劃,設計測試用例。在前面提到的三種文本中,功能設計文本是主要依據。原因很簡單,這類測試關心的是軟件是否能正確地實現功能,而不是這些功能如何被具體實施的。
從這里大家可以看出這是典型的“黑盒測試”。確實微軟的測試主要是從用戶角度進行的黑盒測試。
這一步的完成就意味著“測試計劃”和“測試用例設計”兩個文本的完成。“測試計劃”
文本主要闡述測試的范疇、領域、方法、工具、資源和計劃時間表等等。“測試用例設計”文本要列出測試用例、每個用例的設置、執行步驟和預期結果。測試的這
兩個文本也要被項目經理和開發人員審核。這樣經過各種相互的審核,大家對項目形成了基本的共識。
第三步的實施運行測試是整個開發過程中最長最復雜的一個階段。從總體上說就是將上一步設計的測試用例按計劃付諸實施的過程。這包括編寫自動化測試程
序、反復運行自動化測試程序,也包括階段性執行手動測試用例。這一階段的測試必須在周密的計劃下進行,在前面我已提到,這正是第一類測試的特點和長處。
這種計劃性首先體現在開發和測試的相互協調配合,根據產品的架構和功能模塊的依賴關系,按照項目的總體計劃共同推進。從測試的過程來看,總是先運行
或執行簡單用例,然后再復雜用例;先驗證單一的基本功能,再綜合的端到端的功能;先發現解決表面的,影響面大的Bug,再深層的,不容易重現的Bug。因
此隨著項目開發和測試的進程,產品的功能不斷完善,質量不斷提高。
這里有一點要特別指出,有很多測試用例是要反復運行的,特別是基本的自動化測試每一天,每一個Build上都要運行。盡管這些測試大多數情況下都是通過的,很少再發現新的Bug,但其價值是顯而易見的,就是為了防止質量回歸。
可見Myers的理論在這里是不適用的。這一階段測試人員還有一項繁瑣但卻很重要的工作,就是對已有的測試用例的維護。比如通常以下兩種情況下要新
增一些測試用例,一是對于當初測試設計不周全的領域,二是對于外部的Bug(比如從Beta客戶報告來的),沒有被現有測試用例所覆蓋。當產品的功能設計
出現更改時(在微軟這是常事),所涉及的測試用例當然也要相應地修改。
微軟的第二類測試
微軟的第二類測試是階段性的,常常根據需要而帶有隨機性和突擊性。對于這類測試,在微軟有一個專門的名稱:“Bug Bash(Bug大掃除)”。
Bug Bash通常發生在項目開發各階段(微軟叫里程碑)的末期,比如Beta版發布前,劃出一個專門的時間段(通常1-3天),在這期間所有參與項目的人員,集中全部精力,運用各方面的知識,盡全部智慧來搜尋項目的Bug。
這是一個非常有意思的活動,但要組織好這樣的活動并非易事。一般有以下要點:
盡管這是一個測試活動,但參與者并不僅限于測試人員。項目經理,開發人員甚至于高層管理人員都應參加,如同全民動員。目的是要集思廣益;
要鼓勵各部門,領域交叉搜索,因為新的思路和視角通常有助于發現更多的Bug;
為調動積極性,增強趣味性,可以適當引入競爭機制,比如當活動結束時,評出發現Bug最多,發現最嚴重Bug的個人,給以物質和精神獎勵。
可以分專題展開,比如安全性、用戶界面可用性、國際化和本地化等等。
微軟的第二類測試除了Bug Bash外,經常還有一些專業性的測試,最典型的是針對安全性攻擊測試。一般會邀請公司內部,或業界的專家來搜尋產品的安全漏洞。
以上我從傳統軟件測試概念的角度,介紹了微軟的策略和兩類傳統測試方法的具體做法,及其側重點。這其實僅僅是一個基礎,一個很原始的基礎。多特有的
做法,和概念上軟件測試在微軟軟件產品開發中的作用、地位遠不是這些原始的方法所能達到的,也不是傳統軟件測試概念所函蓋的。微軟在軟件測試方面有很的突
破,比如“軟件測試的信息服務功能”、“以用戶為中心的宏觀質量體系”、“分級測試”、“項目的質量管理系統”、“Bug三方會審”、“測試自動化”和“
軟件測試的軟硬件—部門、團隊、人和基礎設施”等等。這些我會在以后的討論中分專題進行介紹。
_______________________
我在前一篇“微軟的軟件測試方法”中介紹了微軟的兩類基本測試方法,其基本思想大家應該是比較熟悉的,因為它們還只是傳統的軟件測試方法的綜合。所
以單從形式上,它并沒有體現出對傳統框架的突破。但是從另一個層面來考察微軟軟件測試時,你會對一些基本的事實感到驚訝。比如,“微軟的測試人員和開發人
員數量大致相等或略多”,“微軟的產品成本中測試大約占40%以上”等等。人們會有疑問,僅僅是作為功能驗證和搜尋Bug的測試能消耗這么大量的資源嗎?
有必要付出如此大的代價嗎?
應該有理由相信,微軟作為一個軟件企業,其每一份投入都是有意義的,因此也可斷定微軟在軟件測試方面的努力一定超出傳統測試方法的范疇。
歷史回顧
為了更好的理解微軟件測試在方法和理念上的突破,我想首先回顧一下軟件開發和軟件測試的發展歷史,并從中揭示其必然性。
Edward Kit 在他的暢銷書“Software Testing In The Real World : Improving The
Process(1995, ISBN: 0201877562)”中將整個軟件開發歷史分為三個階段:
第一個階段是60年代及其以前,那時軟件規模都很小、復雜程度低,軟件開發的過程隨意。開發人員的Debug過程被認為是唯一的測試活動。其實這并不是現代意義上的軟件測試,當然一階段也還沒有專門測試人員的出現。
第二個階段是70年代,這個階段開發的軟件仍然不復雜,但人們已開始思考開發流程問題,并提出“軟件工程Software
Engineering”的概念。但是這一階段人們對軟件測試的理解僅限于基本的功能驗證和Bug搜尋,而且測試活動僅出現在整個軟件開發流程的后期,雖
然測試由專門的測試人員來承擔,但測試人員都是行業和軟件專業的入門新手。
第三個階段是80年代及其以后,軟件和IT行業進入了大發展。軟件趨向大型化。與之相應,人們為軟件開發設計了各種復雜而精密的流程和管理方法(比
如CMM和MSF),并將“質量”的概念融入其中。軟件測試已有了行業標準(IEEE/ANSI
),它再也不是一個一次性的,而且只是開發后期的活動,而是與整個開發流程融合成一體。軟件測試已成為一個專業,需要運用專門的方法和手段,需要專門人才
和專家來承擔。
測試與開發的融合
在這一歷史發展過程中,最值得注意的是測試與開發流程融合的趨勢。人們對這種融合也許并不陌生。比如測試活動的早期展
開,讓測試人員參與用戶需求的驗證,參加功能設計和實施設計的審核。再比如測試人員與開發人員的密切合作,隨著開發進展而逐步實施單元測試、模塊功能測試
和系統整合測試。
的確這些都是測試與開發融合的表現形式,而且初期的融合也只反映在這個層次上。90年代以后,軟件的規模和復雜程度迅速提高,這種形式上的融合也迅速走向更深層次,更具實際意義。
具體地說這種融合就是整個軟件開發活動對測試的依賴性。傳統上認為,只有軟件的質量控制依賴于測試,但是現代軟件開發的實踐證明,不僅軟件的質量控制依賴于測試,開發本身離開測試也將無法推進,項目管理離開了測試也從根本上失去了依據。
在微軟,測試的確有這樣的地位和作用。這就是為什么微軟在軟件測試上有如此大的投入。
開發對測試的依賴
現代軟件開發,特別是大型軟件開發通常會遇到以下兩個問題:
在開發初期,如何能夠展開大規模團隊,群體齊頭并進,而同時保持開發的有序性。從而有效利用資源,縮短開發周期。
在開發后期,如何解決深層次的Bug,如何面對設計更改,而能夠保證產品的質量不出現或少出現回落。
對于小型簡單的軟件,這兩個問題也存在,但不突出,而且容易解決。但對于復雜的大型軟件的開發,這兩個問題常常會成為難以逾越的障礙。
通常大型項目的功能豐富,但架構、層次也會相當復雜。穩妥的開發方式是,一次投入少量的人員,逐層開發,逐層穩定。但這種方式顯然資源利用率低,開發周期長,不能滿足現代軟件和IT行業高速發展、瞬息萬變的需要。因此大型項目需要大型團隊。
在微軟,產品開發團隊(主要包括開發、測試和項目管理)一般都有百人以上規模,有些產品甚至上幾千人(Windows2000的開發部門曾有
3000多人)。這樣大規模的人力資源作用在一個動態的,內部相互聯系的系統中,若沒有有效的協同,其混亂是不可避免的。試想,有兩個開發人員,分別在開
發兩個不同的功能模塊,其相互有依賴關系。為了相互協調,他們可以隨時進行當面討論。如果這種關系發生在五個開發人員和五個功能模塊之間,這種協調就只能
通過定期的會議來進行。而一個大型項目,會有許許多多這樣的關系,而且很多時候這種關系有著不確定性和不可預見性。當一個開發人員編寫一段新的代碼或對已
有代碼進行改動和調整時,他(或她)常常無法確定,或無法完全確定究竟有哪些相關的模塊會受到影響,以及在什么請況下這種影響會帶來什么結果。因為系統的
復雜性已遠遠超出了人的邏輯思維、技能和經驗所能力及的范疇。因此這種傳統的協調手段是遠不能滿足需要的。
在微軟,這種協調是通過測試來實現的。具體來說就是:每日建造+自動化測試。
關于每日編譯和自動化測試,我將來會作專門介紹,這里簡單的說就是每天都建造一個新版本,每個版本都要運行通過一定量的自動測試用例,以檢驗當天工作的質量。這里所說的質量當然有一般意義上質量的概念,但同時它也反映項目在開發過程中的整體協調性。
自動測試的最大優點在于它的高度可重復性。一個理想的自動測試系統能夠讓人隨時、方便和迅速的運行大量的測試用例。因此一個開發人員可以通過檢查當
天的自動測試結果來分析前一天代碼的質量(事后檢查),也可以在當天存入代碼前,先運行自動測試以進一步確保存入代碼的質量(事前檢查)。
在微軟,每日建造都是在午夜開始,完成后緊接著就是全面的自動測試,到早晨上班時間之前就會把結果自動通過e-mail等方式發送出來。開發人員上
班后的第一件事往往就是檢查測試結果。如果沒有問題就會開始新的工作。如果有測試有用例沒有通過,開發人員則必須協同測試人員一起立刻找出原因,解決后才
能開始新的代碼。
有時一個小的失誤會引起大面積的測試用例失敗,很大一部分開發團隊會受到影響。為盡量避免這種情況,要求開發人員在存入代碼之前先在自己的個人建造
版本上運行一定量的自動測試,全部通過后在存入。如開發人員沒有按照這樣的要求,而擅自存入質量不高的代碼而造成大量測試失敗,這種不負責任的行為是要受
到嚴厲批評的。
從這一過程可以看出,開發人員依賴測試來保證開發工作的質量,使開發整體地協調地向前推進。
當開發進入后期階段,盡管項目已總體成型,開發人員也會不時遇到一些技術上的挑戰。比如一些Bug的解決涉及對項目深層次結構的調整;再比如由于客
戶反饋的意見造成設計的修改。每一次這樣的修改和調整事實上都是對一個穩定系統的破壞,如果處理不當往往一個Bug的修改會生成很多新的Bug,就像一系
列聯鎖的惡性循環。很多項目工期的延誤都是這樣造成的。
要避免或至少將這種破壞減少到最低限度,開發人員首先需要知道這種破壞的影響面。在這里單靠開發人員自身的邏輯思維、技能和經驗是遠遠不夠的,自動
測試再一次成為一種有效的工具。往往開發人員會制定不止一個方案,對每個方案上都運行一遍同樣一套自動測試用例,然后比較結果,選出最佳方案。
自動測試在這方面所起的作用不僅在產品的開發過程中,它還延續到產品發布后。產品支持部門在為客戶提供應急解決方案時也要依賴自動測試。
管理對測試的依賴
在微軟,軟件項目管理的主要線索就是Bug的管理,其中最直接具體的管理活動就是“Bug三方討論會(Bug
Triage)”。會議一般由項目管理Program
Manager(簡稱PM)來主持,有開發人員和測試人員參加(所以叫三方會議)。會上對每個新生成的Bug進行討論,并決定
是否接受這個Bug;
Bug的嚴重級別和優先級別;
Bug由誰來負責,是由測試提供進一步詳細信息,還是交由開發人員解決,以及大致的解決方案等等。
會議還要對老的Bug檢查解決進度。這種討論會常常會發生爭論,要求測試人員具有足夠的技術基礎和用戶經驗,來捍衛產品的質量。
可以說項目開發到了某一階段后就是由這種Bug的管理所驅動的。這其中的原動力來自測試。
項目管理中一項非常重要但也十分困難的工作是衡量項目的進度,包括判斷項目的狀態,確定項目是否能預期完成。這方面,測試提供了兩個非常重要的參數,一個是Bug數量的趨勢,另一個是測試結果的趨勢。
Bug趨勢就是將每天新生成的Bug數和每天被解決的Bug數標成一個趨勢圖表。一般在項目的開始階段新生Bug數曲線會呈上升趨勢,到項目中后期
被解決Bug數曲線會趨于上升,而新生Bug數曲線應下降,到項目最后,兩條曲線都趨向于零。PM會持續觀察這張圖表,確保項目健康發展,同時通過分析預
測項目Bug趨于零的時間。
在一定的歷史經驗的基礎上分析使用這一圖表會得到很多有價值的信息,比如說,可分析開發和測試在人力資源的配比上是否恰當,可以分析出某個嚴重的Bug所造成的項目質量的波動。
每天的自動測試結果同樣可以形成類似的圖表。它同樣非常有助于了解當前項目的質量狀況,開發測試進度。
由測試產生的這些數據不僅在項目開發過程中為項目管理提供有效的依據,而且也是產品通過發布的必要條件。在微軟,每個產品都要經過評審才能通過發
布。前面介紹的幾個圖表是發布評審的重要內容,如果從圖表中發現臨評審前還出現過較大的質量波動,評審人員一定會對此提出質疑。
因此軟件項目管理依賴軟件測試提供其基本的管理素材。
可以說,現代大型軟件開發過程中開發和管理對測試的依賴性是測試與開發流程融合的一個根本因素。從另一個角度看,測試與開發流程融合決不僅僅是簡單
的時間上的同步,更不是雙方空間上的接近,而是這種內在的依存關系的外在表現。開發對測試的這種依賴性對測試和測是人員提出了更高的要求。在理念上,軟件
測試已遠不僅僅只是軟件功能的驗證和Bug的搜尋;在具體方法上,自動測試和測試工具的使用已成為基本的要求。
在微軟,測試不僅使用一些通用的工具,每一個產品還有專門開發的專用工具庫,測試的代碼量常常超過項目本身的代碼量。
一個軟件企業要提高其軟件開發的能力,特別是針對大型軟件的大規模的快速開發能力,在測試方面對傳統理念和方法進行突破是必要的。微軟的實踐就是一個很好
的印證。