Before connecting your app to the Realtime Database emulator, make sure that you understand the overall Firebase Local Emulator Suite workflow and that you install and configure the Local Emulator Suite.
Instrument your app to talk to the emulators
Android, iOS, and Web SDKs
Set up your in-app configuration or test classes to interact with the Realtime Database as follows.
Android
// 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);
iOS - Swift
// In almost all cases the ns (namespace) is your project ID. let db = Database.database(url:@"http://localhost:9000?ns=YOUR_DATABASE_NAMESPACE")
Web
var db = firebase.database(); if (location.hostname === "localhost") { // Point to the RTDB emulator running on localhost. db.useEmulator("localhost", 9000); }
No additional setup is needed to test Cloud Functions triggered by Realtime Database events using the emulator. When the Realtime Database and Cloud Functions emulators are both running, they automatically work together.
Admin SDKs
The Firebase Admin SDKs automatically connect to the Realtime Database emulator when
the FIREBASE_DATABASE_EMULATOR_HOST
environment variable is set:
export FIREBASE_DATABASE_EMULATOR_HOST="localhost:9000"
If your code is running inside the Cloud Functions emulator your project ID
and other configuration will be automatically set when calling initalizeApp
.
When connecting to the Realtime Database emulator from any other environment,
you will need to specify a project ID. You can pass a project ID to
initializeApp
directly or set the GCLOUD_PROJECT
environment variable.
Note that you do not need to use your real Firebase project ID, the
Realtime Database emulator will accept any project ID:
Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" };
Environment Variable
export GCLOUD_PROJECT="your-project-id"
Clear your database between tests
To flush the Realtime Database between activities, you can clear the database reference. You can use this approach as an alternative to simply shutting down the emulator process.
Android
// With a DatabaseReference, write null to clear the database. database.getReference().setValue(null);
iOS - Swift
// With a DatabaseReference, write nil to clear the database. Database.database().reference().setValue(nil);
Web
// With a database Reference, write null to clear the database. firebase.database().ref().set(null);
Naturally, your code should await confirmation that the flush finished or failed using the asynchronous event handling features of your platform.
Having implemented a step like this, you can sequence your tests and trigger your functions with confidence that old data will be purged between runs and you're using a fresh baseline test configuration.
Import and export data
The database emulators allow you to export data from a running emulator instance. Define a baseline set of data to use in your unit tests or continuous integration workflows, then export it to be shared among the team.
firebase emulators:export ./dir
In tests, on emulator startup, import the baseline data.
firebase emulators:start --import=./dir
You can instruct the emulator to export data on shutdown, either specifying an
export path or simply using the path passed to the --import
flag.
firebase emulators:start --import=./dir --export-on-exit
These data import and export options work with the
firebase emulators:exec
command as well. For more, refer to the
emulator command reference.
Visualize Security Rules activity
As you work through prototype and test loops, you can use visualization tools and reports provided by the Local Emulator Suite.
Visualize Rules evaluations
As you add Security Rules to your prototype you can debug them with Local Emulator Suite tools.
After running a suite of tests, you can access test coverage reports that show how each of your rules was evaluated. To get the reports, query an exposed endpoint on the emulator while it's running. For a browser-friendly version, use the following URL:
http://localhost:9000/.inspect/coverage?ns=<database_name>
This breaks your rules into expressions and subexpressions that you can mouseover for more information, including number of executions and values returned. For the raw JSON version of this data, include the following URL in your query:
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
What next?
- For a curated set of videos and detailed how-to examples, follow the Firebase Emulators Training Playlist.
- Investigate advanced use cases involving Security Rules testing and the Firebase Test SDK: Test Security Rules (Realtime Database).
- Since triggered functions are a typical integration with Realtime Database, learn more about the Cloud Functions for Firebase emulator at Run functions locally.