XCTestを使ってユニットテストを導入してみよう!

ブログメインビジュアル

こんにちは!エンジニアの鞠谷です。
iOSアプリにテストコードを導入する場合に、多くの方が選択するのがXCTestだと思います
XCTestにはユニットテストを行う『iOS Unit Testing Bundle』とUIテストを行う『iOS UI Testing Bundle』が存在します。
今回はXCTestを用いてユニットテストを書く方法を説明していきます

それでは、さっそくやっていきましょう!

目次

テストターゲットの追加

XCTestは以下の2つの方法で追加することができます。

  • プロジェクト作成時に指定する
  • 後から追加する

それぞれの方法について説明します。

プロジェクト作成時に指定する

新規でプロジェクトを作成する際に、テストターゲットも一緒に作成する場合は、Include Tests にチェックを入れてプロジェクトを作成します。

プロジェクト作成時に指定する

後から追加する

既存のプロジェクトにテストターゲットを追加する際は、File > New > Target から Unit Testing Bundle を選択して追加します。

後から追加する

これでテストターゲットが追加されました。

ユニットテストを追加する

テストターゲットを追加したら、次にユニットテストでテストしたい関数を作成します。

関数の作成

今回は以下の関数を考えてみましょう。

引数は2つ。引数の型は2つともにInt型。
戻り値は引数の2つの2乗を足し合わせたもの。戻り値の型もInt型。

中身の実装はまだしません。
まずは、引数と戻り値の型だけが正しい以下の関数を考えます。

import Foundation

class Calculation {

    func getSumOfSquare(a: Int, b: Int) -> Int {
        return 1
    }

}

これのユニットテストを作成します。

ユニットテストの作成

File > New > File から UI Test Case Class を選択してユニットテストを追加します。
そして、 testSumOfSquare() を書きます。

import XCTest
@testable import <プロジェクト名>

class calculationTests: XCTestCase {

    override func setUpWithError() throws {
    }

    override func tearDownWithError() throws {
    }

    func testSumOfSquare() throws {
        let calculation = Calculation()
        XCTAssertEqual(calculation.getSumOfSquare(a: 3, b: 4), 25)
    }

}

ここで、主要な関数について解説します。

setUpWithError

    override func setUpWithError() throws {
    }

各テストメソッドを実行する前に呼び出されるメソッドです。
テストメソッド毎にセットアップしておきたい処理を記述します。

tearDownWithError

    override func tearDownWithError() throws {
    }

各テストメソッドが実行された後に呼び出されるメソッドです。
テストメソッド毎にリセットしたい処理を記述します。

test<テスト名>

    func testSumOfSquare() throws {
        let calculation = Calculation()
        XCTAssertEqual(calculation.getSumOfSquare(a: 3, b: 4), 25)
    }

今回のテストメソッドです。
頭にtestとついているとテストメソッドと認識されます。
テストメソッド内でXCTAssertEqualメソッドを実行して、左の値と右の値が同じであるかを判定します。

ユニットテストを失敗してみる

テストメソッドが書けたら、テストを実行してみます。

Product > Testを実行するとテストが開始されます。
(command + U でも実行可能です。)

そうすると、まだ実装していないので以下のようにテストが失敗します。

テストの失敗

ちゃんと失敗していることが確認できたら、関数の実装をしていきましょう!

関数の実装

関数を以下のように実装します。

import Foundation

class Calculation {

    func getSumOfSquare(a: Int, b: Int) -> Int {
        return a * a + b * b
    }

}

ユニットテストを実行する

関数の実装が終わったら、テストを実行します。

次はちゃんと成功していますね!

テストの成功

おわりに

いかがでしたでしょうか?
実際には、『もっと難しい実装についてテストしたい!』方がほとんどだと思いますが、
テストコードのユニットテストのエッセンスとしてはこんな感じです。

『そこまで難しくないな、導入してみようかな。』という一助になれば幸いです。
またお会いしましょう。

この記事を書いた人 kikutani 2018年12月に中途入社したエンジニアです。最近はiOSを開発しています。
TOP