似此星辰非昨夜
爲誰風露立中宵
前言
我們在做組件化的過程中,肯定需要做的一步就是拆組件,把我們項目中的各個模塊拆分爲基礎組件、功能組件、業務組件,但是在拆分的過程中很容易就會出現問題,所以我們在做組件化的過程中把每個組件都加上了單元測試,這樣可以大大提高了我們組件的健壯性,隨着我們的組件完成告一段落,今天就把當初探索學習單元測試的經驗分享給大家,每種斷言、每種測試場景都對應的有例子,希望能對你能有幫助
什麼是單元測試
(Unit Testing)又稱爲模塊測試, 是針對程序模塊的最小單位來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對於面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。
單元測試的發展
1.Xcode在XCode4.x時代集成的是OCUnit
2.XCode5.x時代就升級爲了XCTest
3.XCode7增加UI測試
單元測試框架
- XCTest(蘋果自帶,推薦)
- Kiwi
- GHUint
- OCMock
單元測試帶來的好處
- 測試做了我們期望它做的事情
- 儘早的發現程序的 bug 和不足
- 保證在加入新功能或修改舊功能時代碼的正確性
缺點:
沒有足夠的時間編寫單元測試,或者說大家都沒有寫單元測試的習慣
XCTest
XCTest是Xcode自帶的一個測試框架,蘋果官方推薦我們使用
XCTestCase
XCTest中的測試類都是繼承自XCTestCase
XCTestCase類結構
- (void)setUp:
在調用類中的每個測試方法之前調用此方法。
- (void)tearDown
這個方法在類中的每個測試方法調用之後調用
- (void)testPerformanceExample
將要度量時間的代碼放在這裏
- (void)testExample
使用XCTAssert和相關函數驗證測試結果是否正確
斷言
無條件報錯
等價測試
nil測試
布爾測試
異常測試
無條件報錯
1.XCTFail.生成一個無條件報錯。
等價測試
1.XCTAssertEqualObjects
2.XCTAssertNotEqualObjects
3.XCTAssertEqual. 當expression1不等於expression2時報錯,這個測試用於C語言的常量
4.XCTAssertNotEqual
5.XCTAssertEqualWithAccuracy. 當expression1和expression2之間的差別高於accuracy 將報錯。這種測試適用於floats和doubles這些常量,兩者之間的細微差異導致它們不完全相等,但是對所有的常量都有效。
6.XCTAssertNotEqualWithAccuracy
Nil(空)測試
1.XCTAssertNil. 當expression參數非nil時報錯
2.XCTAssertNotNil
Boolean測試
1.XCTAssertTrue. 當expression計算結果爲false時報錯。
2.XCTAssertFalse. 當expression計算結果爲true報錯。
3.XCTAssert. 當expression計算結果爲false時報錯,與XCTAssertTrue同義。
異常斷言測試
1.XCTAssertThrows.當expression不拋出異常時報錯。
2.XCTAssertNoThrow. 當expression拋出異常時報錯。
3.XCTAssertThrowsSpecific.當expression針對指定類不拋出異常時報錯。
4.XCTAssertNoThrowSpecific. 當expression針對指定類拋出異常時報錯。任意其他異常都可以;也就是說它不會報錯。
5.XCTAssertThrowsSpecificNamed. 當expression針對特定類和特定名字不拋出異常時報錯。對於AppKit框架或Foundation框架非常有用,拋出帶有特定名字的NSException(NSInvalidArgumentException等)。
6.XCTAssertNoThrowSpecificNamed. 當expression針對特定類和特定名字拋出異常時報錯。對於AppKit框架或Foundation框架非常有用,拋出帶有特定名字的NSException(NSInvalidArgumentException等)
如何寫單元測試
找到測試場景
邏輯測試
異步測試
性能測試
準備測試數據
邊界測試數據
正確測試數據
錯誤測試數據
驗證結果
使用斷言驗證
單元測試的規範
1.合理命名測試用例
1.一個測試方法只測試被測類的一個明確功能, 並命名相應測試方法
需要被測試的方法
相應的測試方法
2.保持測試的獨立性
3.把測試維持在單元級別
4.只測公有接口
邏輯測試
異步測試
1.定義一個XCTestExpectation,表示異步測試想要的結果。
2.設置timeout,表示異步測試最多可以執行的時間。
3.異步的代碼完成後,調用fullfill來通知異步測試滿足條件
性能測試
1.評估一段代碼的運行時間,XCTest的性能的測試如下格式
Performance Result(性能測試結果)
Metric:時間作爲性能的指標
Average:表示平均時間
Baseline:表示你設置一個基線
Result:是指平均時間和你是設置的基線進行比較後得出的結果,百分比表示的
max STDDEV :表示標準偏差 10%。
點擊Edit,我們可以設置Baseline,ax STDDEV ,來設置覺得滿意的性能測試條件
底部點擊1,2…10可以看到每次運行的結果。
調試
1.運行測試用例
選中XCode的測試用例導航
1.運行一組測試用例:command+U
2.運行一個單獨的測試用例:
2.新建測試用例
選中test的target,右鍵
3.斷點調試
爲測試用例添加失敗斷點來方便我們調試:
4.查看測試結果
1. 通過測試導航欄可以查看到測試結果:
2.通過Report導航欄可以看到更詳細的測試結果:
點擊測試用例後面的箭頭,可以跳轉到測試用例的代碼。
代碼覆蓋率
1.選擇 Target,然後選擇 Test 模塊,然後勾選 Gather coverage data
2.在 report模塊中就能看到每一個 .m文件 的代碼覆蓋情況
結語
俗話說,一屋不掃,何以掃天下。開發中,我們自己的代碼都不能保證功能的正確性,那麼還有什麼效率可言呢?做再多的任務,寫再多的代碼也只不過是在搭雞窩,做着機器一樣的重複的工作。IT界有一個原則,DRY原則 —— Don't Repeat Yourself !只有通過對自己的工作不斷的檢查,不斷的測試,才能不斷的突破,不斷的脫穎而出,當然,你才能不斷的提高。