開始之前
本文側重講述如何在iOS程序的開發過程中使用單元測試。使用Xcode自帶的OCUnit作為測試框架。
一、單元測試概述
單元測試作為敏捷開發實踐的組成之一,其目的是提高軟件開發的效率,維持代碼的健康性。其目標是證明軟件能夠正常運行,而不是發現bug(發現bug這一目的與開發成本是正相關的,雖然發現bug是保證軟件質量的一種手段,但是很顯然這與降低軟件開發成本這一目的背道而馳)。它是對軟件質量的一種保證,例如重構之后我們需要保證軟件產品的正常運行。
很多人認為編寫單元測試沒有用是認為單元測試并不能保證一定能減少bug發生的幾率,而由于編寫單元測試一定會花費一定的時間與精力,因而必然的會增加成本??陀^的說,造成這種原因很大的程度上是程序員的水平不夠高。我認為使用使用單元測試帶來巨大好處的必要條件如下所示:
1、程序員本身的編程水平--是否有較多的代碼經驗,是否熟練掌握重構
2、程序員對項目的認知--是否能正確理解軟件或模塊的需求
3、項目質量--是否穩定,是否長期多版本,是否需要應對較多變化
如果程序員水平較高,對需求理解較為清晰,項目需要面對較多的變化,那么毫無疑問單元測試對于軟件非常有益。假如軟件功能簡單且開發周期短,不需要進行復雜的維護工作,那么單元測試的意義并不大。
優秀的單元測試實踐的好處:
1、好的單元測試就是一份好的文檔,并且比文檔更能為程序員所接受,它直接描述了測試員對受測代碼的結果所持的預期。
2、當代碼由別人維護時(或自己進行重構時),通過單元測試的約束,才能保證在加入新功能或修改舊功能時代碼的正確性。
3、由于單元測試的自動化執行,保證了在整個開發流程中代碼都會被測試,這非常符合XP思想。
4、保證在面對軟件功能的變化時,程序員可以較為放心的進行代碼重構,而不必擔心是否破壞了原有功能。
5、好的單元測試可以降低bug數量,而對于項目管理來說,修改bug這個過程是無法制定計劃的,可以使軟件的開發流程更容易掌控。
6、可以由老程序員編寫描述某個類行為的測試,以此指導新程序員對類的編碼。
好處還有很多,但最重要的一點就是保證了軟件質量的同時,由于減少bug和應對變化造成的回歸bug的產生等,提高了勞動生產率。而且,在敏捷流程中,使用單元測試是必須掌握的手段,否則就沒發保證重構的正確性,從而造成代碼無法面對變化。
二、iOS的單元測試概述
剛接觸客戶端編程時,我在很長一段時間內都想不通對于客戶端程序如何編寫單元測試。單元測試本質上說白了就是用一些斷言來判定結果,而這種方式是如何應用到具有復雜交互的界面測試上來的呢?
我們要做的就是將客戶端代碼轉化為易于測試的代碼。什么樣的代碼易于測試呢?它至少是這樣的:
1、被測方法需要產生可測量的結果。
2、類之間的關系應該是松耦合的。
其中第一條是必要條件。使用斷言這種形式指明了測試的方法最終要造成某些可以度量的結果。因而,我們需要盡量的將展示和業務邏輯分離開來。展示的代碼是沒法測試的,例如有的方法只是播放動畫。而業務邏輯最終都會造成一些數據的改變,這是容易測試的。
大略的講,作為一個iOS程序員來說,首先要了解一個叫做MVC的模式。這個模式定義了Cocoa Touch框架的總體結構。在iOS程序中,我們也需要按照這種模式進行界面代碼的編寫。這樣設計出來的類具有較好的結構,且比較適合于做單元測試。
然后一定要懂得不停重構代碼,這樣我們才能使代碼不停地改善,不停地變得更加適合單元測試。
有一些框架可以幫助大家更好的測試,分別是OCUnit、GTM、GHUnit、CATCH、OCMock,但目前對我來說,OCUnit足夠用了。作為蘋果官方提供的測試框架,它最大的優點就是簡單易用。
三、單元測試實踐
下面是一些我所理解的單元測試中比較好的實踐。
顧名思義,單元測試面向的對象是單元,這個專有名詞源自編譯器領域的術語“編譯單元”。在面向過程中,指的是函數,而在面向對象中,指的通常就是“類”。因而,每個功能類都應該提供對應的單元測試。
原文轉自:http://www.uml.org.cn/Test/201306072.asp