XCTest-UnitTest
XCTest 和 Unit Testing Bundle
XCTest:是用來建立unit tests, performance tests, UI tests的Framework
Unit Testing Bundle:Xcode內建用來做單元測試的Target
如何建立 Unit Tests Target
當我們在建立專案時,Xcode 會貼心的提醒要不要自動建立 Unit / UI Tests,只要勾選 Include Tests 則會自動產生 Unit / UI Tests 的 Target(圖1)。
但若在上述步驟忘了勾選,或是後來才決定要加入 Unit Tests,則也可以透過手動新增Unit Tests 的 Target(圖2)。
手動新增的 Target 需要手動 Import 被測試的 Target(圖3)。
@testable import Demo



命名
必須以前綴test開頭、不帶參數、不返回值。
讓名稱具有描述性,透過命名了解測試方法將要測試的內容。
好的命名可以快速識別失敗的測試、幫助辨識是否已經測試過某種腳本或一段代碼。
當測試失敗時,我們想要知道甚麼?
我們正在測試什麼?
在什麼情況下?
預期的結果是什麼?
Setup and Teardown
setUp():在測試執行前做一些初始化的設定。
tearDown():測試結束後,在這裡清除資料或設定,確保不會留下任何可能影響後續測試的東西。

什麼時候使用addTeardownBlock()?
通常我們會在tearDown()中清除設定,但是tearDown()會在每項測試完成後執行。如果我們只是需要在某一項測試中清除某項設定或資料,就可以使用addTeardownBlock(),針對特定的測試項目進行處理。
Throwing methods
測試方法也可以也可以拋出錯誤,只要被測試的方法中拋出錯誤,就可以使用合適的XCTAssert來驗證。
XCTAssert
選擇正確的assert很重要。
不同的assert,提供不同的失敗原因和訊息,可以幫助我們更快的識別失敗的測試。


如何把程式寫成可測試
乾淨的架構 ( 請詳見 MVC 、 MVVM 等等架構 )
職責單一的物件
抽離檔案系統 ( UserDefault or File )、資料庫 ( DataBase )、遠端資料 ( Api )
常見的測試種類
1. 對 Model 測試:可測試 Model 的建構式或是方法
2. 對 API 做異步測試:使用 XCTestExpectation(這算是整合測試,不是單元測試)
3. 對 ViewModel 或是 Manager 測試:當遇到 API 或資料庫,可用 Protocol 抽離實作並依賴注入(DI)
建立呼叫 DataProvider 的 Protocol,並用依賴注入(DI)
測試的時候,建立 FakeDataProvider ,注入並且測試
4. 性能測試:使用Measure Block
性能測試需要設置Baseline來驗證是否通過測試,沒有設置的會提示No baseline average for Time。
點擊左側灰色菱形圖示,可以看到更多訊息、設置Baseline。

測試覆蓋率 Code Coverage


步驟3:Run Test




100% Coverage?
100%的覆蓋率並不是我們主要的目標,至少確認重要的邏輯已經被測試。
達到100%可能會非常耗時、精力,而效益可能不那麼大。
推薦書單
Reference
Last updated
Was this helpful?