Datastore-Modus mit dem Firestore-Emulator testen

Die Google Cloud CLI bietet einen lokalen Emulator im Arbeitsspeicher für Firestore, mit dem Sie Ihre Anwendung in Firestore im Datastore-Modus testen können. Sie können den Emulator mit allen Clientbibliotheken im Datastore-Modus verwenden. Sie sollten den Emulator nur für lokale Tests verwenden.

gcloud emulators firestore mit --database-mode=datastore-mode verwenden um das Verhalten von Firestore im Datastore-Modus zu testen.

Verwenden Sie den Emulator nicht für Produktionsbereitstellungen. Da der Emulator nur im Arbeitsspeicher, bleiben die Daten nicht über mehrere Testläufe hinweg erhalten.

Emulator installieren

Installieren und aktualisieren Sie zum Installieren des Firestore-Emulators die gcloud CLI:

  1. Installieren Sie das gcloud-CLI.

  2. Aktualisieren Sie die Installation der gcloud CLI, um die neueste Version zu erhalten. Funktionen:

    gcloud components update
    

Emulator starten

  1. Verwenden Sie den folgenden Befehl, um den Emulator zu starten:

    gcloud emulators firestore start --database-mode=datastore-mode
    

    Der Emulator gibt den Host und die Portnummer aus, wenn er ausgeführt wird.

    Standardmäßig versucht der Emulator, 127.0.0.1:8080 zu verwenden. Um die zu einem bestimmten Host und Port hinzufügen, verwenden Sie das optionale Flag --host-port, HOST und PORT werden ersetzt:

    gcloud emulators firestore start --database-mode=datastore-mode --host-port=HOST:PORT
    
  2. Verwende die Tastenkombination Control + C, um den Emulator zu beenden.

Mit dem Emulator verbinden

So verbinden Sie eine Clientbibliothek und eine Anwendung mit dem Emulator: Legen Sie die Umgebungsvariable DATASTORE_EMULATOR_HOST fest. Wenn diese Umgebung festgelegt ist, stellen die Clientbibliotheken automatisch eine Verbindung zum Emulator her.

export DATASTORE_EMULATOR_HOST="HOST:PORT"

Entitäten in den Emulator importieren

Mit der Importfunktion des Emulators können Sie Entitäten aus einer Reihe von Entitätsexportdateien in den Emulator laden. Die Entitätsexportdateien können aus einem Export von aus einer Datenbank im Datastore-Modus oder aus einer Emulatorinstanz stammen.

Sie können Entitäten auf zwei Arten in den Emulator importieren. Die erste besteht darin, Flag import-data für den Startbefehl des Emulators. Die zweite Methode besteht darin, eine POST-Importanfrage an den Emulator senden. Sie können curl oder ein ähnliches Tool. Weitere Informationen Beispiele.

Protokoll

curl -X POST http://localhost:8080/emulator/v1/projects/PROJECT_ID:import \
-H 'Content-Type: application/json' \
-d '{"database":"DATABASE", "export_directory":"EXPORT_DIRECTORY"}'
Ändern Sie localhost:8080, wenn der Emulator einen anderen Port verwendet.

Befehlszeilen-Flag

gcloud emulators firestore start --database-mode=datastore-mode --import-data=EXPORT_DIRECTORY

Dabei gilt:

  • [PROJECT_ID] ist die ID des Projekts.
  • [DATABASE] ist der Datenbankpfad. Ein Projekt mit einer Standarddatenbank würde beispielsweise so aussehen:

    {"database":"projects/myProject/databases/"}

  • [EXPORT_DIRECTORY] ist der Pfad zur overall_export_metadata-Datei Ihrer Entitätsexportdateien. Beispiel:

    {"export_directory":"/home/user/myexports/2024-03-26T19:39:33_443/2024-03-26T19:39:33_443.overall_export_metadata"}

Entitäten im Emulator exportieren

Mit der Exportfunktion des Emulators können Sie Entitäten im Emulator in einer Reihe von Entitätsexportdateien speichern. Danach können Sie die Entitäten in den Entitätsexportdateien über einen Importvorgang in die Datenbank im Datastore-Modus oder in eine Emulatorinstanz laden.

