Anwendung mit dem Realtime Database-Emulator verbinden

Bevor Sie Ihre App mit dem Realtime Database-Emulator verbinden, sollten Sie sich mit dem Firebase Local Emulator Suite-Workflow vertraut machen und Local Emulator Suite installieren und konfigurieren sowie die CLI-Befehle prüfen.

Firebase-Projekt auswählen

Firebase Local Emulator Suite emuliert Produkte für ein einzelnes Firebase-Projekt.

Führen Sie vor dem Starten der Emulatoren in der Befehlszeile firebase use in Ihrem Arbeitsverzeichnis aus, um das zu verwendende Projekt auszuwählen. Alternativ können Sie das Flag --project an jeden Emulatorbefehl übergeben.

Local Emulator Suite unterstützt die Emulation von echten Firebase-Projekten und Demoprojekten.

Projekttyp Funktionen Mit Emulatoren verwenden
Real

Ein echtes Firebase-Projekt ist ein Projekt, das Sie erstellt und konfiguriert haben, höchstwahrscheinlich über die Firebase Console.

Echte Projekte haben Liveressourcen wie Datenbankinstanzen, Speicher-Buckets, Funktionen oder andere Ressourcen, die Sie für dieses Firebase-Projekt eingerichtet haben.

Wenn Sie mit echten Firebase-Projekten arbeiten, können Sie Emulatoren für alle oder alle unterstützten Produkte ausführen.

Bei Produkten, die Sie nicht emulieren, interagieren Ihre Apps und Ihr Code mit der Live-Ressource (Datenbankinstanz, Speicher-Bucket, Funktion usw.).

Demo

Ein Firebase-Demoprojekt hat keine reale Firebase-Konfiguration und keine Live-Ressourcen. Normalerweise wird über Codelabs oder andere Tutorials auf diese Projekte zugegriffen.

Projekt-IDs für Demoprojekte haben das Präfix demo-.

Wenn Sie mit Demo-Firebase-Projekten arbeiten, interagieren Ihre Apps und Ihr Code nur mit Emulatoren. Wenn Ihre App versucht, mit einer Ressource zu interagieren, für die kein Emulator ausgeführt wird, schlägt der Code fehl.

Wir empfehlen, nach Möglichkeit Demoprojekte zu verwenden. Die wichtigsten Vorteile:

  • Einfachere Einrichtung, da Sie die Emulatoren ausführen können, ohne ein Firebase-Projekt erstellen zu müssen
  • Höhere Sicherheit, da bei versehentlichem Aufruf nicht emulierter (Produktions-)Ressourcen durch Ihren Code keine Daten geändert werden und es keine Nutzung und Abrechnung gibt
  • Bessere Offlineunterstützung, da kein Zugriff auf das Internet erforderlich ist, um die SDK-Konfiguration herunterzuladen.

App für die Kommunikation mit den Emulatoren instrumentieren

Android-, Apple-Plattformen und Web-SDKs

Richten Sie Ihre In-App-Konfigurations- oder Testklassen so ein, dass sie mit der Realtime Database interagieren.

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);
Swift
    // In almost all cases the ns (namespace) is your project ID.
let db = Database.database(url:"http://127.0.0.1:9000?ns=YOUR_DATABASE_NAMESPACE")

Web

import { getDatabase, connectDatabaseEmulator } from "firebase/database";

const db = getDatabase();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  connectDatabaseEmulator(db, "127.0.0.1", 9000);
} 

Web

var db = firebase.database();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  db.useEmulator("127.0.0.1", 9000);
} 

Für den Test von Cloud Functions, die durch Realtime Database-Ereignisse ausgelöst werden, ist keine zusätzliche Einrichtung erforderlich. Wenn die Realtime Database- und Cloud Functions-Emulatoren beide ausgeführt werden, arbeiten sie automatisch zusammen.

Admin SDK Sek.

