テストとコード品質

XCTestの基本、Given-When-Thenで初めてのテストを書く(初心者ガイド)

iOS開発をしていると、「テストコードを書かないと…」と思いながら、つい先延ばしにしてしまいますよね。いざXCTestを開いても、何から始めればよいのか分かりにくいものです。

読了 4 分
XCTestの基本、Given-When-Thenで初めてのテストを書く(初心者ガイド)のカバー画像

iOS開発をしていると、「テストコードを書かないと…」と思いながら、つい先延ばしにしてしまいますよね。いざXCTestを開いても、何から始めればよいのか分かりにくいものです。

結論から言うと、最初のテストはGiven-When-Thenの3行から始めれば大丈夫です。準備し、実行し、検証する。この順番に慣れれば、あとは自然についてきます。

今日はXCTestの基本を押さえながら、このパターンで本当の最初のテストを書いてみましょう。

XCTestとはいったい何ですか?

XCTestは、AppleがXcodeに標準搭載しているテストフレームワークです。別途インストールする必要はなく、すぐに使えます。

プロジェクト作成時に「Include Tests」にチェックを入れるだけで、テストターゲットが自動的に作成されます。

要点だけ押さえておきましょう。

  • XCTestCase:テストを格納するクラスです。これを継承して始めます。
  • testで始まるメソッド:関数名がtestで始まると、Xcodeが自動的にテストとして認識します。
  • XCTAssert系:結果が正しいか検証する関数群です。

最初はこの3つだけ知っていれば十分です。

実行も簡単です。テストメソッド左側のダイヤモンドボタンをクリックするか、Command + Uを押すと、すべてのテストが実行されます。


Given-When-Thenとは?

テスト初心者が最も迷うのは、「コードはどの順番で書けばいいの?」という点です。

Given-When-Thenは、その順番を決めるパターンです。3つのかたまりに分けて考えれば大丈夫です。

  • Given(準備):テストに必要な値と状態を作る
  • When(実行):検証したい動作を1回だけ実行する
  • Then(検証):結果が期待どおりか確認する

日常の言葉にするとこうです。「カートにリンゴが2個入っているとき(Given)、支払額を計算したら(When)、2,000ウォンになるはず(Then)」。

準備し、実行し、検証する。この3拍子がGiven-When-Thenのすべてです。

このように分けて書くと、あとでテストが失敗したとき、どの段階に問題があるのかすぐ分かります。準備が間違っているのか、実行結果が誤っているのかを一目で把握できます。

緑のランプが1つ点いただけなのに、なぜか誇らしい気持ちになりました
緑のランプが1つ点いただけなのに、なぜか誇らしい気持ちになりました

初めてのテストを実際に書いてみましょう

簡単な電卓を例にします。2つの数を足すadd関数があると仮定します。

まず、テスト対象のコードです。

struct Calculator {
    func add(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
}

では、Given-When-Thenの順番でテストを書いてみます。コメントで3つの段階を示しておくと、ずっと読みやすくなります。

func testAddTwoNumbers() {
    // Given: 電卓と入力値を準備
    let calculator = Calculator()
    // When: 足し算を実行
    let result = calculator.add(2, 3)
    // Then: 結果を検証
    XCTAssertEqual(result, 5)
}

XCTAssertEqualは、2つの値が等しいか比較する関数です。resultが5でなければテストは赤で失敗し、5なら緑で成功します。

最初に緑のランプが点いたときの気持ちは、今でも覚えています。大したことではないのに、妙に誇らしかったものです。


よく使うXCTAssertのまとめ

XCTAssertEqualだけ知っていれば始められますが、状況に応じて使い分けるとコードがずっときれいになります。よく使うものを表にまとめました。

関数 使う場面
XCTAssertEqual(a, b) 2つの値が等しいか
XCTAssertTrue(条件) 条件が真か
XCTAssertFalse(条件) 条件が偽か
XCTAssertNil(値) 値がnilか
XCTAssertNotNil(値) 値がnilでないか

失敗時にメッセージを残したい場合は、最後の引数に文字列を入れます。たとえばXCTAssertEqual(result, 5, “足し算の結果が間違っています”)のように書きます。

よく使うXCTAssertだけ選んでおくと、コードがずっときれいになります
よく使うXCTAssertだけ選んでおくと、コードがずっときれいになります

初心者からよくある質問

Q. テストファイルはどこに置きますか? A. プロジェクトのTestsフォルダ内に置けば大丈夫です。実行するにはテストターゲットに含まれている必要があります。

Q. Whenは必ず1行で書く必要がありますか? A. 1行である必要はありません。ただし、検証する動作は1つだけ実行するのがおすすめです。1つのテストで1つのことだけを検証すれば、失敗の原因が明確になります。

Q. テスト関数の名前はどう付けますか? A. testで始めたうえで、testAddTwoNumbersのように何を検証するか分かる名前にするのがおすすめです。


今日はXCTestの基本とGiven-When-Thenパターンで、最初のテストを書きました。準備し、実行し、検証する。この3拍子だけ覚えておけば大丈夫です。

完璧なテストを書こうと気負わず、今日はadd関数1つから緑のランプを点けてみてください。その小さな成功が、次のテストにつながります。応援しています!