Zanim połączysz aplikację z emulatorem Cloud Functions, upewnij się, że rozumiesz ogólny przepływ pracy Firebase Local Emulator Suite, zainstaluj i skonfiguruj Local Emulator Suite oraz zapoznaj się z jego poleceniami CLI.
Wybieranie projektu w Firebase
Firebase Local Emulator Suite emuluje produkty dla pojedynczego 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 w tym projekcie Firebase project. |
Podczas pracy z rzeczywistymi projektami Firebase możesz uruchamiać emulatory dla dowolnej lub wszystkich obsługiwanych usług. W przypadku usług, 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ą warsztatów programistycznych lub innych samouczków. Identyfikatory projektów demonstracyjnych mają prefiks |
Podczas pracy z demonstracyjnymi projektami Firebase Twoje aplikacje i kod wchodzą w interakcje z emulatorami tylko. Jeśli aplikacja spróbuje wejść w interakcję z zasobem dla którego nie jest uruchomiony emulator, kod zakończy się niepowodzeniem. |
Jeśli 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.
Instrumentowanie aplikacji do komunikacji z emulatorami
Instrumentowanie aplikacji pod kątem funkcji wywoływalnych
Jeśli prototypowanie i testowanie obejmuje wywoływane funkcje backendu, skonfiguruj interakcję z Cloud Functions for Firebase emulatorem 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 functions = Firebase.functions functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. FirebaseFunctions functions = FirebaseFunctions.getInstance(); functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useEmulator(withHost: "localhost", port: 5001)
Web
import { getApp } from "firebase/app"; import { getFunctions, connectFunctionsEmulator } from "firebase/functions"; const functions = getFunctions(getApp()); connectFunctionsEmulator(functions, "127.0.0.1", 5001);
Web
firebase.functions().useEmulator("127.0.0.1", 5001);
Instrumentowanie aplikacji pod kątem emulacji funkcji HTTPS
Każda funkcja HTTPS w Twoim kodzie będzie obsługiwana przez emulator lokalny przy użyciu tego formatu adresu URL:
http://$HOST:$PORT/$PROJECT/$REGION/$NAME
Na przykład prosta funkcja helloWorld z domyślnym portem hosta i regionem będzie obsługiwana pod adresem:
https://localhost:5001/$PROJECT/us-central1/helloWorld
Instrumentowanie aplikacji pod kątem emulacji funkcji kolejki zadań
Emulator automatycznie konfiguruje emulowane kolejki zadań na podstawie definicji aktywatorów, a pakiet Admin SDK przekierowuje żądania w kolejce do emulatora, jeśli wykryje, że jest on uruchomiony za pomocą zmiennej środowiskowej CLOUD_TASKS_EMULATOR_HOST.
Pamiętaj, że system wysyłania używany w środowisku produkcyjnym jest bardziej złożony niż ten zaimplementowany w emulatorze, więc nie należy oczekiwać, że emulowane zachowanie będzie dokładnie odzwierciedlać środowiska produkcyjne. Parametry w emulatorze określają górne granice szybkości, z jaką zadania są wysyłane i ponawiane.
Instrumentowanie aplikacji pod kątem emulacji funkcji wywoływanych w tle
Emulator Cloud Functions obsługuje funkcje wywoływane w tle z tych źródeł:
- Realtime Database emulator
- Cloud Firestore emulator
- Authentication emulator
- emulator Pub/Sub
- emulatora alertów Firebase.
Aby wywołać zdarzenia w tle, zmodyfikuj zasoby backendu za pomocą Emulator Suite UI, lub połącz aplikację bądź kod testowy z emulatorami za pomocą pakietu SDK dla swojej platformy.
Testowanie modułów obsługi zdarzeń niestandardowych emitowanych przez rozszerzenia
W przypadku funkcji, które implementujesz do obsługi Firebase Extensions zdarzeń niestandardowych za pomocą Cloud Functions w wersji 2, emulator Cloud Functions jest sparowany z emulatorem Eventarc, aby obsługiwać aktywatory Eventarc.
Aby testować moduły obsługi zdarzeń niestandardowych w przypadku rozszerzeń, które emitują zdarzenia, musisz zainstalować emulatory Cloud Functions i Eventarc.
Jeśli emulator Eventarc jest uruchomiony, środowisko wykonawcze Cloud Functions ustawia zmienną środowiskową EVENTARC_EMULATOR na localhost:9299 w bieżącym procesie. Pakiety Firebase Admin SDK automatycznie łączą się z emulatorem Eventarc
, gdy ustawiona jest zmienna środowiskowa EVENTARC_EMULATOR. Domyślny port możesz
zmienić zgodnie z opisem w sekcji Konfigurowanie Local Emulator Suite.
Gdy zmienne środowiskowe są prawidłowo skonfigurowane, Firebase Admin SDK automatycznie wysyła zdarzenia do emulatora Eventarc. Z kolei emulator Eventarc wywołuje emulator Cloud Functions, aby wywołać zarejestrowane moduły obsługi.
Szczegółowe informacje o wykonywaniu modułów obsługi znajdziesz w logach funkcji w Emulator Suite UI w celu uzyskania szczegółowych informacji o wykonywaniu modułów obsługi.
Konfigurowanie lokalnego środowiska testowego
Jeśli Twoje funkcje korzystają z konfiguracji środowiska opartej na dotenv , możesz emulować to zachowanie w lokalnym środowisku testowym.
Gdy używasz lokalnego Cloud Functions emulatora, możesz zastąpić zmienne środowiskowe
projektu, konfigurując plik .env.local. Zawartość pliku
.env.local ma pierwszeństwo przed plikiem .env i plikiem .env specyficznym dla projektu.
Na przykład projekt może zawierać te 3 pliki z nieco innymi wartościami na potrzeby programowania i testowania lokalnego:
.env
|
.env.dev
|
.env.local
|
| PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Local Humans |
Po uruchomieniu w kontekście lokalnym emulator wczytuje zmienne środowiskowe w ten sposób:
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
Utajnione informacje i dane logowania w emulatorze Cloud Functions
Emulator Cloud Functions obsługuje używanie utajnionych informacji do przechowywania poufnych informacji o konfiguracji i uzyskiwania do nich dostępu. Domyślnie emulator będzie próbował uzyskać dostęp do utajnionych informacji produkcyjnych za pomocą domyślnych danych logowania aplikacji. W niektórych sytuacjach, np. w środowiskach CI, emulator może nie mieć dostępu do wartości utajnionych informacji z powodu ograniczeń uprawnień.
Podobnie jak w przypadku obsługi zmiennych środowiskowych przez emulator Cloud Functions, możesz
zastąpić wartości utajnionych informacji, konfigurując plik .secret.local. Ułatwia to testowanie funkcji lokalnie, zwłaszcza jeśli nie masz dostępu do wartości utajnionych informacji.
Jakie inne narzędzia do testowania Cloud Functions są dostępne?
Emulator Cloud Functions jest uzupełniany przez inne narzędzia do prototypowania i testowania:
- Powłoka Cloud Functions, która umożliwia interaktywne, iteracyjne prototypowanie i programowanie funkcji. Powłoka używa emulatora Cloud Functions z interfejsem w stylu REPL do programowania. Nie jest zapewniona integracja z emulatorami Cloud Firestore ani Realtime Database. Za pomocą powłoki możesz symulować dane i wykonywać wywołania funkcji, aby symulować interakcje z usługami, których Local Emulator Suiteobecnie nie obsługuje: Analytics, Zdalna konfiguracja i Crashlytics.
- Firebase Test SDK for Cloud Functions, czyli Node.js z frameworkiem mocha do programowania funkcji. W efekcie pakiet Cloud Functions Test SDK zapewnia automatyzację na podstawie powłoki Cloud Functions.
Więcej informacji o powłoce Cloud Functions i pakiecie Cloud Functions Test SDK znajdziesz w artykułach Testowanie funkcji interaktywnie i Testowanie jednostkowe Cloud Functions.
Różnice między emulatorem Cloud Functions a środowiskiem produkcyjnym
Emulator Cloud Functions jest dość zbliżony do środowiska produkcyjnego w większości przypadków. Dołożyliśmy wszelkich starań, aby wszystko w środowisku wykonawczym Node było jak najbardziej zbliżone do środowiska produkcyjnego. Emulator nie naśladuje jednak pełnego środowiska produkcyjnego w kontenerze, więc chociaż kod funkcji będzie wykonywany realistycznie, inne aspekty środowiska (np. pliki lokalne, zachowanie po awarii funkcji itp.) będą się różnić.
Cloud IAM
Pakiet emulatorów Firebase nie próbuje replikować ani respektować żadnych zachowań związanych z IAM. Emulatory przestrzegają podanych reguł zabezpieczeń Firebase, ale w sytuacjach, w których normalnie używany byłby IAM, np. do ustawienia konta usługi wywołującej Cloud Functions, a tym samym uprawnień, emulator nie jest konfigurowalny i będzie używać globalnie dostępnego konta na komputerze dewelopera, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.
Ograniczenia dotyczące pamięci i procesora
Emulator nie wymusza ograniczeń dotyczących pamięci ani procesora w przypadku Twoich funkcji. Emulator obsługuje jednak przekroczenie limitu czasu funkcji za pomocą argumentu środowiska wykonawczego timeoutSeconds.
Pamiętaj, że czas wykonywania funkcji może się różnić od czasu w środowisku produkcyjnym, gdy funkcje są uruchamiane w emulatorze. Zalecamy, aby po zaprojektowaniu i przetestowaniu funkcji za pomocą emulatora przeprowadzić ograniczone testy w środowisku produkcyjnym, aby potwierdzić czasy wykonywania.
Planowanie różnic między środowiskami lokalnymi i produkcyjnymi
Emulator działa na komputerze lokalnym, więc zależy od lokalnego środowiska aplikacji oraz wbudowanych programów i narzędzi.
Pamiętaj, że Twoje lokalne środowisko programistyczne dla Cloud Functions może różnić się od środowiska produkcyjnego Google:
Aplikacje instalowane lokalnie w celu symulowania środowiska produkcyjnego (np. ImageMagick z tego samouczka) mogą się różnić zachowaniem od środowiska produkcyjnego, zwłaszcza jeśli wymagają innej wersji lub są rozwijane w środowisku innym niż Linux. Rozważ wdrożenie własnej kopii binarnej brakującego programu wraz z wdrożeniem funkcji.
Podobnie wbudowane narzędzia (np. polecenia powłoki takie jak
lsczymkdir) mogą się różnić od wersji dostępnych w środowisku produkcyjnym, zwłaszcza jeśli programujesz w środowisku innym niż Linux (np. macOS). Możesz rozwiązać ten problem, używając alternatyw dla poleceń natywnych, które działają tylko w Node, lub tworząc pliki binarne Linuksa, które można dołączyć do wdrożenia.
Ponawiam próbę
Emulator Cloud Functions nie obsługuje ponawiania prób w przypadku niepowodzenia funkcji.
Co dalej?
- Zestaw wyselekcjonowanych filmów i szczegółowych instrukcji z przykładami znajdziesz na playliście szkoleń na temat emulatorów Firebase.
- Więcej informacji o emulatorze Cloud Functions for Firebase znajdziesz w artykule Uruchamianie funkcji lokalnie.