[iOS] ユニットテストの始め方 〜 テスト環境の作り方とXCTestの使い方 〜

ios

はじめに

おばんです、あまりにもWebがわからなくて、知り合いのWebエンジニアに聞いたら嘘のようにすっきり理解できた田中です。調べてもわからないことは詳しい人を頼るとうまく返してくれるんだなあとありがたい想いでいっぱいです。

さて今回の記事は、最近テストについて学び始めたのでiOSでテストを始めるために最初に知っておかなければならない環境の作り方とXCTestに関する簡単な内容をまとめます。

検証環境

  • Xcode 8.2.1

テスト環境の作り方

テストターゲットの追加

プロジェクト作成時の指定方法

プロジェクトを作成する際に、テストターゲットも一緒に作成する場合は下の画像の Include Unit Test にチェックを入れてプロジェクトを作成します。

1

後からテストターゲットを追加する方法

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

2

ターゲットが追加されたかどうかを書くにするには、以下の画像の箇所をみると確認できます。

3

テスト対象のファイルをテスト可能な状態にする

テスト対象のファイルをテスト可能にするには三つの方法があります。

1. ターゲットをテストファイルでimportする

@testable import <ターゲット名>をテストファイルで指定すると、指定したターゲット内のinternalで宣言されたソースコードにアクセスすることができるようになります。

TestSampleTests_swift_—_Edited

2. テスト対象のソースコードのアクセス修飾子を変更する

テスト対象のソースコードをpublicまたはopenにすることでテストターゲットから他のターゲット内のコードにもアクセスすることができるようになります。

3. テストターゲットにファイルを追加する

ファイル作成時に追加する方法

ユニットテストする際にそのファイルをテスト対象として認識させるためにテストターゲットにファイルを追加します。以下の画像のように、Targetsのテストターゲットの項目にチェックを入れてファイルを作成します。

4

後からファイルを追加する方法

既存のファイルを後からテストターゲットに追加する場合は、ユーティリティインスペクターのTarget Membershipから追加します。

5

これでiOSでユニットテストを行う準備が整いました。

XCTestの使い方

iOSでユニットテストを書くときはXCTestCaseを継承したクラスを使います。テストターゲット追加時に作成される <Project名>Tests というグループの中にある <Project名>Tests.swift というファイルがテストファイルになります。

もし新たにテストファイルを作成したい場合は Unit Test Case Class を選択しましょう。

6

XCTestCaseの関数の役割

XCTestCaseに用意されている各関数の役割を見ていきましょう。

func setUp()

テストの開始時に最初に一度呼ばれる関数。テストケースを回すために必要な設定やインスタンスの生成などをここで行います。

func tearDown()

テストの終了時に一度呼ばれる関数。

func testExample()

テスト対象の関数です。この関数一つに対してテストケースを一つ書きます。どうやってテストケースとして判別するかというと、関数名の頭文字が "test" で始まる関数かどうかで識別しているようです。

func testPerformanceExample()

パフォーマンスの計測用の関数です。 self.measure {} のクロージャの中に計測したい処理を記述するとその処理にかかった時間を教えてくれます。

よく使うXCTAssert

XCTAssertEqual

第一引数と第二引数の値が等しいことを検査するためのXCTAssert。

XCTAssertEqual(tanaka.age, 23)

XCTAssertNotEqual

第一引数と第二引数の値が等しくないことを検査するためのXCTAssert。

XCTAssertNotEqual(tanaka.age, 30)

XCTAssertTrue

検査対象がTrueかどうかを検査するためのXCTAssert。

XCTAssertTrue(tanaka.isMale)

XCTAssertFalse

検査対象がFalseかどうかを検査するためのXCTAssert。

XCTAssertFalse(tanaka.isFemale)

XCTAssertNil

検査対象がnilかどうかを検査するためのXCTAssert。

XCTAssertNil(tanaka.girlfriend)

XCTAssertNotNil

検査対象がnilでないかどうかを検査するためのXCTAssert。

XCTAssertNotNil(json)

まとめ

iOSでテストを始める際に最初に知っておかなければいけないことについて紹介しました。

あまりiOS界隈だと「しっかりテストを書く文化がない」なんてことも聞きますが、僕もまったくさわったことがなかったのでこれからはテストを書いて圧倒的成長💪していこうと思います。

ちなみにそんなiOS界隈でもテスト勉強会ができてきたようです。要チェックですね!

参考・関連

  • kishikawa katsumi

    テストターゲットにテスト対象のソースファイルを追加する必要はないです。追加してもほとんど問題になることはありませんが、管理がややこしくなるので、テスト対象のアプリ・フレームワークのターゲットにはアプリもしくはフレームワークのファイル、テストターゲットにはテストコードのファイルだけを追加するようにしたほうがいいです。

  • 3月のダンボー田中

    @kishikawakatsumi:disqus
    ご指摘ありがとうございます。別の方法を追記させていただきました。