イカ?スマートフォン用の表示で見るやらなイカ?たぶん、iOS/Androidアプリの開発・テスト関係。Storeで使用する方法を試してみました。テストターゲットの準備Realmをプロジェクトに取り込む方法はいくつかありますが、今回はCocoaPodsを利用しました。このとき、下記のようにテストターゲット側にもRealm/Headersの利用を宣言する必要があります。defaultRealm]でデフォルトRealmインスタンス*1を使用すると、テストコードからの実行でもテスト対象アプリの利用するDBを使ってしまうため、これに干渉してしまいます。allObjects]といったRealmオブジェクトを指定しないメソッドは総じて、デフォルトRealmインスタンスを使用します。これを避け、テストコードからはデフォルトとは異なるDBを利用する方法は二通りあります。setDefaultRealmPath:]を呼ぶことで、以降のデフォルトRealmを置き換えることができます。通常は[setUp]を下記のようにすれば良いでしょう。commitWriteTransaction];}これで、以降個々のテストメソッドでは全てのオブジェクトがクリアされたクリーンなtest.realmに対して読み書きを行なうことができます。DBのクリアは意味的には「後処理」ですが、テストがエラーで落ちる等の要因で実行されないと次(次回)のテストが失敗してしまうこともあります。安定したテスト実行のために[tearDown]でなく「前処理」である[setUp]でクリアを行なっています。テスト対象メソッドでRealmインスタンスを受け取るメソッドの引数、もしくはRealmを扱うクラスのインスタンスフィールドにRealmインスタンスを保持し、これをテストコードから書き換え可能にしておきます。realmWithPath:]でファイルパスを指定して初期化できます。realmWithPath:]でファイル名を指定することで専用のRealmインスタンスを使用できます。realm:realm];}テストデータをファイルで用意して使用する大量のデータや複雑なクエリをテストするためのデータのinsertは、テストコードで行なうよりも、あらかじめRealmのファイル形式で準備するほうが管理しやすいケースもあるでしょう。*2これは、上記いずれかの方法でRealmファイルパスを指定してRealmインスタンスを得る場合、あらかじめ用意したRealmファイルをアプリのDocuments下に置き、そのパスを[setDefaultRealmPath:]や[realmWithPath:]に渡すことで実現できます。アプリケーションデータを再現してテスト実行する」が参考になるはずです。Storeで使用するRealmは、ファイルでなくメモリ上だけで動作させることもできます。インメモリでの動作は、ファイルI/Oが無いぶん高速、かつ、実行ごとにクリーンな状態のRealmインスタンスを得られるため、テストコードから使うには最適です。inMemoryRealmWithIdentifier:]で生成できます。こちらはデフォルトを置き換えるクラスメソッドは存在しないため、プロダクトコード側が上記「テスト対象メソッドでRealmインスタンスを受け取る」にあるようなRealmインスタンスを差し替え可能な構造である必要があります。0.189[sec]となり、1/4程度には抑えられるようです。サンプルコードGitHubに置いてあります。アプリ開発はてなブログをはじめよう!nowsprintingさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。