アプリを Cloud Firestore エミュレータに接続する前に、 Firebase Local Emulator Suite の全体的なワークフローを理解し、Local Emulator Suiteをインストールして構成し、そのCLI コマンドを確認してください。
Firebase プロジェクトを選択
Firebase Local Emulator Suite は、単一の Firebase プロジェクトの製品をエミュレートします。
使用するプロジェクトを選択するには、エミュレータを起動する前に、CLI で作業ディレクトリでfirebase use
を実行します。または、 --project
フラグを各エミュレータ コマンドに渡すこともできます。
Local Emulator Suite は、実際のFirebase プロジェクトとデモプロジェクトのエミュレーションをサポートしています。
プロジェクトの種類 | 特徴 | エミュレーターで使用する |
---|---|---|
本物 | 実際の Firebase プロジェクトは、ユーザーが作成して構成したものです (ほとんどの場合、Firebase コンソールを使用して)。 実際のプロジェクトには、データベース インスタンス、ストレージ バケット、関数、またはその Firebase プロジェクト用に設定したその他のリソースなどのライブ リソースがあります。 | 実際の Firebase プロジェクトで作業する場合、サポートされている製品の一部またはすべてのエミュレータを実行できます。 エミュレートしていない製品の場合、アプリとコードはライブリソース (データベース インスタンス、ストレージ バケット、関数など) とやり取りします。 |
デモ | デモ Firebase プロジェクトには、実際のFirebase 構成もライブ リソースもありません。これらのプロジェクトには通常、Codelab またはその他のチュートリアルからアクセスします。 デモ プロジェクトのプロジェクト ID には、 | デモの Firebase プロジェクトを操作する場合、アプリとコードはエミュレータのみとやり取りします。エミュレーターが実行されていないリソースをアプリが操作しようとすると、そのコードは失敗します。 |
可能な限りデモ プロジェクトを使用することをお勧めします。利点は次のとおりです。
- Firebase プロジェクトを作成しなくてもエミュレータを実行できるため、セットアップが簡単
- コードがエミュレートされていない (本番) リソースを誤って呼び出した場合でも、データの変更、使用、および課金の可能性がないため、より強力な安全性
- SDK 構成をダウンロードするためにインターネットにアクセスする必要がないため、オフライン サポートが向上します。
エミュレーターと通信するようにアプリをインストルメント化する
Android、Apple プラットフォーム、および Web SDK
アプリ内構成またはテスト クラスを設定して、次のように Cloud Firestore とやり取りします。
Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. val firestore = Firebase.firestore firestore.useEmulator("10.0.2.2", 8080) firestore.firestoreSettings = firestoreSettings { isPersistenceEnabled = false }
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. FirebaseFirestore firestore = FirebaseFirestore.getInstance(); firestore.useEmulator("10.0.2.2", 8080); FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(false) .build(); firestore.setFirestoreSettings(settings);
迅速
let settings = Firestore.firestore().settings settings.host = "localhost:8080" settings.isPersistenceEnabled = false settings.isSSLEnabled = false Firestore.firestore().settings = settings
Web version 9
import { getFirestore, connectFirestoreEmulator } from "firebase/firestore"; // firebaseApps previously initialized using initializeApp() const db = getFirestore(); connectFirestoreEmulator(db, 'localhost', 8080);
Web version 8
// Firebase previously initialized using firebase.initializeApp(). var db = firebase.firestore(); if (location.hostname === "localhost") { db.useEmulator("localhost", 8080); }
エミュレータを使用してFirestore イベントによってトリガーされるCloud Functions をテストするために、追加の設定は必要ありません。 Firestore と Cloud Functions エミュレーターの両方が実行されている場合、それらは自動的に連携します。
管理 SDK
FIRESTORE_EMULATOR_HOST
環境変数が設定されている場合、Firebase Admin SDK は Cloud Firestore エミュレータに自動的に接続します。
export FIRESTORE_EMULATOR_HOST="localhost:8080"
コードが Cloud Functions エミュレーター内で実行されている場合、 initalizeApp
を呼び出すと、プロジェクト ID とその他の構成が自動的に設定されます。
別の環境で実行されている共有エミュレータに Admin SDK コードを接続する場合は、Firebase CLI を使用して設定したものと同じプロジェクト IDを指定する必要があります。プロジェクト ID をinitializeApp
に直接渡すか、 GCLOUD_PROJECT
環境変数を設定できます。
Node.js 管理 SDK
admin.initializeApp({ projectId: "your-project-id" });
環境変数
export GCLOUD_PROJECT="your-project-id"
テスト間でデータベースをクリアする
本番環境の Firestore には、データベースをフラッシュするためのプラットフォーム SDK メソッドはありませんが、Firestore エミュレーターは、この目的専用の REST エンドポイントを提供します。これは、テスト フレームワークのセットアップ/ティアダウン ステップ、テスト クラス、またはシェル (例: 、 curl
を使用して) テストが開始される前に。エミュレータ プロセスを単にシャットダウンする代わりに、このアプローチを使用できます。
適切なメソッドで HTTP DELETE 操作を実行し、Firebase projectID (たとえば、 firestore-emulator-example
) を次のエンドポイントに提供します。
"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"
当然のことながら、コードは、フラッシュが終了または失敗したという REST 確認を待機する必要があります。
この操作はシェルから実行できます。
// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"
このようなステップを実装すると、古いデータが実行間で消去され、新しいベースライン テスト構成を使用していることを確信して、テストを順序付けし、関数をトリガーすることができます。
データのインポートとエクスポート
データベースと Cloud Storage for Firebase エミュレータを使用すると、実行中のエミュレータ インスタンスからデータをエクスポートできます。単体テストまたは継続的インテグレーション ワークフローで使用するデータのベースライン セットを定義し、それをエクスポートしてチーム間で共有します。
firebase emulators:export ./dir
テストでは、エミュレーターの起動時にベースライン データをインポートします。
firebase emulators:start --import=./dir
エクスポート パスを指定するか、単に--import
フラグに渡されたパスを使用して、シャットダウン時にデータをエクスポートするようエミュレータに指示できます。
firebase emulators:start --import=./dir --export-on-exit
これらのデータのインポートおよびエクスポート オプションは、 firebase emulators:exec
コマンドでも機能します。詳細については、エミュレータ コマンド リファレンスを参照してください。
セキュリティ ルールのアクティビティを視覚化する
プロトタイプとテストのループを進めながら、Local Emulator Suite が提供する視覚化ツールとレポートを使用できます。
リクエストモニターを使用する
Cloud Firestore エミュレータを使用すると、Firebase セキュリティ ルールの評価トレースを含め、Emulator Suite UI でクライアント リクエストを視覚化できます。
[ Firestore] > [リクエスト] タブを開いて、各リクエストの詳細な評価シーケンスを表示します。
ルール評価レポートを視覚化する
セキュリティ ルールをプロトタイプに追加すると、Local Emulator Suite デバッグ ツールを使用してデバッグできます。
一連のテストを実行した後、各セキュリティ ルールがどのように評価されたかを示すテスト カバレッジ レポートにアクセスできます。
レポートを取得するには、エミュレーターの実行中に、公開されているエンドポイントに対してクエリを実行します。ブラウザ対応バージョンの場合は、次の URL を使用してください。
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
これにより、ルールが式と部分式に分割され、マウスオーバーすると、評価の数や返される値などの詳細が表示されます。このデータの生の JSON バージョンについては、クエリに次の URL を含めます。
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
ここで、レポートの HTML バージョンは、未定義および null 値のエラーをスローする評価を強調しています。
Cloud Firestore エミュレータと本番環境の違い
Cloud Firestore Emulator は、本番サービスの動作を忠実に再現しようとしますが、いくつかの顕著な制限があります。
取引
エミュレーターは現在、本番環境で見られるすべてのトランザクション動作を実装しているわけではありません。 1 つのドキュメントへの複数の同時書き込みを伴う機能をテストしている場合、エミュレーターは書き込み要求を完了するのに時間がかかる場合があります。場合によっては、ロックが解除されるまでに最大 30 秒かかることがあります。必要に応じて、それに応じてテストのタイムアウトを調整することを検討してください。
インデックス
エミュレーターは複合インデックスを追跡せず、代わりに有効なクエリを実行します。実際の Cloud Firestore インスタンスに対してアプリをテストして、必要なインデックスを判断してください。
限界
エミュレーターは、実稼働環境で適用されるすべての制限を適用するわけではありません。たとえば、エミュレーターは、実稼働サービスによって大きすぎるとして拒否されるトランザクションを許可する場合があります。文書化された制限をよく理解し、それらを積極的に回避するようにアプリを設計してください。
次は何?
- 精選された一連のビデオと詳細なハウツーの例については、 Firebase Emulators Training Playlistに従ってください。
- セキュリティ ルールのテストと Firebase Test SDK: Test Security Rules (Firestore)を含む高度なユース ケースを調査します。
- トリガーされた関数は Cloud Firestore との一般的な統合であるため、Cloud Functions for Firebase エミュレーターの詳細については、関数をローカルで実行するを参照してください。