- 軟件測試:實踐者方法
- 孫志安等編著
- 2958字
- 2024-09-19 17:31:44
1.3 軟件測試發展歷程
軟件測試發軔于不斷增加的軟件缺陷及不可控的軟件質量,是質量工程的重要子域。軟件測試伴隨軟件產生而產生,伴隨軟件發展而發展。對應于軟件開發及質量工程發展歷程,軟件測試經歷了發軔、發展及成熟三個發展階段。
發軔階段:需求驅動,測試概念產生。肇始之初,軟件規模小、結構簡單,與硬件緊密耦合,通常被當作硬件的附屬物,開發過程無序,遑論軟件測試乎!在這個階段,調試是主要的質量保證手段。調試是軟件開發及質量保證不可或缺的工作,主要用于解決編譯及單個方面的問題,尚不能驗證程序邏輯、內外接口、不同功能模塊之間的耦合等問題。直到20世紀50年代后期,作為程序錯誤檢測的重要手段之一,軟件測試逐漸與調試分離,成為一項確定的過程活動。這一時期,主要依靠錯誤推測(經驗或直覺),推測程序中可能存在的錯誤。但因測試技術落后,測試流程不規范,錯誤檢出能力有限,即便是經過測試的軟件也常常受到錯誤的困擾。20世紀60年代,軟件錯誤導致開發成本、進度和質量失控,軟件危機爆發。如何避免錯誤產生并消除錯誤,實現質量目標,業界在程序設計語言、軟件開發模型、形式化設計、程序正確性證明等方面進行了卓有成效的探索,軟件工程興起。但是,這并未從根本上解決軟件質量問題,期望另辟蹊徑的人們不得不再次將注意力轉移到軟件測試上來。但這個時期的軟件測試主要是靠猜想和推斷,尚未形成明確的定義、定位及方法論。1973年,Bill Hetzel首次將軟件測試定義為:對程序或系統能否完成特定任務建立信心的過程。該定義的提出標志著軟件測試的誕生。不過該定義很快受到質疑,思想一旦爆發,就會引發百家爭鳴。Glenford J.Myers認為,軟件測試應認定軟件存在錯誤,基于逆向思維,發現錯誤。鑒于此,1979年,Myers在The art of software testing中將軟件測試定義為:為發現錯誤而執行程序或系統的過程。該定義將軟件測試視為編碼實現結束之后一項確定的過程活動,面向程序,解構軟件,側重于軟件邏輯結構分析及代碼錯誤查找,旨在檢出未發現的錯誤,以證明程序存在錯誤,而非證明程序不存在錯誤,這是一個證偽過程。這一思想為軟件測試技術發展奠定了基礎。但此概念深受瀑布模型影響,混淆了軟件測試的目的和手段,忽視了影響軟件行為及質量的文檔、數據和環境等要素,忽視了軟件開發過程活動,以及應用系統的整體行為和用戶需求,滋生了軟件測試的隨意性、盲目性和片面性。
發展階段:面向軟件,保證產品質量。20世紀80年代,軟件開發演進到結構化設計,開發流程和管理模式逐漸規范,C語言誕生,面向對象技術興起,軟件結構日趨復雜,規模不斷增加,應用領域不斷拓展。軟件測試旨在檢出錯誤,對軟件需求進行確認,對軟件質量進行度量和評價,成為軟件開發過程中重要的質量保證活動。1983年,Bill Hetze1在Complete Guide of Software Testing中將軟件測試定義修改為:評價一個程序和系統的特性或能力,確定其是否達到預期結果。該定義是基于軟件需求,針對軟件功能點,采用特定方法,在規定的環境中驗證并評價軟件系統的符合性,不再局限于代碼分析,強力地推進了軟件測試基礎理論、基礎技術、應用技術研究及工程實踐進展。同年,IEEE ANSI將軟件測試定義為:使用人工或自動手段運行或測定軟件系統,判定預期結果和實際結果的差別,確認其是否滿足規定的需求。該定義將軟件測試視為軟件開發過程中為發現錯誤、驗證軟件需求的符合性而執行程序的一項過程活動,將測試對象從程序拓展到文檔和數據,將軟件測試活動從靜態的程序分析拓展到動態的錯誤檢測,軟件測試不再停留在編碼實現之后這一特定階段,而是貫穿于整個開發過程。盡管該定義依然停留在確定的層面上,卻將軟件測試從狹義的查錯拓展到廣義的質量工程。直到今天,這一成果在軟件測試領域依然產生著深遠的影響。
成熟階段:面向用戶,確保使用質量。20世紀90年代,基于互聯網平臺、分布式對象模型以及面向對象、面向服務等軟件開發技術,軟件系統架構發生重大變化,軟件質量問題逐漸演化為系統質量問題。軟件測試不僅局限于需求驗證,而是對用戶要求及交付能力的驗證和確認,其重要性被推向了前所未有的高度,成為軟件質量保證的一根“稻草”,測試基礎理論、基礎技術、應用技術研究持續深化,代碼掃描、靜態分析、性能測試、捕獲回放、Web測試技術等快速發展。2000年之后,隨著高可信軟件、網構軟件、敏捷開發、持續集成、DevSecOps及智能軟件技術等發展的內生需求,移動應用測試、云服務平臺測試、大數據及應用測試、微服務測試、敏捷測試、軟件開發工具包(Software Development Kit,SDK)測試、API自動化測試、WebService測試、DevSecOps測試等技術研究及應用實踐得以快速發展,基于容器的持續集成測試平臺建設,構建于Kubernetes上的微服務持續集成測試、大數據并發場景下的性能測試、基于云計算環境的規模化測試、基于行為驅動開發(Behavior-Driven Development,BDD)端到端的自動化測試、iOS UI自動化+基于Docker的分布式測試等技術得以廣泛應用示范,取得顯著成效。公共測試技術平臺及各類專業測試機構如雨后春筍般涌現,測試技術體系、標準體系與工程管理體系以及基于測試驅動的軟件質量工程快速發展,軟件測試邁入規范化、專業化、服務化、產業化發展之路。
伴隨著軟件開發技術的發展,人們對于軟件質量的認知以及測試驗證能力、質量保證能力持續演化發展,軟件測試需求、測試目的、測試技術等亦隨之演化發展。基于被測對象及不同測試模式的技術特征、組織形態等,可以基于不同視角描述軟件測試的發展演進過程。圖1-4給出了一個基于被測應用系統形態,前向兼容、序化演進的軟件測試演化過程。