Die Firebase Admin SDK stellen automatisch eine Verbindung zum Realtime Database-Emulator her, wenn die Umgebungsvariable FIREBASE_DATABASE_EMULATOR_HOST festgelegt ist:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Wenn Ihr Code im Cloud Functions-Emulator ausgeführt wird, werden Ihre Projekt-ID und andere Konfiguration beim Aufrufen von initializeApp automatisch festgelegt.

Wenn Sie möchten, dass Ihr Admin SDK-Code eine Verbindung zu einem freigegebenen Emulator herstellt, der in einer anderen Umgebung ausgeführt wird, müssen Sie dieselbe Projekt-ID angeben, die Sie mit der Firebase CLI festgelegt haben. Sie können eine Projekt-ID direkt an initializeApp übergeben oder die Umgebungsvariable GCLOUD_PROJECT festlegen.

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
Umgebungsvariable
export GCLOUD_PROJECT="your-project-id"

Datenbank zwischen Tests löschen

Wenn Sie die Realtime Database zwischen den Aktivitäten löschen möchten, können Sie die Datenbankreferenz löschen. Sie können diesen Ansatz als Alternative zum einfachen Herunterfahren des Emulators verwenden.

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);
Swift
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

Web

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

// With a database Reference, write null to clear the database.
firebase.database().ref().set(null);

Ihr Code sollte natürlich mithilfe der Funktionen zur asynchronen Ereignisbehandlung Ihrer Plattform auf eine Bestätigung warten, dass die Flush-Operation abgeschlossen oder fehlgeschlagen ist.

Nachdem Sie einen solchen Schritt implementiert haben, können Sie Ihre Tests sequenzieren und Ihre Funktionen mit der Gewissheit auslösen, dass alte Daten zwischen den Ausführungen gelöscht werden und Sie eine neue Baseline-Testkonfiguration verwenden.

Daten importieren und exportieren

Mit den Datenbank- und Cloud Storage for Firebase-Emulatoren können Sie Daten aus einer laufenden Emulatorinstanz exportieren. Legen Sie einen Datenbestand als Referenz für Ihre Unit-Tests oder Continuous-Integration-Workflows fest und exportieren Sie ihn, um ihn für das Team freizugeben.

firebase emulators:export ./dir

Importieren Sie bei Tests beim Starten des Emulators die Baseline-Daten.

firebase emulators:start --import=./dir

Sie können den Emulator anweisen, beim Herunterfahren Daten zu exportieren. Geben Sie dazu entweder einen Exportpfad an oder verwenden Sie einfach den Pfad, der an das --import-Flag übergeben wird.

firebase emulators:start --import=./dir --export-on-exit

Diese Optionen für den Datenimport und ‑export funktionieren auch mit dem Befehl firebase emulators:exec. Weitere Informationen finden Sie in der Befehlsreferenz für den Emulator.

Aktivitäten von Sicherheitsregeln visualisieren

Während Sie die Prototyp- und Testschleifen durcharbeiten, können Sie die Visualisierungstools und Berichte des Local Emulator Suite verwenden.

Regelauswertungen visualisieren

Wenn Sie Ihrem Prototyp Sicherheitsregeln hinzufügen, können Sie sie mit Local Emulator Suite-Tools beheben.

Nachdem Sie eine Reihe von Tests ausgeführt haben, können Sie auf Berichte zur Testabdeckung zugreifen, die Aufschluss darüber geben, wie die einzelnen Regeln bewertet wurden. Um die Berichte abzurufen, fragen Sie einen bereitgestellten Endpunkt im Emulator ab, während er ausgeführt wird. Verwenden Sie für eine browserfreundliche Version die folgende URL:

http://localhost:9000/.inspect/coverage?ns=<database_name>

Dadurch werden Ihre Regeln in Ausdrücke und Teilausdrücke aufgeteilt. Bewegen Sie die Maus auf einen Ausdruck oder Teilausdruck, um weitere Informationen zu erhalten, einschließlich der Anzahl der Ausführungen und der zurückgegebenen Werte. Fügen Sie für die JSON-Rohversion dieser Daten die folgende URL in Ihre Abfrage ein:

http://localhost:9000/.inspect/coverage.json?ns=<database_name>

Und jetzt?