在這篇文章中,我們將介紹如何在 iOS 專案中加入單元測試。單元測試用於驗證程式碼的最小可測單元(如函數、方法或類別)是否正確。單元測試通常由開發人員自行編寫和執行,並使用各種工具和框架來自動化和簡化測試過程。單元測試的目的是確保程式的邏輯正確性和健壯性,提高程式質量和可維護性。
原文發佈於: https://www.marvinswift.com/unit-testing/unit-testing-from-zero-to-one.html
這篇文章要感謝 Hanyu Chen, 陳涵宇請我喝咖啡
## 測試從哪裡開始加?建議從沒有依賴其他物件的物件開始
下面的圖是專案物件依賴的示意圖,如果要寫測試,建議從沒有依賴其他物件的物件開始。
而最常被其他物件傳來傳去的,通常是 json response 相關的 dto,我們先假設有一道登入的 api,這道 API 會回傳你兩個 token,一個是 refresh token,另一個是 access token。
``json{ "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTcxODg4ODU1OSwiaWF0IjoxNzE4ODAyMTU5LCJqdGkiOiIzMDQyZDhlMGIzOTc0MjQyYTI0MDFhZDU0ZjRhMjAxOCIsInVzZXJfaWQiOjh9.45URkd4iyBx7mjeyB9yzQp5x3gICLYxo3laqtCNjyLE", "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4ODg4NTU5LCJpYXQiOjE3MTg4MDIxNTksImp0aSI6IjJjYzM2ZDFkZTMzYjQ3OTliNWE3MzQ1Njc5NzFkMWE1IiwidXNlcl9pZCI6OH0.j7CLMRL0EUknJ_HxRLeWS0vCD1QMfcrSL9kYDCTug1o"}``
## 在現有的專案加上 Unit Testing 的步驟
在 Project targets 的頁籤,按下 + 號,選擇 Unit Testing Bundle,就可以讓專案開始有測試。
### 預設的測試模板
加上檔案後,這預設的模版,你會看到兩個測試,以及 setup 和 tear down。
### 第一步,加上 @testable import
import XCTest 的上方,記得要 import 自已的專案,這樣才能讓 Unit testing target 來操作專案中的物件。``swift@testable import YourProjectName``
## 測試 token model
### model 的實作``swift/// 這是拿來接 json response 的 modelstruct TokenResponse: Codable { let refresh: String let access: String}``
### Unit testing 實作```swift@testable import StartUnitTestingimport XCTest
final class CocoaTests: XCTestCase {
/// 將 json response 轉成 data, Unit testing 不會真的去 call api private func getAPIRespnose() -> Data { let string =#"""{ "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTcxODg4ODU1OSwiaWF0IjoxNzE4ODAyMTU5LCJqdGkiOiIzMDQyZDhlMGIzOTc0MjQyYTI0MDFhZDU0ZjRhMjAxOCIsInVzZXJfaWQiOjh9.45URkd4iyBx7mjeyB9yzQp5x3gICLYxo3laqtCNjyLE", "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE4ODg4NTU5LCJpYXQiOjE3MTg4MDIxNTksImp0aSI6IjJjYzM2ZDFkZTMzYjQ3OTliNWE3MzQ1Njc5NzFkMWE1IiwidXNlcl9pZCI6OH0.j7CLMRL0EUknJ_HxRLeWS0vCD1QMfcrSL9kYDCTug1o"}"""# return string.data(using: .utf8) ?? Data() }}
```
第一步,先測試這段 unit testing 能不能在程式有錯的時候,提醒你,所以 XCTAssertEqual 的 equal 為空字串``swift /// 測試 token response func testTokenResponse() throws { let data = getAPIRespnose() let model = try JSONDecoder().decode(TokenResponse.self, from: data) XCTAssertEqual(model.refresh, "") XCTAssertEqual(model.access, "") }``
### 這時候,你會得到 failed test result,你會看到 Unit testing 告訴你哪個 model 的值是不對