淺談單元測試的意義
單元測試由一組獨立的測試構成,每個測試針對軟件中的一個單獨的程序單元。如果對單元測試的內容不清楚的同學,可以參考這篇文章,詳細講解單元測試的內容。
對于單元測試,人們往往存在很多的誤解:
1)浪費的時間太多
一旦編碼完成,缺乏軟件工程實踐經驗的開發人員就會迫不及待地進行軟件集成工作,這樣就能看到實際系統開始啟動工作,在這種開發步驟中,真正意義上的進步被表面上的進步所取代。系統能進行正常工作的可能性很小,更多的情況是充滿了各式各樣的Bug。這些Bug包含在獨立的單元里,其本身也許是瑣碎、微不足道的,但在軟件集成為一個系統時會增加額外的工期和費用。
其實進行完整的單元測試和編寫代碼所花費的精力大致上是相同的,一旦完成了單元測試,在確保手頭擁有穩定可靠部件的情況下,再進行高效的軟件集成才是真正意義上的進步。
程序的可靠性對軟件產品的質量有很大的影響,在大型軟件公司,每寫一行程序,都可能要測試很多遍。由此可見大型軟件公司對測試的重視程度。
2)軟件開發人員不應參與單元測試
單元測試常常和編碼同步進行,每完成一個模塊就應進行單元測試。在對每個模塊進行單元測試時,不能忽略和其他模塊的關系,為模擬這一關系,需要輔助模塊,因此若單獨的測試人員進行單元測試,往往工作量大,周期長,耗費巨大,其結果事倍功半。軟件的開發者總是應當負責程序的單個單元的測試,保證每個單元能夠完成設計的功能,其實在很多情況下,開發者也應進行集成測試。
3)我是很棒的程序員,不需要進行單元測試
如果我們真正擅長編程并且有絕招,就應當不會有錯誤,但這只是一個神話。編碼不是可以一次性通過的,必須經過各種各樣的測試,單元測試只是其中一種。缺乏測試的程序代碼可能包含許多Bug,程序員在沒有測試保護的情況下修改Bug,會引發更多的Bug,忙于除蟲,于是更沒有時間測試。如此循環往往會導致項目的崩潰。為避免產生惡性循環,代碼必須有一張安全網來保護,隨時進行的單元測試就是這張安全網。
4)不管怎樣,集成測試將會抓住所有的Bug
集成測試的目標是把通過單元測試的模塊拿來,構造一個在設計中所描述的程序結構,通過測試發現和接口有關的問題。我們在測試工作開展的過程中,發現并提交進行合格性測試的軟件,在測試過程中有很多Bug,有些嚴重問題,甚至導致死機,以至于不能再測試其他功能,進行錯誤修改,回歸測試時又發現其他新的問題,使得測試工作很難開展下去。
5)單元測試效率不高
在實際工作中,開發人員不想進行單元測試,認為沒有必要且效率不高,其實錯誤發生和被發現之間的時間與發現和改正該錯誤的成本是指數關系,頻繁的單元測試能使開發人員排錯的范圍縮得很小,大大節約排錯所需的時間,同時錯誤盡可能早地被發現和消滅會減少由于錯誤而引起的連鎖反應。
在某一功能點上進行準備測試、執行測試和修改缺陷的時間,單元測試的效率大約是集成測試的兩倍、系統測試的三倍。
通過對這些誤解的分析,可以對單元測試有進一步的了解,其實作為軟件系統的最小組成單位,單元測試具有以下屬性:
- 它是由一個程序員完成的。
- 它有一個詳細的設計說明,包括輸入定義、輸出定義和加工說明。
- 它是一個可識別的看得見的程序組成部分,并容易被組合成程序。
- 能被單獨地匯編和測試。
- 它的規模比較小,邏輯比較簡單。
因此單元測試具有以下意義:
1)單元測試集中注意力于程序的基本組成部分,首先保證每個單元測試通過,才能使下一步把單元組裝成部件并測試其正確性具有基礎。單元是整個軟件的構成基礎,像硬件系統中的零部件一樣,只有保證零部件的質量,這個設備的質量才有基礎,單元的質量也是整個軟件質量的基礎。因此,單元測試的效果會直接影響軟件的后期測試,最終在很大程度上影響到產品的質量。
2)單元測試可以平行開展,這樣可以使多人同時測試多個單元,提高了測試的效率。
3)單元規模較小,復雜性較低,因而發現錯誤后容易隔離和定位,有利于調試工作。
4)單元的規模和復雜性特點,使單元測試中可以使用包括白盒測試的覆蓋分析在內的許多測試技術,能夠進行比較充分細致的測試,是整個程序測試滿足語句覆蓋和分支覆蓋要求的基礎。
5)單元測試的測試效果是最顯而易見的。做好單元測試,不僅后期的系統集成聯調或集成測試和系統測試會很順利,節約很多時間;而且在單元測試過程中能發現一些很深層次的問題,同時還會發現一些很容易發現而在集成測試和系統測試很難發現的問題;更重要的是單元測試不僅僅是證明這些代碼做了什么,是如何做的,而且證明是否做了它該做的事情而沒有做不該做的事情。
6)單元測試的好與壞不僅直接關系到測試成本(因為如果單元測試中易發現的問題拖到后期測試發現,那么其成本將成倍數上升),而且也會直接影響到產品質量,因為可能就是由于代碼中的某一個小錯誤就導致了整個產品的質量降低一個指標,或者導致更嚴重的后果。
事實上,單元測試是一種驗證行為—— 測試和驗證程序中每一項功能的正確性,為以后的開發提供支持;單元測試是一種設計行為—— 編寫單元測試將使我們從調用者觀察、思考,特別是要先考慮測試,這樣就可把程序設計成易于調用和可測試的,并努力降低軟件中的耦合,還可以使編碼人員在編碼時產生預測試,將程序的缺陷降低到最小;單元測試是一種編寫文檔的行為—— 是展示函數或類如何使用的最佳文檔;單元測試具有回歸性—— 自動化的單元測試有助于進行回歸測試。
【編輯推薦】