酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSユニットテストでテスト専用リソースの組み込みと利用方法

たとえば画像識別アプリを開発中には、テスト画像を Bundle からロードして、画像を識別してその結果を評価するユニットテストを作成する。または、HTMLをスクレイピングするアプリを開発中には、ダミーのHTMLを Bundle からロードして、スクレイピング処理が正しく動いているか評価するユニットテストを作成する。

しかし、これらのテスト用のリソースをアプリの本番バイナリには含めたくない。そこで、テスト時だけテスト用のリソースをBundleに組み込むというニーズが生じる。

この記事では、テスト時にのみ利用可能なリソースをどのようにして追加して利用するのかを紹介する。ここでの login.html は、テストバイナリに組み込まれた ダミーの HTML ファイルである。

テスト時のみ利用可能なようにリソースを追加する

テストターゲット XXXXTests フォルダの配下に login.html を追加する。

login.html の Target Membership は、ユニットテストで利用する XXXXTests にのみチェックをつける。

コードの例

テストバンドルの識別子を用いて Bundle オブジェクトを取得し、login.html ファイルにアクセスする。テストバイナリの Bundle IDがjp.ch3cooh.AppTestslogin.html を読み取りたい場合、以下のようなコードとなる。

let bundle = Bundle(identifier: "jp.ch3cooh.AppTests")
let url = bundle?.url(forResource: "login", withExtension: "html")
return try! Data(contentsOf: url!)

まとめ

この方法を使用することで、テスト時のみ特定のリソースにアクセスすることが可能になる。テストの際のモックデータや、テスト画像の読み込みに利用することができる。