測試驅動開發是敏捷開發的一部分,它一般有“red-green- refactor”步驟
iOS測試驅動開發的工具
一、 OCUnit 是Xcode內建的測試載入器
其使用步驟分為
1 建立測試的Target
對於測試的Target可分為兩種:logic test 和application test ,其中邏輯測試可獨立執行,應用測試需要啟動App。
對於應用測試需要Builder Setting配置好Bundle Loader 和Test Host的值,以便改Target可以用到。
Set
the value of the Bundle Loader build setting to:
2 編寫unit test case
OCUnit的test case都繼承自抽象類別SenTestCase,所以在編寫自己的測試類別時,
1 從SenTestCase繼承
2 在setUp方法中完成完成測試環境的建立,一般時建立初始化被測試類別的執行個體(在每個test函數執行錢,會被調用)
若要對於同一測試類別中不同的測試函數,需要setUp不同的環境,可以考慮使用setUpTestWithSelector:(SEL)testMethod;
3 編寫自己的測試函數如:testMyExample(需以test為首碼),使用斷言來聲明期望的測試結果
常用的斷言有
STAssertNil 斷言對象為空白
STAssertNotNil斷言對象為為空白
STAssertTrue 斷言運算式為真
STAssertFalse斷言運算式為假
STAssertEquals 斷言兩個變數值相等
STAssertEqualObjects斷言兩個對象相等
STAssertThrows 斷言拋出異常
STAssertNoThrow 斷言味拋出異常
更多斷言可參看SenTestingKit/SenTestingUtilities.h檔案
4 在tearDown完成測試環境的恢複(每個test函數執行完後,會被調用)
3 運行單元測試
command+U
具體的細節可參考官方文檔
二、GHUnit
測試架構,可視化測試結果顯示
GHUnit
GHUnit配置地址
三、 測試驅動開發最重要的是,編寫高品質的單元測試用例,按照MVC設計模式編寫的代碼,是有結構的,這個也可以應用到write unit test,對於Model層的test case,其一般結構如下
@class Topic;@interface TopicTests : SenTestCase { Topic *topic;}@end
在TopicTests類中,建立初始化topic,並通過happy result和邊界數值,來測試Topic類的行為
對於Controller層,一般較Model層複雜,會涉及到多個對象,要做的第一步便是孤立耦合,
對於非同步網路類的測試,要藉助不發送網路請求的Mock對象,
對於View層,單元測試覆蓋較少,
四、測試覆蓋率
對於Xcode4.0以上的同學,輸出coverage 結果的設定如下:
在對應的Target下,進入Build Setting介面
設定Generate Test Coverage Files:YES
Instrument Program Flow :YES
這是進入/Users/<username>/Library/Developer/Xcode/DerivedData/<app_name-<Serial>>/Build/Intermediates/<app_name>.build/Debug-iphonesimulator/<target_name>.build/Objects-normal/i386
會發下該檔案夾下有.gcda和.gcno檔案,這時候便是Xcode的LLVM輸出了測試結果,下載一個CoverStory ,開啟相應的檔案變可看到