Połącz aplikację z emulatorem bazy danych czasu rzeczywistego

Zanim połączysz aplikację z emulatorem Realtime Database, upewnij się, że rozumiesz ogólny przepływ pracy Firebase Local Emulator Suite, oraz że masz zainstalowany i skonfigurowany Local Emulator Suite i znasz jego polecenia CLI.

Wybieranie projektu w Firebase

Firebase Local Emulator Suite emuluje produkty dla jednego projektu w Firebase.

Aby wybrać projekt, którego chcesz używać, przed uruchomieniem emulatorów wpisz w CLI polecenie firebase use w katalogu roboczym. Możesz też przekazać flagę --project do każdego polecenia emulatora.

Local Emulator Suite obsługuje emulację rzeczywistych projektów Firebase i demonstracyjnych projektów.

Typ projektu Funkcje Użycie z emulatorami
Rzeczywisty

Rzeczywisty projekt w Firebase to projekt, który został utworzony i skonfigurowany (najprawdopodobniej w Firebase konsoli).

Rzeczywiste projekty mają aktywne zasoby, takie jak instancje bazy danych, zasobniki pamięci buckets, funkcje lub inne zasoby skonfigurowane dla tego projektu Firebase project.

Podczas pracy z rzeczywistymi projektami Firebase możesz uruchamiać emulatory dla dowolnych lub wszystkich obsługiwanych produktów.

W przypadku produktów, które nie są emulowane, Twoje aplikacje i kod będą wchodzić w interakcje z aktywnym zasobem (instancją bazy danych, zasobnikiem pamięci, funkcją itp.).

Demonstracyjny

Demonstracyjny projekt w Firebase nie ma rzeczywistej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów jest zwykle uzyskiwany za pomocą codelabów lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

Podczas pracy z demonstracyjnymi projektami Firebase Twoje aplikacje i kod wchodzą w interakcje z emulatorami tylko. Jeśli Twoja aplikacja spróbuje wejść w interakcję z zasobem dla którego nie jest uruchomiony emulator, kod się nie wykona.

Tam, gdzie to możliwe, zalecamy używanie projektów demonstracyjnych. W ten sposób możesz zapewnić im dostęp do tych korzyści:

  • Łatwiejsza konfiguracja, ponieważ możesz uruchamiać emulatory bez tworzenia projektu w Firebase.
  • Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane (produkcyjne) zasoby, nie będzie możliwości zmiany danych, użycia ani rozliczenia.
  • Lepsza obsługa offline, ponieważ nie musisz uzyskiwać dostępu do internetu, aby pobrać konfigurację pakietu SDK.
Cloud FunctionsSecurity RulesAuthentication

Instrumentowanie aplikacji do komunikacji z emulatorami

Pakiety SDK na Androida, platformy Apple i do internetu

Skonfiguruj klasy testowe lub konfigurację w aplikacji, aby wchodzić w interakcje z Realtime Database w ten sposób.

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")

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

Aby przetestować funkcje Cloud Functions wywoływane przez zdarzenia bazy danych czasu rzeczywistego za pomocą emulatora, nie musisz wykonywać żadnych dodatkowych czynności. Gdy emulatory bazy danych czasu rzeczywistego i Cloud Functions są uruchomione, automatycznie współpracują ze sobą.

Admin SDKs

Pakiety Firebase Admin SDK automatycznie łączą się z emulatorem Realtime Database, gdy ustawiona jest zmienna środowiskowa FIREBASE_DATABASE_EMULATOR_HOST:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Jeśli Twój kod jest uruchomiony w emulatorze Cloud Functions, identyfikator projektu i inne ustawienia zostaną automatycznie skonfigurowane podczas wywoływania initializeApp.

Jeśli chcesz, aby kod Admin SDK łączył się ze współdzielonym emulatorem działającym w innym środowisku, musisz podać ten sam identyfikator projektu, który został ustawiony za pomocą wiersza poleceń Firebase. Identyfikator projektu możesz przekazać bezpośrednio do initializeApp lub ustawić zmienną środowiskową GCLOUD_PROJECT.

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

Czyszczenie bazy danych między testami

Aby opróżnić Realtime Database między aktywnościami, możesz wyczyścić odniesienie do bazy danych. To podejście może być alternatywą dla zwykłego zamykania procesu emulatora.

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

Oczywiście Twój kod powinien czekać na potwierdzenie, że opróżnianie się powiodło lub nie, korzystając z asynchronicznych funkcji obsługi zdarzeń na platformie.

Po zaimplementowaniu takiego kroku możesz sekwencjonować testy i wywoływać funkcje, mając pewność, że stare dane zostaną usunięte między uruchomieniami i że używasz nowej konfiguracji testu podstawowego.

Importowanie i eksportowanie danych

Emulatory bazy danych i Cloud Storage for Firebase umożliwiają eksportowanie danych z uruchomionej instancji emulatora. Zdefiniuj podstawowy zestaw danych, który będzie używany w testach jednostkowych lub przepływach pracy ciągłej integracji, a następnie wyeksportuj go, aby udostępnić go zespołowi.

firebase emulators:export ./dir

W testach, po uruchomieniu emulatora, zaimportuj dane podstawowe.

firebase emulators:start --import=./dir

Możesz poinstruować emulator, aby eksportował dane po zamknięciu, podając ścieżkę eksportu lub po prostu używając ścieżki przekazanej do flagi --import.

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

Te opcje importowania i eksportowania danych działają też z poleceniem firebase emulators:exec. Więcej informacji znajdziesz w dokumentacji poleceń emulatora.

Wizualizowanie aktywności reguł zabezpieczeń

Podczas pracy nad prototypem i testowania możesz korzystać z narzędzi do wizualizacji i raportów udostępnianych przez Local Emulator Suite.

Wizualizowanie ocen reguł

Podczas dodawania reguł zabezpieczeń do prototypu możesz je debugować za pomocą Local Emulator Suite narzędzi.

Po uruchomieniu zestawu testów możesz uzyskać dostęp do raportów pokrycia testami, które pokazują, jak oceniana była każda z reguł. Aby uzyskać raporty, podczas działania emulatora wyślij zapytanie do udostępnionego punktu końcowego. Aby uzyskać wersję przyjazną dla przeglądarki, użyj tego adresu URL:

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

Reguły są dzielone na wyrażenia i podwyrażenia, które możesz najechać kursorem, aby uzyskać więcej informacji, w tym liczbę wykonań i zwrócone wartości. Aby uzyskać wersję tych danych w formacie JSON, w zapytaniu uwzględnij ten adres URL:

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

Co dalej?