Sie können Entitäten aus dem Emulator auf zwei Arten exportieren. Die erste besteht darin, Flag export-on-exit für den Startbefehl des Emulators. Die zweite Methode besteht darin, POST-Exportanfrage an den Emulator senden. Sie können curl oder ein ähnliches Tool. Weitere Informationen Beispiele.

Protokoll

curl -X POST http://localhost:8080/emulator/v1/projects/PROJECT_ID:export \
-H 'Content-Type: application/json' \
-d '{"database":"DATABASE_PATH", "export_directory":"EXPORT_DIRECTORY"}'
Ändern Sie localhost:8080, wenn der Emulator einen anderen Port verwendet.

Befehlszeilen-Flag

gcloud emulators firestore start --database-mode=datastore-mode --export-on-exit=EXPORT_DIRECTORY

Dabei gilt:

  • [PROJECT_ID] ist die ID des Projekts.
  • [DATABASE_PATH] ist der Datenbankpfad. Ein Projekt mit einer Standarddatenbank würde beispielsweise so aussehen:

    {"database":"projects/myProject/databases/"}

  • [EXPORT_DIRECTORY] gibt das Verzeichnis an, in dem die Entitätsexportdateien vom Emulator gespeichert werden. Dieses Verzeichnis darf noch keine Entitätsexportdateien enthalten. Beispiel:

    {"export_directory":"/home/user/myexports/2024-03-26/"}

Daten im Emulator beibehalten

Standardmäßig speichert der Firestore-Emulator keine Daten auf dem Laufwerk. Führen Sie den folgenden Befehl aus, um die Emulator-Daten zu importieren und zu exportieren Flags zum Laden und Speichern der Daten in den Emulatorinstanzen:

gcloud emulators firestore start --database-mode=datastore-mode --import-data=EXPORT_DIRECTORY --export-on-exit=EXPORT_DIRECTORY

Emulatordaten zurücksetzen

Der Firestore-Emulator enthält einen REST-Endpunkt zum Zurücksetzen aller die Daten im Emulator. Mit diesem Endpunkt können Sie Daten löschen ohne den Emulator herunterzufahren.

Wenn Sie alle Daten im Emulator zurücksetzen möchten, führen Sie einen HTTP-POST-Vorgang für folgenden Endpunkt, wobei HOST und PORT durch den Host und Port, den Sie ausgewählt haben, und ersetzen Sie PROJECT_ID durch Ihren eigene Projekt-ID:

http://HOST:PORT/reset

Passen Sie den Host und den Port an, wenn der Emulator 127.0.0.1:8080 nicht verwendet. Ihr Code sollte auf die REST-Bestätigung warten, dass das Zurücksetzen abgeschlossen wurde oder fehlgeschlagen ist.

Sie können diesen Vorgang mit curl über die Shell ausführen:

$ curl -X POST "http://HOST:PORT/reset"

Unterschied zwischen Emulator und Produktion

Der Emulator versucht, des Produktionsdienstes mit einigen nennenswerten Einschränkungen.

Gleichzeitigkeit und Konsistenz

Der Emulator unterstützt nur pessimistische Nebenläufigkeit und Strong Consistency. Der Emulator unterstützt keine optimistische Nebenläufigkeit und Eventual Consistency Einstellungen.

Transaktionen

Der Emulator implementiert nicht das gesamte Transaktionsverhalten in der Produktion gesehen werden. Wenn Sie Funktionen testen, die mehrere gleichzeitig in ein Dokument schreiben, kann der Emulator den Schreibvorgang lange dauern. -Anfragen. In einigen Fällen kann es bis zu 30 Sekunden dauern, bis die Sperre aufgehoben wird. Passen Sie die Testzeitlimits bei Bedarf entsprechend an.

Indexe

Der Emulator verfolgt keine zusammengesetzten Indexe und führt stattdessen gültige Abfrage. Testen Sie Ihre Anwendung mit einem echten Datastore-Modus Instanz, um zu bestimmen, welche Indexe Sie benötigen.

Limits

Der Emulator erzwingt nicht alle in der Produktion erzwungenen Limits. Beispiel: kann der Emulator Transaktionen zulassen, die vom Produktionsdiensts. Stellen Sie sicher, dass Sie mit den dokumentierte Beschränkungen und die Entwicklung deiner App proaktiv vermeiden.

Nächste Schritte