圖1-4 基于被測對象及不同測試模式的軟件測試演化過程
自軟件測試概念誕生以來,業界從測試目的、測試對象、測試技術、測試流程、測試能力等不同維度,對軟件測試進行定義,有人甚至將軟件測試視為一種藝術,從哲學的角度進行定義,從《易經》中尋找答案,但均未形成主流,亦未根本改變軟件測試的定義及內涵。但基于系統工程思想,一種內生、外促的軟件測試思維模式,正在演化成為促進軟件測試最佳實踐的方法論,已是不爭的事實。
基于內部質量視角,軟件測試是為發現錯誤而執行程序的過程,即依據軟件開發階段的規格說明、開發文檔、程序結構等,基于逆向思維模式,解構軟件,設計測試用例,運行被測應用,暴露隱藏的錯誤和缺陷。基于外部質量視角,軟件測試是貫穿于軟件生命周期過程的驗證和確認活動,驗證軟件系統是否完整、正確地實現了系統規格所定義的系統功能及其特性。基于規約、設計、編碼檢查與驗證,軟件測試是軟件質量保證、軟件工程的重要內容。基于使用質量視角,軟件測試則跳出了錯誤檢測、驗證確認等的掣肘,面向用戶,基于系統行為建模,聚焦于交付能力、用戶體驗、用戶價值及社會價值提升。這是軟件測試概念演化的新方向,是軟件測試發展的新階段和新模式。
一致性難以保證應用系統滿足用戶需求以及需求的持續演化。業界以用戶為關注的焦點,關切用戶感受,充分理解用戶行為需求,將軟件測試作為跨學科、跨領域活動,通過不斷調查和講故事的方式完成體驗式測試、探索式測試、社會調查式測試,挖掘軟件系統的使用價值和社會價值,拓展價值展現維度,放大價值創造空間,服務社會經濟發展。
回溯軟件測試發展歷程,展望軟件測試美好未來,基于價值驅動和系統工程思維,從軟件測試的基本概念出發,澄清軟件測試的目的,揭示軟件測試的內涵,推進基于軟件測試驅動的缺陷工程、性能工程、質量工程、價值工程發展,是軟件測試的美好愿景。