測試與程式碼品質

XCTest 基礎:用 Given-When-Then 撰寫第一個測試(初學者指南)

進行 iOS 開發時,常常會想著「該寫點測試程式碼了……」,卻一直拖延。實際開啟 XCTest 後,又不知道該從哪裡開始。

閱讀 3 分鐘
XCTest 基礎:用 Given-When-Then 撰寫第一個測試(初學者指南) 封面圖

進行 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, “加法結果不正確”)。

只挑選常用的 XCTAssert,程式碼就會整潔許多
只挑選常用的 XCTAssert,程式碼就會整潔許多

初學者常問的問題

Q. 測試檔案要放在哪裡? A. 放在專案的 Tests 資料夾中即可。必須包含在測試目標中,才能執行。

Q. When 一定要只有一行嗎? A. 不必。不過,最好只執行一個要驗證的行為。每個測試只驗證一件事,失敗原因才會清楚。

Q. 測試函式名稱要怎麼取? A. 以 test 開頭,並讓名稱清楚表達驗證內容,例如 testAddTwoNumbers。


今天我們用 XCTest 基礎與 Given-When-Then 模式寫出了第一個測試。準備、執行、驗證。只要記住這三個節奏即可。

別給自己寫出完美測試的壓力,今天就先讓一個 add 函式亮起綠燈吧。這個小小的成功會帶來下一個測試。為你加油!