アプリを Realtime Database エミュレータに接続する前に、 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
次のように、アプリ内構成またはテスト クラスを設定して、Realtime Database とやり取りします。
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 database = Firebase.database database.useEmulator("10.0.2.2", 9000)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. FirebaseDatabase database = FirebaseDatabase.getInstance(); database.useEmulator("10.0.2.2", 9000);
迅速
// In almost all cases the ns (namespace) is your project ID. let db = Database.database(url:"http://localhost:9000?ns=YOUR_DATABASE_NAMESPACE")
Web version 9
import { getDatabase, connectDatabaseEmulator } from "firebase/database"; const db = getDatabase(); if (location.hostname === "localhost") { // Point to the RTDB emulator running on localhost. connectDatabaseEmulator(db, "localhost", 9000); }
Web version 8
var db = firebase.database(); if (location.hostname === "localhost") { // Point to the RTDB emulator running on localhost. db.useEmulator("localhost", 9000); }
エミュレーターを使用してRealtime Database イベントによってトリガーされるCloud Functions をテストするために、追加のセットアップは必要ありません。 Realtime Database と Cloud Functions エミュレーターの両方が実行されている場合、それらは自動的に連携します。
管理 SDK
FIREBASE_DATABASE_EMULATOR_HOST
環境変数が設定されている場合、Firebase Admin SDK は Realtime Database エミュレータに自動的に接続します。
export FIREBASE_DATABASE_EMULATOR_HOST="localhost:9000"
コードが 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"
テスト間でデータベースをクリアする
アクティビティ間で Realtime Database をフラッシュするには、データベース参照をクリアします。エミュレータ プロセスを単にシャットダウンする代わりに、このアプローチを使用できます。
Kotlin+KTX
// With a DatabaseReference, write null to clear the database. database.reference.setValue(null)
Java
// With a DatabaseReference, write null to clear the database. database.getReference().setValue(null);
迅速
// With a DatabaseReference, write nil to clear the database. Database.database().reference().setValue(nil);
Web version 9
import { getDatabase, ref, set } from "firebase/database"; // With a database Reference, write null to clear the database. const db = getDatabase(); set(ref(db), null);
Web version 8
// With a database Reference, write null to clear the database. firebase.database().ref().set(null);
当然、コードは、プラットフォームの非同期イベント処理機能を使用して、フラッシュが終了または失敗したことの確認を待つ必要があります。
このようなステップを実装すると、古いデータが実行間で消去され、新しいベースライン テスト構成を使用していることを確信して、テストを順序付けし、関数をトリガーすることができます。
データのインポートとエクスポート
データベースと 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 が提供する視覚化ツールとレポートを使用できます。
ルールの評価を視覚化する
セキュリティ ルールをプロトタイプに追加すると、Local Emulator Suite ツールを使用してデバッグできます。
一連のテストを実行した後、各ルールがどのように評価されたかを示すテスト カバレッジ レポートにアクセスできます。レポートを取得するには、エミュレーターの実行中に、公開されているエンドポイントに対してクエリを実行します。ブラウザ対応バージョンの場合は、次の URL を使用してください。
http://localhost:9000/.inspect/coverage?ns=<database_name>
これにより、ルールが式と部分式に分割され、実行回数や返される値などの詳細についてマウスオーバーできます。このデータの生の JSON バージョンについては、クエリに次の URL を含めます。
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
次は何?
- 精選された一連のビデオと詳細なハウツーの例については、 Firebase Emulators Training Playlistに従ってください。
- セキュリティ ルールのテストと Firebase Test SDK:セキュリティ ルールのテスト (リアルタイム データベース)を含む高度な使用例を調査します。
- トリガーされる関数は Realtime Database との一般的な統合であるため、Cloud Functions for Firebase エミュレーターの詳細については、関数をローカルで実行するを参照してください。