Firestore エミュレータをローカルで使用する

Google Cloud CLI には、アプリケーションのテストに使用できる Firestore 用のローカル インメモリ エミュレータが用意されています。エミュレータは、すべての Firestore クライアント ライブラリで使用できます。エミュレータはローカルテストでのみ使用してください。

本番環境のデプロイにはエミュレータを使用しないでください。エミュレータはメモリ内にのみデータを保存するため、終了時にデータは失われます。

エミュレータをインストールする

Firestore エミュレータをインストールするには、gcloud CLI をインストールして更新します。

  1. gcloud CLI をインストールします

  2. gcloud CLI インストールを更新して、最新の機能を取得します。

    gcloud components update
    

エミュレータを実行する

  1. 次のコマンドを実行して、エミュレータを起動します。

    gcloud emulators firestore start
    

    エミュレータによって、実行中のホストとポート番号が表示されます。

    デフォルトでは、エミュレータは 127.0.0.1:8080 の使用を試みます。エミュレータを特定のホストとポートにバインドするには、オプションの --host-port フラグを使用し、HOSTPORT を置き換えます。

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Control + C」と入力してエミュレータを停止します。エミュレータは、/shutdown への POST で停止することもできます。次に例を示します。

    curl -d '' HOST:PORT/shutdown
    

エミュレータに接続する

エミュレータへの接続方法は、クライアント ライブラリのタイプ、サーバー クライアント ライブラリ、またはモバイル/ウェブ SDK によって異なります。

サーバー クライアント ライブラリ

Firestore サーバー クライアント ライブラリ(C#、Go、Java、Node.js、PHP、Python、Ruby)を接続するには、FIRESTORE_EMULATOR_HOST 環境変数を設定します。この環境変数を設定すると、サーバー クライアント ライブラリが自動的にエミュレータに接続します。

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android、Apple プラットフォーム、ウェブの各 SDK

次の例は、Android、Apple プラットフォーム、ウェブ SDK を Firestore エミュレータに接続する方法を示しています。

Android
// 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);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web バージョン 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web バージョン 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

Firestore エミュレータはシャットダウン時にデータベースのコンテンツを消去します。Firestore SDK のオフライン キャッシュは自動的に消去されないため、エミュレートされたデータベースとローカル キャッシュの不一致を回避するよう、エミュレータ構成でローカル永続性を無効にすることもできます。Web SDK では、永続性はデフォルトで無効になっています。

エミュレータ データを削除する

Firestore エミュレータには、現在エミュレータにあるすべてのデータを削除するための REST エンドポイントが含まれています。このエンドポイントを使用すると、エミュレータをシャットダウンせずに、テスト間でデータを消去できます。

エミュレータ内のすべてのデータを削除するには、次のエンドポイントに対して HTTP DELETE オペレーションを実行します。HOSTPORT は、選択したホストとポートに置き換え、PROJECT_ID は実際のプロジェクト ID に置き換えます。

http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents

エミュレータで 127.0.0.1:8080 を使用しない場合は、ホストとポートを調整します。コードは、削除が終了または失敗したことを REST が確認するまで待機します。

この操作は curl を使用してシェルから実行できます。

$ curl -v -X DELETE "http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents"

Firestore エミュレータと本番環境の違い

Firestore エミュレータは、本番環境サービスの動作を忠実に再現しようとしますが、いくつか注意が必要な制限事項があります。

トランザクション

エミュレータは、本番環境で発生するトランザクションの動作すべてを実装しているわけではありません。1 つのドキュメントに対して複数の書き込みが同時に実行される機能をテストする場合、エミュレータでは書き込みリクエストが完了するまで時間がかかることがあります。場合によっては、ロックが解除されるまでに最長で 30 秒かかります。必要に応じて、この問題に対応するように、テストのタイムアウトを調整することを検討してください。

インデックス

エミュレータは複合インデックスを追跡せず、代わりに有効なクエリを実行します。実際の Firestore インスタンスでアプリをテストし、必要なインデックスを特定してください。

制限事項

このエミュレータでは、本番環境で適用される制限すべてが適用されるわけではありません。たとえば、本番環境サービスではサイズが大きいことを理由に拒否されるトランザクションでも、エミュレータでは許容される場合があります。ドキュメントに記載されている制限を十分に理解し、事前にこうした制限を回避するようにアプリを設計してください。