iOS-單元測試詳解

圖片描述

似此星辰非昨夜
爲誰風露立中宵

前言

我們在做組件化的過程中,肯定需要做的一步就是拆組件,把我們項目中的各個模塊拆分爲基礎組件、功能組件、業務組件,但是在拆分的過程中很容易就會出現問題,所以我們在做組件化的過程中把每個組件都加上了單元測試,這樣可以大大提高了我們組件的健壯性,隨着我們的組件完成告一段落,今天就把當初探索學習單元測試的經驗分享給大家,每種斷言、每種測試場景都對應的有例子,希望能對你能有幫助

什麼是單元測試

(Unit Testing)又稱爲模塊測試, 是針對程序模塊的最小單位來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對於面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。

單元測試的發展

 1.Xcode在XCode4.x時代集成的是OCUnit
 2.XCode5.x時代就升級爲了XCTest
 3.XCode7增加UI測試

單元測試框架

  1. XCTest(蘋果自帶,推薦)
  2. Kiwi
  3. GHUint
  4. OCMock

單元測試帶來的好處

  1. 測試做了我們期望它做的事情
  2. 儘早的發現程序的 bug 和不足
  3. 保證在加入新功能或修改舊功能時代碼的正確性

缺點:

沒有足夠的時間編寫單元測試,或者說大家都沒有寫單元測試的習慣

XCTest

XCTest是Xcode自帶的一個測試框架,蘋果官方推薦我們使用

XCTestCase

XCTest中的測試類都是繼承自XCTestCase

clipboard.png

XCTestCase類結構

clipboard.png

- (void)setUp:

在調用類中的每個測試方法之前調用此方法。 

- (void)tearDown

這個方法在類中的每個測試方法調用之後調用

- (void)testPerformanceExample

將要度量時間的代碼放在這裏

- (void)testExample

使用XCTAssert和相關函數驗證測試結果是否正確

斷言

無條件報錯
等價測試
nil測試
布爾測試
異常測試

無條件報錯

1.XCTFail.生成一個無條件報錯。

clipboard.png

等價測試

1.XCTAssertEqualObjects

clipboard.png

2.XCTAssertNotEqualObjects

clipboard.png

3.XCTAssertEqual. 當expression1不等於expression2時報錯,這個測試用於C語言的常量

4.XCTAssertNotEqual

clipboard.png

5.XCTAssertEqualWithAccuracy. 當expression1和expression2之間的差別高於accuracy 將報錯。這種測試適用於floats和doubles這些常量,兩者之間的細微差異導致它們不完全相等,但是對所有的常量都有效。

6.XCTAssertNotEqualWithAccuracy

clipboard.png

Nil(空)測試

1.XCTAssertNil. 當expression參數非nil時報錯
2.XCTAssertNotNil

clipboard.png

Boolean測試

1.XCTAssertTrue. 當expression計算結果爲false時報錯。
2.XCTAssertFalse. 當expression計算結果爲true報錯。
3.XCTAssert. 當expression計算結果爲false時報錯,與XCTAssertTrue同義。

clipboard.png

異常斷言測試

1.XCTAssertThrows.當expression不拋出異常時報錯。
2.XCTAssertNoThrow. 當expression拋出異常時報錯。

clipboard.png

3.XCTAssertThrowsSpecific.當expression針對指定類不拋出異常時報錯。
4.XCTAssertNoThrowSpecific. 當expression針對指定類拋出異常時報錯。任意其他異常都可以;也就是說它不會報錯。

clipboard.png

5.XCTAssertThrowsSpecificNamed. 當expression針對特定類和特定名字不拋出異常時報錯。對於AppKit框架或Foundation框架非常有用,拋出帶有特定名字的NSException(NSInvalidArgumentException等)。

6.XCTAssertNoThrowSpecificNamed. 當expression針對特定類和特定名字拋出異常時報錯。對於AppKit框架或Foundation框架非常有用,拋出帶有特定名字的NSException(NSInvalidArgumentException等)

clipboard.png

如何寫單元測試

找到測試場景

邏輯測試
異步測試
性能測試

準備測試數據

邊界測試數據
正確測試數據
錯誤測試數據

驗證結果

使用斷言驗證

單元測試的規範

1.合理命名測試用例

1.一個測試方法只測試被測類的一個明確功能, 並命名相應測試方法

需要被測試的方法
clipboard.png

相應的測試方法
clipboard.png

clipboard.png

clipboard.png

clipboard.png

clipboard.png

2.保持測試的獨立性

3.把測試維持在單元級別

4.只測公有接口

邏輯測試

clipboard.png

異步測試

1.定義一個XCTestExpectation,表示異步測試想要的結果。
2.設置timeout,表示異步測試最多可以執行的時間。
3.異步的代碼完成後,調用fullfill來通知異步測試滿足條件

clipboard.png

性能測試

1.評估一段代碼的運行時間,XCTest的性能的測試如下格式

clipboard.png

Performance Result(性能測試結果)

clipboard.png

Metric:時間作爲性能的指標
Average:表示平均時間
Baseline:表示你設置一個基線
Result:是指平均時間和你是設置的基線進行比較後得出的結果,百分比表示的
max STDDEV :表示標準偏差 10%。
點擊Edit,我們可以設置Baseline,ax STDDEV ,來設置覺得滿意的性能測試條件
底部點擊1,2…10可以看到每次運行的結果。

調試

1.運行測試用例

選中XCode的測試用例導航
1.運行一組測試用例:command+U
2.運行一個單獨的測試用例:

clipboard.png

2.新建測試用例

選中test的target,右鍵

clipboard.png

3.斷點調試

爲測試用例添加失敗斷點來方便我們調試:

clipboard.png

4.查看測試結果

1. 通過測試導航欄可以查看到測試結果:

clipboard.png

2.通過Report導航欄可以看到更詳細的測試結果:

clipboard.png
點擊測試用例後面的箭頭,可以跳轉到測試用例的代碼。

代碼覆蓋率

1.選擇 Target,然後選擇 Test 模塊,然後勾選 Gather coverage data

clipboard.png

2.在 report模塊中就能看到每一個 .m文件 的代碼覆蓋情況

clipboard.png

結語

俗話說,一屋不掃,何以掃天下。開發中,我們自己的代碼都不能保證功能的正確性,那麼還有什麼效率可言呢?做再多的任務,寫再多的代碼也只不過是在搭雞窩,做着機器一樣的重複的工作。IT界有一個原則,DRY原則 —— Don't Repeat Yourself !只有通過對自己的工作不斷的檢查,不斷的測試,才能不斷的突破,不斷的脫穎而出,當然,你才能不斷的提高。

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章