Connecter votre application à l'émulateur Realtime Database

Avant de connecter votre application à l'émulateur Realtime Database, assurez-vous de comprendre le workflow global de Firebase Local Emulator Suite, d'installer et de configurer Local Emulator Suite, et de consulter ses commandes de CLI.

Choisir un projet Firebase

Firebase Local Emulator Suite émule les produits d'un seul projet Firebase.

Pour sélectionner le projet à utiliser, avant de démarrer les émulateurs, exécutez firebase use dans votre répertoire de travail dans la CLI. Vous pouvez également transmettre l'option --project à chaque commande de l'émulateur.

Local Emulator Suite est compatible avec l'émulation de projets Firebase réels et de projets de démonstration.

Type de projet Fonctionnalités Utiliser avec des émulateurs
Situation réelle

Un projet Firebase réel est un projet que vous avez créé et configuré (probablement via la console Firebase).

Les projets réels disposent de ressources actives, telles que des instances de base de données, des buckets de stockage, des fonctions ou toute autre ressource que vous configurez pour ce projet Firebase.

Lorsque vous travaillez avec de vrais projets Firebase, vous pouvez exécuter des émulateurs pour l'un ou l'ensemble des produits compatibles.

Pour tous les produits que vous n'émulez pas, vos applications et votre code interagiront avec la ressource active (instance de base de données, bucket de stockage, fonction, etc.).

Démo

Un projet de démonstration Firebase ne comporte pas de véritable configuration Firebase ni de ressources actives. Ces projets sont généralement accessibles via des ateliers de programmation ou d'autres tutoriels.

Les ID des projets de démonstration ont le préfixe demo-.

Lorsque vous travaillez avec des projets Firebase de démonstration, vos applications et votre code interagissent uniquement avec des émulateurs. Si votre application tente d'interagir avec une ressource pour laquelle un émulateur n'est pas en cours d'exécution, ce code échouera.

Nous vous recommandons d'utiliser des projets de démonstration dans la mesure du possible. Voici quelques-uns de ses avantages :

  • Configuration plus simple, car vous pouvez exécuter les émulateurs sans jamais créer de projet Firebase
  • Sécurité renforcée : si votre code appelle accidentellement des ressources non émulées (production), il n'y a aucun risque de modification des données, d'utilisation et de facturation.
  • Meilleure compatibilité hors connexion, car il n'est pas nécessaire d'accéder à Internet pour télécharger la configuration de votre SDK.

Instrumenter votre application pour communiquer avec les émulateurs

SDK Android, plates-formes Apple et Web

Configurez vos classes de configuration ou de test dans l'application pour qu'elles interagissent avec Realtime Database comme suit.

Kotlin
// 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")
Unity
// Connects to the RTDB Emulator running on port 9000.
// Note: You may need to append your namespace: "?ns=YOUR_PROJECT_ID"
FirebaseDatabase database = FirebaseDatabase.GetInstance("http://127.0.0.1:9000");

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);
} 

Aucune configuration supplémentaire n'est requise pour tester les fonctions Cloud déclenchées par des événements Realtime Database à l'aide de l'émulateur. Lorsque les émulateurs Realtime Database et Cloud Functions sont tous deux en cours d'exécution, ils fonctionnent automatiquement ensemble.

Admin SDK s

Les Firebase Admin SDK se connectent automatiquement à l'émulateur Realtime Database lorsque la variable d'environnement FIREBASE_DATABASE_EMULATOR_HOST est définie :

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Si votre code s'exécute dans l'émulateur Cloud Functions, l'ID de votre projet et les autres configurations sont automatiquement définis lors de l'appel de initializeApp.

Si vous souhaitez que votre code Admin SDK se connecte à un émulateur partagé s'exécutant dans un autre environnement, vous devez spécifier le même ID de projet que celui que vous avez défini à l'aide de la CLI Firebase. Vous pouvez transmettre un ID de projet directement à initializeApp ou définir la variable d'environnement GCLOUD_PROJECT.

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

Effacer votre base de données entre les tests

Pour vider le Realtime Database entre les activités, vous pouvez effacer la référence de la base de données. Vous pouvez utiliser cette approche au lieu d'arrêter simplement le processus de l'émulateur.

Kotlin
// 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);

Naturellement, votre code doit attendre la confirmation que le vidage est terminé ou a échoué, en utilisant les fonctionnalités de gestion des événements asynchrones de votre plate-forme.

Une fois cette étape implémentée, vous pouvez séquencer vos tests et déclencher vos fonctions en ayant la certitude que les anciennes données seront purgées entre les exécutions et que vous utilisez une nouvelle configuration de test de référence.

Importer et exporter des données

Les émulateurs de base de données et Cloud Storage for Firebase vous permettent d'exporter des données à partir d'une instance d'émulateur en cours d'exécution. Définissez un ensemble de données de référence à utiliser dans vos tests unitaires ou vos workflows d'intégration continue, puis exportez-le pour le partager avec l'équipe.

firebase emulators:export ./dir

Dans les tests, au démarrage de l'émulateur, importez les données de référence.

firebase emulators:start --import=./dir

Vous pouvez demander à l'émulateur d'exporter les données lors de l'arrêt, soit en spécifiant un chemin d'exportation, soit en utilisant simplement le chemin d'accès transmis à l'option --import.

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

Ces options d'importation et d'exportation de données fonctionnent également avec la commande firebase emulators:exec. Pour en savoir plus, consultez la documentation de référence sur les commandes de l'émulateur.

Visualiser l'activité des règles de sécurité

Lorsque vous travaillez sur des boucles de prototypage et de test, vous pouvez utiliser les outils de visualisation et les rapports fournis par Local Emulator Suite.

Visualiser les évaluations des règles

Lorsque vous ajoutez des règles de sécurité à votre prototype, vous pouvez les déboguer à l'aide des outils Local Emulator Suite.

Après avoir exécuté une suite de tests, vous pouvez accéder à des rapports de couverture de test qui montrent comment chacune de vos règles a été évaluée. Pour obtenir les rapports, interrogez un point de terminaison exposé sur l'émulateur pendant son exécution. Pour une version adaptée aux navigateurs, utilisez l'URL suivante :

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

Vos règles sont ainsi divisées en expressions et sous-expressions que vous pouvez survoler avec la souris pour obtenir plus d'informations, y compris le nombre d'exécutions et les valeurs renvoyées. Pour obtenir la version JSON brute de ces données, incluez l'URL suivante dans votre requête :

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

Et maintenant ?