正如食品生產廠家在把產品銷售給商家之前要進行合格檢驗一樣,軟件企業在把軟件提交給客戶之前也需要進行嚴格的測試。如果把所開發出來的軟件看作一個企業生產出的產品,那么軟件測試就相當於該企業的質量檢測部分。簡單地說,在編寫完一段代碼之后,檢查其是否如自己所預期的那樣運行,這個活動就可以看作是一種軟件測試工作。
軟件測試的定義
了解到軟件測試的研究可以追溯20世紀60年代,至今已有50多年的發展歷史,但對於什么是軟件測試,還一直未能達成共識。根據側重點的不同,主要有以下三種觀點:
- IEEE在1983年將軟件測試定義為“使用人工或自動化手段運行或測定某個系統的過程,其目的在於檢測它是否滿足規定的需求或是弄清預期結果與實際結果之間的差別”,該定義明確地提出了軟件測試以檢驗是否滿足需求為目標。
- Myers則認為軟件測試“是為了發現錯誤而執行程序的過程”,明確提出了“尋找錯誤”是測試目的。
- 從軟件質量保證的角度看,軟件測試是一種重要的測試質量保證活動,其動機是通過一些經濟、高效的方法,捕捉軟件中的錯誤,從而達到保證軟件內在質量的目的。
上述三種觀點實際上是從不同的角度理解測試,是將測試置於不同的環境下得出的結論。事實上,在公開出版的刊物中,有多種不同的關於軟件測試的定義,根據這些定義可以認為軟件測試是一個在可控的環境中執行軟件的過程,目的就是為了驗證軟件是否按照預期運行。測試過程中的活動既包括“分析”軟件,也包括“運行”軟件。常常把與分析軟件開發中的各種產品相關的測試活動稱為靜態測試(static testing)。靜態測試包括代碼審查、走查和桌面檢查。相比之下,把與運行軟件有關的測試活動叫做動態測試(dynamic testing)。因此,不能簡單地認為軟件測試就是程序測試,只有在程序編碼結束后才能夠進行的工作;而是一項貫穿於整個軟件開發過程的工作。測試對象既包括源程序,也包括需求規格說明、概要設計說明、詳細設計說明。因此,也有人認為軟件測試(software testing)就是在軟件投入運行前,對軟件需求分析、設計規格說明和編碼的最終復審,是軟件質量保證的關鍵步驟。測試包括尋找缺陷,但不包括跟蹤漏洞及其修復。測試的重要性在於,它必須保證所開發的軟件達到設計時的需求,免除由於軟件自身的“缺陷”帶來的“漏洞”,最大限度地降低軟件開發的成本。
軟件測試有兩個基本職責:即驗證和確認。Schulmeyer和Mackenziee(2000)對驗證和確認所做的定義是: - 驗證(verification),保證開發過程中某一具體階段的產品與該階段和前一階段的需求一致。
- 確認(validation),保證最終得到的產品滿足系統需求。
有時,初學者常常會混淆軟件測試和調試。其實二者是不同的,表現在以下幾方面:
(1)調試是一個分析和定位軟件bug的過程。可以認為它是一種支持測試,但不能完全代替測試的活動。
(2)調試的目的是為了使軟件能夠正確運行,而測試的目的是為了發現軟件中存在的錯誤。
(3)調試的對象主要是源代碼,而測試的對象則是軟件開發過程中各個階段所產生的所有產品。
軟件測試生命周期
測試生命周期(software testing life cycle)的模型。把測試的生命周期分為幾個階段。前三個階段就是引入程序錯誤階段,也就是開發過程中的需求規格說明、設計、編碼階段,此時極易引入錯誤或導致開發過程中其他階段產生錯誤。然后就是通過測試發現錯誤的階段,這需要通過使用一些適當測試技術和方法來共同完成。后三個階段就是清除程序錯誤的階段,其主要任務就是進行缺陷分類、缺陷隔離和解決缺陷。其中在修復舊缺陷的時候很可能引進新的錯誤,導致原來能夠正確執行的程序出現新的缺陷。
在軟件測試生命周期的每個階段都要完成一些確定的任務,在執行每個階段的任務時,可以采用行之有效的結構分析設計技術和適當的輔助工具;在結束每個階段的任務時都進行嚴格的技術審查和管理復審。最后提交最終軟件配置的一個或幾個成分(文檔或程序)。
