0.前言
在介紹XCTest之前,我們先來了解兩個基本概念BDD(Behavior Driven Development-行為驅動開發(fā))與TDD(Test Driven Development-測試驅動開發(fā))
0.1TDD-測試驅動開發(fā)
Test Driven Development即測試驅動開發(fā),它是一種用一種測試先于編寫代碼的思想來指導軟件開發(fā)。測試驅動開發(fā)是敏捷開發(fā)中的一項核心實踐和技術,其原理是在開發(fā)功能代碼之前,先編寫單元測試用例代碼,從而通過測試代碼確定需要編寫什么具體的開發(fā)代碼
0.2 BDD-行為驅動開發(fā)
顧名思義,行為驅動開發(fā)是指以軟件實際要達到的目標也就是需求設計來驅動整個開發(fā)過程,更關注于用戶故事,即產品、開發(fā)者、測試人員一起頭腦風暴,分析實際對應用戶對于該軟件的需求,然后將這些需求寫成一個個的故事。開發(fā)者負責填充故事的內容滿足用戶需求,測試者負責檢驗這些故事的結果是否是用戶所希望的成果。相比較TDD來說,這種開發(fā)形式可以盡可能的避免用戶和開發(fā)者在溝通上的障礙,實現客戶和開發(fā)者同時定義系統的需求,避免因為理解需求不充分而帶來的不必必要的工作量。
1.單元測試
在講XCTest之前我們先來了解一下單元測試。單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證,通過開發(fā)者編寫代碼去驗證被測代碼是否正確的一種手段,例如編寫一個測試函數去測試某一功能函數是否能正確執(zhí)行達到預期效果。在實際項目開發(fā)中使用單元測試可以提高軟件的質量,也可以盡量早的發(fā)現代碼中存在的問題加以修正。
2.iOS開發(fā)中的XCTest
XCTest是Xcode自帶的單元測試框架,我們可以使用該框架做功能性代碼的白盒單元測試,以自測并增強代碼健壯性。
2.1在項目中添加XCTest
我們可以通過兩種方式在我們的項目中添加:
2.1.1創(chuàng)建項目時直接勾選改選項

創(chuàng)建項目成功過項目目錄下即可看到對應的單元測試文件夾

2.1.2項目創(chuàng)建后添加
點擊Show the Test navigator選項可以看到現在我們項目中是未添加單元測試的

點擊下方?按鈕,選中New Unit Test Target選項
然后配置參數

點擊Finish即可

2.2簡介
添加完測試單元后我們再來了解一下如何添加測試文件(以TempProject項目為例)。選中TempProjectTests文件夾->點擊右鍵->New File->選擇Unit Test Case Class->繼承自XCTestCase類,可以看到如下圖測試文件已被創(chuàng)建

你可能已經注意到了,嗯?只有一個.m文件?是的。下面我們來解釋一下XCTest文件的特性:
2.2.1 tip
- 1.整個工程中應該有多個XCTest文件,每一個XCTests都是只有.m文件的,繼承自XCTestCase(當然如果你有公共配置,其實可以先新建繼承自XCTestCase類的一個Cocoa Touch Class類比如說SQYBaseTestCase類,當作自己的XCTest所有類的父類,然后對于測試的基本配置/公用方法都可以在這個父類中實現啦~其他子類文件可以直接繼承自SQYBaseTestCase類就可以直接調用公有方法了)
- 2.每個XCTests.m文件中,必然包含一個setUp方法和一個tearDown方法
- 3.每個單元測試方法執(zhí)行之前,XCTest會先執(zhí)行setUp方法,所以我們可以在這個方法中進行初始化參數或測試環(huán)境的配置
- 4.每個單元測試方法執(zhí)行結束后,XCTest會執(zhí)行tearDown方法,所以可以把需要測試完成后銷毀的內容邏輯放在這里,以便保證下面的測試不受本次測試影響
- 5.每個單元測試方法都應該以test開頭(如上張圖所示[Hey])
2.2.2 怎樣執(zhí)行測試用例?

如上圖所示,你可以選擇點擊圖標運行某一個測試用例方法,或者運行整個測試類,執(zhí)行結果會通過不同的圖標進行標注。
2.2.3 測試用例代碼書寫需要注意的點
在我們書寫測試用例代碼時
你可以使用XCTAssert斷言來幫助你更好的書寫測試代碼
-
XCTest的測試包中的文件路徑
不能通過[NSBundle mainBundle]來訪問,因為UnitTest的路徑不是你的應用程序的路徑,所以應該使用以下命令來訪問tipNSString *path = [[NSBundle bundleForClass:[myClass class]] pathForResource:name ofType:@"png"]; 有些需要測試的方法可能會執(zhí)行異步網絡操作,也許并不能立即返回服務器響應的結果,這就需要我們考慮實現異步操作的單元測試,而XCTestCase內置支持測試異步方法
【1】使用expectationWithDescription:方法獲取XCTestExpectation的實例,在這一模式下,測試完成的方法并不會被標記為測試用例通過。
【2】使用waitForExpectationsWithTimeout:handler:方法來等待操作完成,如果測試用例沒有完成,那么將會調用回調處理的塊。
【3】XCTestExpectation為fulfilled狀態(tài)的話代表異步操作已經完成,可以檢測是否符合預期。
3.單元測試的覆蓋率
在自動化單元測試或功能測試中,經常使用代碼覆蓋率用來表示經過測試的代碼的百分比,以保證我們的代碼能夠經過足夠的測試。
我們可以開通xcode的代碼覆蓋收集

開通后就可以在導航欄的報告導航欄中看到測試記錄及結果,還可以選擇點擊??跳轉到測試代碼處,還可以點擊Coverage或者Logs標簽查看覆蓋代碼和測試日志

但是測試用例的覆蓋率是多高才合適呢?個人認為100%并不好,因為如果一個函數只是簡單地實現了類似變量自增功能,而你依舊寫了測試用例去測試該函數,那么對于測試用例編寫的時間和精力反而比花費在開發(fā)上的還多反而得不償失,同時也會大大增加代碼量,造成邏輯混亂。所以應該謹慎的使用測試用例。