Zanim połączysz aplikację z emulatorem Cloud Functions, upewnij się, że rozumiesz ogólny przepływ pracy w Firebase Local Emulator Suite oraz że instalujesz i konfigurujesz Local Emulator Suite i sprawdzasz polecenia interfejsu wiersza poleceń.
Wybierz projekt w Firebase
Firebase Local Emulator Suite emuluje produkty w ramach jednego projektu w Firebase.
Aby wybrać projekt, którego chcesz użyć, przed uruchomieniem emulatorów uruchom w interfejsie wiersza poleceń 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 w Firebase i projektów demonstracyjnych.
| Typ projektu | Funkcje | Używanie z emulatorami |
|---|---|---|
| real |
Rzeczywisty projekt w Firebase to projekt utworzony i skonfigurowany przez Ciebie (najprawdopodobniej w konsoli Firebase). Rzeczywiste projekty zawierają aktywne zasoby, takie jak instancje baz danych, zasobniki, funkcje lub inne zasoby skonfigurowane dla danego projektu Firebase. |
Podczas pracy z prawdziwymi projektami w Firebase możesz uruchamiać emulatory dowolnych lub wszystkich obsługiwanych usług. W przypadku usług, których nie emulujesz, aplikacje i kod będą wchodzić w interakcje z zasobami aktywnymi (instancją bazy danych, zasobnikiem na dane, funkcją itp.). |
| Prezentacja |
Projekt demonstracyjny Firebase nie ma rzeczywistej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów można zwykle uzyskać za pomocą ćwiczeń w programowaniu lub innych samouczków. Identyfikatory projektów demonstracyjnych mają prefiks |
Podczas pracy z projektami w Firebase w wersji demonstracyjnej aplikacje i kod wchodzą w interakcje wyłącznie z emulatorami. Jeśli aplikacja spróbuje wejść w interakcję z zasobem, dla którego emulator nie jest uruchomiony, kod nie zadziała. |
Zalecamy korzystanie z projektów demonstracyjnych, gdy tylko jest to możliwe. W ten sposób możesz zapewnić im dostęp do tych korzyści:
- łatwiejsza konfiguracja, ponieważ emulatory można uruchamiać bez tworzenia projektu w Firebase;
- Większe bezpieczeństwo, ponieważ jeśli kod przypadkowo wywoła nieemulowane zasoby (produkcyjne), nie ma możliwości zmiany danych, użycia ani naliczenia opłat.
- Lepsza obsługa offline, ponieważ nie trzeba mieć dostępu do internetu, aby pobrać konfigurację pakietu SDK.
Instrumentowanie aplikacji pod kątem komunikacji z emulatorami
Instrumentowanie aplikacji pod kątem funkcji wywoływalnych
Jeśli działania związane z prototypowaniem i testowaniem obejmują wywoływane funkcje backendu, skonfiguruj interakcję z emulatorem Cloud Functions for Firebase 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)
Unity
FirebaseFunctions functions = FirebaseFunctions.DefaultInstance; // Connects to the Functions Emulator running on port 5001 functions.UseFunctionsEmulator("http://127.0.0.1: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 na potrzeby emulacji funkcji HTTPS
Każda funkcja HTTPS w kodzie będzie obsługiwana przez lokalny emulator w tym formacie 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 na potrzeby emulacji funkcji kolejki zadań
Emulator automatycznie konfiguruje emulowane kolejki zadań na podstawie definicji aktywatorów, a pakiet Admin SDK przekierowuje żądania z kolejki do emulatora, jeśli wykryje, że działa on 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 zachowanie emulowane będzie dokładnie odzwierciedlać środowiska produkcyjne. Parametry w emulatorze określają górne limity częstotliwości wysyłania i ponawiania zadań.
Instrumentacja aplikacji na potrzeby emulacji funkcji wywoływanych w tle
Emulator Cloud Functions obsługuje funkcje aktywowane w tle z tych źródeł:
- Emulator Realtime Database
- Emulator Cloud Firestore
- Emulator Authentication
- Emulator Pub/Sub
- Emulator 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.
Obsługa testów zdarzeń niestandardowych generowanych przez rozszerzenia
W przypadku funkcji, które implementujesz do obsługi zdarzeń niestandardowych Firebase Extensions za pomocą Cloud Functions w wersji 2, emulator Cloud Functions jest sparowany z emulatorem Eventarc, aby obsługiwać aktywatory Eventarc.
Aby przetestować niestandardowe moduły obsługi zdarzeń 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. Gdy zmienna środowiskowa EVENTARC_EMULATOR jest ustawiona, Firebase Admin SDK automatycznie łączą się z emulatorem Eventarc. Możesz zmienić domyślny port, jak opisano 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 aktywować zarejestrowane moduły obsługi.
Szczegółowe informacje o wykonywaniu modułów obsługi znajdziesz w logach funkcji w Emulator Suite UI.
Konfigurowanie lokalnego środowiska testowego
Jeśli funkcje korzystają z konfiguracji środowiska opartej na dotenv, możesz emulować to zachowanie w lokalnym środowisku testowym.
Jeśli używasz lokalnego emulatora Cloud Functions, możesz zastąpić zmienne środowiskowe w projekcie, konfigurując plik .env.local. Zawartość pliku .env.local ma pierwszeństwo przed plikiem .env i plikiem .env powiązanym z projektem.
Na przykład projekt może zawierać te 3 pliki z nieco innymi wartościami do 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 następujący 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 korzystanie z obiektów tajnych do przechowywania poufnych informacji konfiguracyjnych i uzyskiwania do nich dostępu. Domyślnie emulator będzie próbował uzyskać dostęp do obiektów tajnych w środowisku produkcyjnym przy użyciu domyślnego uwierzytelniania aplikacji. W niektórych sytuacjach, np. w środowiskach CI, emulator może nie mieć dostępu do wartości obiektów tajnych z powodu ograniczeń uprawnień.
Podobnie jak w przypadku obsługi zmiennych środowiskowych przez emulator Cloud Functions, możesz zastąpić wartości obiektów tajnych, konfigurując plik .secret.local. Dzięki temu możesz łatwo testować funkcje lokalnie, zwłaszcza jeśli nie masz dostępu do wartości obiektu tajnego.
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 tworzenie funkcji. Powłoka wykorzystuje emulator Cloud Functions z interfejsem w stylu REPL do programowania. Nie ma integracji 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 Suite obecnie nie obsługuje: Analytics, Zdalna konfiguracja i Crashlytics.
- Pakiet Firebase Test SDK for Cloud Functions, Node.js z platformą mocha do tworzenia funkcji. W efekcie pakiet SDK do testowania Cloud Functions zapewnia automatyzację w powłoce Cloud Functions.
Więcej informacji o powłoce Cloud Functions i pakiecie SDK do testowania Cloud Functions znajdziesz w artykułach Interaktywne testowanie funkcji i Testowanie jednostkowe Cloud Functions.
Różnice między emulatorem Cloud Functions a środowiskiem produkcyjnym
W większości przypadków emulator Cloud Functions jest bardzo zbliżony do środowiska produkcyjnego. 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 emulatora Firebase nie próbuje replikować ani uwzględniać żadnych zachowań związanych z uprawnieniami podczas działania. Emulatory przestrzegają podanych reguł zabezpieczeń Firebase, ale w sytuacjach, w których zwykle używane są uprawnienia, np. do ustawiania konta usługi wywołującego funkcje w Cloud Functions, a tym samym uprawnień, emulatora nie można skonfigurować i będzie on używać konta dostępnego globalnie na komputerze używanym do programowania, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.
Ograniczenia dotyczące pamięci i procesora
Emulator nie wymusza ograniczeń pamięci ani procesora dla funkcji. Emulator obsługuje jednak funkcje przekroczenia limitu czasu za pomocą argumentu środowiska wykonawczego timeoutSeconds.
Pamiętaj, że czas wykonywania funkcji w emulatorze może się różnić od czasu wykonywania w środowisku produkcyjnym. Zalecamy, aby po zaprojektowaniu i przetestowaniu funkcji za pomocą emulatora przeprowadzić ograniczone testy w środowisku produkcyjnym w celu potwierdzenia czasu wykonywania.
Uwzględnianie różnic między środowiskiem lokalnym a środowiskiem produkcyjnym
Emulator działa na komputerze lokalnym, więc jego działanie zależy od środowiska lokalnego aplikacji oraz wbudowanych programów i narzędzi.
Pamiętaj, że Twoje środowisko lokalne do programowania w Cloud Functions może się różnić od środowiska produkcyjnego Google:
Aplikacje instalowane lokalnie w celu symulowania środowiska produkcyjnego (np. ImageMagick z tego samouczka) mogą zachowywać się inaczej niż w środowisku produkcyjnym, zwłaszcza jeśli potrzebujesz innych wersji lub programujesz 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
ls,mkdir) mogą różnić się 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 alternatywnych poleceń natywnych, które są przeznaczone tylko dla Node, lub tworząc pliki binarne Linuksa do dołączenia do wdrożenia.
Ponawiam próbę
Emulator Cloud Functions nie obsługuje ponawiania funkcji w przypadku niepowodzenia.
Co dalej?
- Aby obejrzeć wybrane filmy i szczegółowe instrukcje, skorzystaj z playlisty szkoleniowej dotyczącej emulatorów Firebase.
- Więcej informacji o emulatorze Cloud Functions for Firebase znajdziesz w artykule Uruchamianie funkcji lokalnie.