Zanim połączysz aplikację z emulatorem Realtime Database, zapoznaj się z całym procesem Firebase Local Emulator Suite oraz zainstaluj i skonfiguruj Local Emulator Suite i sprawdź jego polecenia CLI.
Wybieranie projektu Firebase
Firebase Local Emulator Suite emuluje usługi w pojedynczym projekcie Firebase.
Aby wybrać projekt, który ma być używany, przed uruchomieniem emulatorów uruchom w CLI polecenie firebase use
w katalogu roboczym. Możesz też przekazać parametr --project
do każdego polecenia emulatora.
Local Emulator Suite obsługuje emulację prawdziwych projektów Firebase oraz projektów demonstracyjnych.
Typ projektu | Funkcje | Używanie z emulatorami |
---|---|---|
Real |
Prawdziwy projekt Firebase to taki, który został utworzony i skonfigurowany (najprawdopodobniej w konsoli Firebase). Prawdziwe projekty mają aktywne zasoby, takie jak instancje bazy danych, kontenery magazynu, funkcje lub inne zasoby skonfigurowane w danym projekcie Firebase. |
Podczas pracy z prawdziwymi projektami Firebase możesz uruchamiać emulatory dla wszystkich lub niektórych obsługiwanych usług. W przypadku usług, których nie emulujesz, Twoje aplikacje i kod będą wchodzić w interakcję z aktywnymi zasobami (instancjami baz danych, zasobnikami magazynu, funkcjami itp.). |
Prezentacja |
Demonstracyjny projekt Firebase nie ma rzeczywistej konfiguracji Firebase ani żadnych zasobów w produkcji. Do tych projektów zwykle uzyskuje się dostęp za pomocą ćwiczeń z programowania lub innych samouczków. Identyfikatory projektów demonstracyjnych mają prefiks |
Podczas pracy z demonstracyjnymi projektami Firebase aplikacje i kod będą wchodzić w interakcje z emulatorami tylko. Jeśli aplikacja próbuje wchodzić w interakcję z zasobem, dla którego nie działa emulowany system, kod nie zadziała. |
W miarę możliwości zalecamy korzystanie z 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 Firebase.
- Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane (produkcyjne) zasoby, nie ma możliwości zmiany danych, ich użycia ani rozliczenia.
- lepsza obsługa trybu offline, ponieważ do pobrania konfiguracji pakietu SDK nie jest potrzebne połączenie z internetem;
Przeprowadź testy aplikacji z użyciem emulatorów
Pakiety SDK na Androida i platformy Apple oraz pakiety SDK internetowe
Skonfiguruj konfigurację w aplikacji lub przetestuj klasy, aby sprawdzić, czy działają one prawidłowo z usługą Realtime Database:
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); }
Aby przetestować funkcje Cloud Functions uruchamiane przez zdarzenia Bazy danych czasu rzeczywistego za pomocą emulatora, nie musisz nic konfigurować. Gdy emulatory Realtime Database i Cloud Functions są uruchomione, automatycznie ze sobą współpracują.
Admin SDK s
Firebase Admin SDKs automatycznie łączą się z emulatorem Realtime Database, gdy zmienna środowiskowa FIREBASE_DATABASE_EMULATOR_HOST
jest ustawiona:
export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"
Jeśli Twój kod jest uruchamiany w emulatorze Cloud Functions, identyfikator projektu i inne ustawienia zostaną automatycznie skonfigurowane podczas wywołania funkcji initializeApp
.
Jeśli chcesz, aby kod Admin SDK łączył się z wspólnym 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ć do funkcji initializeApp
bezpośrednio 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 usunąć Realtime Database między aktywnościami, możesz wyczyścić odwołanie do bazy danych. Możesz użyć tego podejścia zamiast po prostu zamykania procesu emulatora.
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);
Twój kod powinien oczekiwać potwierdzenia, że wyczyszczanie zostało zakończone lub nie powiodło się, korzystając z asymetrycznych funkcji obsługi zdarzeń Twojej platformy.
Po zaimplementowaniu tego kroku możesz sekwencyjnie uruchamiać testy i wyzwalać funkcje, mając pewność, że stare dane zostaną wyczyszczone między kolejnymi uruchomieniami i że używasz nowej konfiguracji testu bazowego.
Importowanie i eksportowanie danych
Emulatory bazy danych i Cloud Storage for Firebase umożliwiają eksportowanie danych z bieżącej instancji emulatora. Określ podstawowy zestaw danych do użycia w testach jednostkowych lub przepływach pracy ciągłej, a następnie wyeksportuj go, aby udostępnić go zespołowi.
firebase emulators:export ./dir
Podczas testów, po uruchomieniu emulatora, zaimportuj dane bazowe.
firebase emulators:start --import=./dir
Możesz zlecić emulatorowi eksportowanie danych po wyłączeniu, określają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 przewodniku po poleceniach emulatora.
Wizualizacja aktywności reguł zabezpieczeń
Podczas tworzenia prototypów i testowania możesz korzystać z wizualizacji i raportów udostępnianych przez Local Emulator Suite.
Wizualizacja oceny reguł
Po dodaniu reguł bezpieczeństwa do prototypu możesz je debugować za pomocą narzędzi Local Emulator Suite.
Po uruchomieniu zestawu testów możesz uzyskać dostęp do raportów o zakresie testów, które pokazują, jak została oceniona każda z reguł. Aby uzyskać raporty, prześlij zapytanie do odsłoniętego punktu końcowego na emulowanym urządzeniu. Aby uzyskać wersję przyjazną przeglądarce, użyj tego adresu URL:
http://localhost:9000/.inspect/coverage?ns=<database_name>
Dzięki temu reguły są dzielone na wyrażenia i podwyrażenia, nad którymi możesz najechać kursorem, aby uzyskać więcej informacji, m.in. liczbę wykonanych instrukcji i zwrócone wartości. Aby uzyskać wersję w postaci nieprzetworzonych danych w formacie JSON, dodaj do zapytania ten adres URL:
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Co dalej?
- Aby uzyskać dostęp do wyselekcjonowanych filmów i szczegółowych przykładów, skorzystaj z playlisty szkoleń na temat emulatorów Firebase.
- Zapoznaj się z zaawansowanymi zastosowaniami dotyczącymi testowania reguł zabezpieczeń i pakietu Firebase Test SDK: Testowanie reguł zabezpieczeń (Baza danych czasu rzeczywistego).
- Funkcje wywoływane są typową integracją z Realtime Database. Więcej informacji o emulatorze Cloud Functions for Firebase znajdziesz w artykule Uruchamianie funkcji lokalnie.