【Xcode】既存のプロジェクトにUnit Testを追加する方法

2022.01.31

既存プロジェクトにUnit Testを追加する方法を調べたので書き残しておきます。

環境

  • Xcode 13.2.1

Unit Testとは

Unit Test(ユニットテスト)とは、単体テストとも呼ばれ、プログラムを構成する比較的小さな単位(ユニット)の機能を正しく果たしているかどうかを検証するテストです。

Unit Testのためのターゲットを追加

Xcodeのメニューから File > New > Target... をクリックします。

新しいターゲットを選択できるシートが表示されるので、そこでUnit Testing Bundleを選択してNextをクリックします。

新しいターゲットのオプションを設定するシートが表示されるので、Product Nameに任意の名前を設定し、設定値の変更が必要であれば初期値から値を変更します。設定が完了したらFinishをクリックします。

XCTestCaseクラスのファイル

ターゲットを追加すると、自動でXCTestCaseクラスのファイルが作成されます。

デフォルトで作成されているメソッド

デフォルトで作成されている4つのメソッドについて簡単に紹介します。

  • setUpWithError()
  • tearDownWithError()
  • testExample()
  • testPerformanceExample()

setUpWithError()

override func setUpWithError() throws {
    // ここにセットアップコードを入力します。このメソッドは、クラス内の各テストメソッドを呼び出す前に呼び出されます。
}

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

tearDownWithError()

override func tearDownWithError() throws {
    // ここにティアダウンコードを配置します。このメソッドは、クラス内の各テストメソッドの呼び出し後に呼び出されます。
}

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

testExample()

func testExample() throws {
    // これは機能テストケースの例です。
    // XCTAssertおよび関連する関数を使用して、テストで正しい結果が生成されることを確認します。
    // XCTest用に作成したテストには、throwsおよびasyncとしてアノテーションを付けることができます。
    //テストスローにマークを付けて、テストでキャッチされないエラーが発生したときに予期しないエラーが発生するようにします。
    //テストを非同期としてマークして、非同期コードが完了するのを待つことができるようにします。その後、アサーションを使用して結果を確認します。
}

testExampleと名前にもある通り、こちらのコメントにはテストメソッドの使い方の記述があるだけなので、基本的にはこのメソッドは削除して、実際に行いたいテストメソッドを追加しましょう。

testPerformanceExample()

func testPerformanceExample() throws {
    //これはパフォーマンステストケースの例です。
    self.measure {
        //ここに時間を測定したいコードを入れてください。
    }
}

こちらもパフォーマンステストに関する例が書かれています。例として作成されているだけなので削除して、実際にパフォーマンステストを行いたい場合は新たにパフォーマンステストを追加しましょう。

実際にテストしてみる

今回は例としてViewController内で作成したsum(lhs: ,rhs: )メソッドのテストを行います。左辺と右辺の足し算をするメソッドになります。

テストを作成

まず、指定したターゲット内のinternalで宣言されたソースコードにアクセスするには、@testable import ターゲット名を指定する必要があります。 今回のターゲットは、SumAppなので、@testable import SumAppと指定しています。

では、早速テストを行います。

  1. ViewControllerのインスタンスを生成
  2. テストメソッドtestSum()を作成
    • テストメソッドはメソッド名がtestから始まる必要があります。
  3. テストメソッド内でXCTAssertEqualメソッドを実行して、左の値と右の値が同じであるかを判定します。
    • 今回は1 + 1を行っているのでという結果が仕様通りの結果が返ってきているかを判定しています。
func testSum() throw {
    XCTAssertEqual(viewController.sum(lhs: 1, rhs: 1), 2)
}

テストを実施

テストを実施するには、control + U のショートカットキーを使用するか、行番号の箇所にあるひし形のマークを押すことで実行出来ます。

class横のひし形を押すと、クラス内の全てのテストメソッドが実行され、メソッド横のひし形を押すとメソッド単位でのテスト実行が行えます。

テストの結果を見る

テストが成功すると、このように画面にTest Succeededの表示が現れます。

おわりに

プロジェクト作成時にUnit Testを含めて作成出来ますが、既存のプロジェクトにも簡単にUnit Testの追加が出来ることが分かりました。

テストを書いて、安全なプログラム作りを心がけていきたいです。

参考