iOS-單元測試詳解

圖片描述

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

前言

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

什麼是單元測試

(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

相關文章
相關標籤/搜索