進行 iOS 開發時,常常會想著「該寫點測試程式碼了……」,卻一直拖延。實際開啟 XCTest 後,又不知道該從哪裡開始。
先說結論:第一個測試從 Given-When-Then 三行開始就可以了。準備、執行、驗證。熟悉這個順序後,其他內容自然會跟上。
今天就一起掌握 XCTest 基礎,並用這個模式實際寫出第一個測試。
XCTest 到底是什麼?
XCTest 是 Apple 內建於 Xcode 的測試框架。不需要另外安裝,立即就能使用。
建立專案時,只要勾選「Include Tests」,就會自動建立測試目標。
先掌握重點。
- XCTestCase:存放測試的類別。繼承它就能開始。
- 以 test 開頭的方法:函式名稱以 test 開頭時,Xcode 會自動將它辨識為測試。
- XCTAssert 系列:用來驗證結果是否正確的函式。
一開始只知道這三項,就足以入門。
執行測試很簡單。按下測試方法左側的菱形按鈕,或按下 Command + U,就會執行全部測試。
Given-When-Then 是什麼?
測試初學者最容易卡住的地方,就是「所以程式碼到底要按照什麼順序寫?」
Given-When-Then 正是用來規定這個順序的模式。把它想成三個區塊即可。
- Given(準備):建立測試所需的值與狀態
- When(執行):只執行一次想驗證的行為
- Then(驗證):確認結果是否符合預期
換成日常語言就是:「購物車裡有 2 顆蘋果時(Given),計算付款金額(When),結果應該是 2000 韓元(Then)。」
準備、執行、驗證。這三個節奏就是 Given-When-Then 的全部。
這樣分開撰寫後,日後測試失敗時,就能立刻看出是哪個階段出了問題。一眼就能判斷是準備錯誤,還是執行結果不正確。
實際寫出第一個測試
以簡單的計算機為例。假設有一個用來相加兩個數字的 add 函式。
首先是要測試的目標程式碼。
struct Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
}
現在按照 Given-When-Then 的順序撰寫測試。用註解標示三個階段,會更容易閱讀。
func testAddTwoNumbers() {
// Given: 準備計算機與輸入值
let calculator = Calculator()
// When: 執行加法
let result = calculator.add(2, 3)
// Then: 驗證結果
XCTAssertEqual(result, 5)
}
XCTAssertEqual 是用來比較兩個值是否相同的函式。如果 result 不是 5,測試就會以紅色失敗;如果是 5,則會以綠色通過。
我至今仍記得第一次亮起綠燈時的心情。明明沒什麼大不了,卻莫名感到很有成就感。
常用的 XCTAssert 總結
只知道 XCTAssertEqual 也能開始,但依情境選擇使用,程式碼會整潔許多。我把常用的項目整理成表格。
| 函式 | 使用時機 |
|---|---|
| XCTAssertEqual(a, b) | 兩個值是否相同 |
| XCTAssertTrue(條件) | 條件是否為真 |
| XCTAssertFalse(條件) | 條件是否為假 |
| XCTAssertNil(值) | 值是否為 nil |
| XCTAssertNotNil(值) | 值是否不為 nil |
如果想在失敗時留下訊息,只要在最後一個參數放入字串即可。例如:XCTAssertEqual(result, 5, “加法結果不正確”)。
初學者常問的問題
Q. 測試檔案要放在哪裡? A. 放在專案的 Tests 資料夾中即可。必須包含在測試目標中,才能執行。
Q. When 一定要只有一行嗎? A. 不必。不過,最好只執行一個要驗證的行為。每個測試只驗證一件事,失敗原因才會清楚。
Q. 測試函式名稱要怎麼取? A. 以 test 開頭,並讓名稱清楚表達驗證內容,例如 testAddTwoNumbers。
今天我們用 XCTest 基礎與 Given-When-Then 模式寫出了第一個測試。準備、執行、驗證。只要記住這三個節奏即可。
別給自己寫出完美測試的壓力,今天就先讓一個 add 函式亮起綠燈吧。這個小小的成功會帶來下一個測試。為你加油!

