Collega la tua app all'emulatore Cloud Functions

Prima di collegare l'app all'emulatore Cloud Functions, assicurati di comprendere il flusso di lavoro complessivo di Firebase Local Emulator Suite, di installare e configurare Local Emulator Suite e di esaminare i relativi comandi CLI.

Scegli un progetto Firebase

Firebase Local Emulator Suite emula i prodotti per un singolo progetto Firebase.

Per selezionare il progetto da utilizzare, prima di avviare gli emulatori, esegui firebase use nella directory di lavoro in CLI. In alternativa, puoi passare il flag --project a ogni comando dell'emulatore.

Local Emulator Suite supporta l'emulazione di progetti Firebase reali e demo.

Tipo di progetto Funzionalità Utilizzo con emulatori
Reale

Un progetto Firebase reale è quello che hai creato e configurato (molto probabilmente tramite la console Firebase).

I progetti reali hanno risorse attive, come istanze di database, bucket di archiviazione, funzioni o qualsiasi altra risorsa configurata per il progetto Firebase.

Quando lavori con progetti Firebase reali, puoi eseguire emulatori per uno o tutti i prodotti supportati.

Per tutti i prodotti che non stai emulando, le tue app e il tuo codice interagiranno con la risorsa in produzione (istanza di database, bucket di archiviazione, funzione e così via).

Demo

Un progetto Firebase dimostrativo non ha una configurazione Firebase reale e non ha risorse attive. In genere, questi progetti sono accessibili tramite codelab o altri tutorial.

Gli ID progetto per i progetti demo hanno il prefisso demo-.

Quando utilizzi progetti Firebase di prova, le tue app e il tuo codice interagiscono solo con gli emulatori. Se la tua app tenta di interagire con una risorsa per la quale non è in esecuzione un emulatore, il codice non andrà a buon fine.

Ti consigliamo di utilizzare i progetti dimostrativi, se possibile. I vantaggi includono:

  • Configurazione più semplice, dato che puoi eseguire gli emulatori senza mai creare un progetto Firebase
  • Maggiore sicurezza, poiché se il codice richiama accidentalmente risorse non emulate (di produzione), non c'è alcuna possibilità di modifica, utilizzo e fatturazione dei dati
  • Migliore assistenza offline, poiché non è necessario accedere a internet per scaricare la configurazione dell'SDK.

Instrumenta l'app per comunicare con gli emulatori

Strumenti della tua app per le funzioni richiamabili

Se le attività di test e del prototipo prevedono funzioni di backend richiamabili, configura l'interazione con l'emulatore Cloud Functions for Firebase come segue:

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 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().useFunctionsEmulator(origin: "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);

Esegui l'instrumentazione dell'app per l'emulazione delle funzioni HTTPS

Ogni funzione HTTPS nel codice viene gestita dall'emulatore locale utilizzando il seguente formato URL:

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

Ad esempio, una semplice funzione helloWorld con la porta e la regione host predefinite verrà pubblicata all'indirizzo:

https://localhost:5001/$PROJECT/us-central1/helloWorld

Strumenti della tua app per l'emulazione delle funzioni delle code di attività

L'emulatore configura automaticamente le code di attività emulate in base alle definizioni degli attivatori e l'Admin SDK reindirizza le richieste in coda all'emulatore se rileva che è in esecuzione tramite la variabile di ambiente CLOUD_TASKS_EMULATOR_HOST.

Tieni presente che il sistema di invio utilizzato in produzione è più complesso di quello implementato nell'emulatore, quindi non dovresti aspettarti che il comportamento emulato rispecchi con precisione gli ambienti di produzione. I parametri all'interno dell'emulatore forniscono limiti superiori alla frequenza con cui le attività vengono inviate e ritentate.

Strumenti della tua app per l'emulazione delle funzioni attivate in background

L'emulatore Cloud Functions supporta le funzioni attivate in background dalle seguenti origini:

  • Emulatore Realtime Database
  • Emulatore Cloud Firestore
  • emulatore Authentication
  • emulatore Pub/Sub
  • Emulatore di avvisi Firebase

Per attivare gli eventi in background, modifica le risorse di backend utilizzando Emulator Suite UI o collegando l'app o il codice di test agli emulatori utilizzando l'SDK per la tua piattaforma.

Testare i gestori per gli eventi personalizzati emessi dalle estensioni

Per le funzioni implementate per gestire gli eventi personalizzati Firebase Extensions con Cloud Functions v2, l'emulatore Cloud Functions viene accoppiato all'emulatore Eventarc per supportare i trigger Eventarc.

Per testare i gestori di eventi personalizzati per le estensioni che emettono eventi, devi installare gli emulatori Cloud Functions ed Eventarc.

Il runtime Cloud Functions imposta la variabile di ambiente EVENTARC_EMULATOR su localhost:9299 nel processo corrente se l'emulatore Eventarc è in esecuzione. Gli Firebase Admin SDK si connettono automaticamente all'emulatore Eventarc quando è impostata la variabile di ambiente EVENTARC_EMULATOR. Puoi modificare la porta predefinita come descritto in Configura Local Emulator Suite.

Quando le variabili di ambiente sono configurate correttamente, Firebase Admin SDK invia automaticamente gli eventi all'emulatore Eventarc. A sua volta, l'emulatore Eventarc richiama l'emulatore Cloud Functions per attivare eventuali gestori registrati.

Puoi controllare i log di Functions in Emulator Suite UI per informazioni dettagliate sull'esecuzione dell'handler.

configura un ambiente di test locale

Se le tue funzioni si basano su configurazione dell'ambiente basata su dotenv, puoi emulare questo comportamento nell'ambiente di test locale.

Quando utilizzi un emulatore Cloud Functions locale, puoi eseguire l'override delle variabili di ambiente per il tuo progetto configurando un file .env.local. I contenuti di .env.local hanno la precedenza su .env e sul file .env specifico del progetto.

Ad esempio, un progetto potrebbe includere questi tre file contenenti valori leggermente diversi per lo sviluppo e i test locali:

.env .env.dev .env.local
PIANO=Terra

SEGMENTO DI PUBBLICO=umani

AUDIENCE=Dev Humans AUDIENCE=Persone locali

Quando viene avviato nel contesto locale, l'emulatore carica le variabili di ambiente come mostrato di seguito:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Secret e credenziali nell'emulatore Cloud Functions

L'emulatore Cloud Functions supporta l'utilizzo di secret per archiviare e accedere a informazioni di configurazione sensibili. Per impostazione predefinita, l'emulatore tenterà di accedere ai secret di produzione utilizzando le credenziali predefinite dell'applicazione. In determinate situazioni, come gli ambienti CI, l'emulatore potrebbe non riuscire ad accedere ai valori secret a causa di restrizioni sulle autorizzazioni.

Analogamente al supporto dell'emulatore Cloud Functions per le variabili di ambiente, puoi eseguire l'override dei valori dei secret configurando un file .secret.local. In questo modo, puoi testare facilmente le funzioni localmente, soprattutto se non hai accesso al valore del secret.

Quali altri strumenti per il test di Cloud Functions esistono?

L'emulatore Cloud Functions è integrato da altri prototipi e strumenti di test:

  • La shell di Cloud Functions, che consente la prototipazione e lo sviluppo di funzioni interattive e iterative. La shell utilizza l'emulatore Cloud Functions con un'interfaccia in stile REPL per lo sviluppo. Non è prevista l'integrazione con gli emulatori Cloud Firestore o Realtime Database. Utilizzando la shell, puoi simulare i dati ed eseguire chiamate di funzione per simulare l'interazione con i prodotti che al momento non sono supportati da Local Emulator Suite: Analytics, Remote Config e Crashlytics.
  • L'SDK di test Firebase per Cloud Functions, un framework Node.js con Mocha per lo sviluppo di funzioni. L'SDK di test di Cloud Functions offre l'automazione sulla shell di Cloud Functions.

Puoi trovare ulteriori informazioni sulla shell di Cloud Functions e sull'SDK di test di Cloud Functions in Test delle funzioni in modo interattivo e nel Test delle unità di Cloud Functions.

Differenze dell'emulatore Cloud Functions dalla produzione

L'emulatore Cloud Functions è abbastanza vicino all'ambiente di produzione per la maggior parte dei casi d'uso. Abbiamo lavorato duramente per garantire che tutto all'interno del runtime di Node sia il più vicino possibile alla produzione. Tuttavia, l'emulatore non simula l'ambiente di produzione containerizzato completo, pertanto, anche se il codice della funzione verrà eseguito in modo realistico, altri aspetti dell'ambiente (ad es. file locali, comportamento dopo gli arresti anomali delle funzioni e così via) saranno diversi.

Cloud IAM

Firebase Emulator Suite non tenta di replicare o rispettare alcun comportamento relativo a IAM per l'esecuzione. Gli emulatori rispettano le Regole di sicurezza di Firebase fornite, ma nelle situazioni in cui normalmente verrebbe utilizzato IAM, ad esempio per impostare l'account di servizio che richiama Cloud Functions e quindi le autorizzazioni, l'emulatore non è configurabile e utilizzerà l'account disponibile a livello globale sulla tua macchina dello sviluppatore, in modo simile all'esecuzione diretta di uno script locale.

Limitazioni di memoria e del processore

L'emulatore non applica limitazioni di memoria o del processore per le tue funzioni. Tuttavia, l'emulatore supporta le funzioni di timeout tramite l'argomento runtime timeoutSeconds.

Tieni presente che il tempo di esecuzione delle funzioni può differire rispetto alla produzione quando le funzioni vengono eseguite nell'emulatore. Dopo aver progettato e testato le funzioni con l'emulatore, ti consigliamo di eseguire test limitati in produzione per confermare i tempi di esecuzione.

Pianificazione delle differenze tra gli ambienti locali e di produzione

Poiché l'emulatore viene eseguito sulla tua macchina locale, dipende dal tuo ambiente locale per le applicazioni, i programmi e le utilità integrati.

Tieni presente che il tuo ambiente locale per lo sviluppo di Cloud Functions potrebbe essere diverso dall'ambiente di produzione Google:

  • Il comportamento delle applicazioni installate localmente per simulare l'ambiente di produzione (ad es. ImageMagick di questo tutorial) può essere diverso da quello in produzione, soprattutto se hai bisogno di versioni diverse o sviluppi in un ambiente non Linux. Valuta la possibilità di eseguire il deployment della tua copia binaria del programma mancante insieme al deployment delle funzioni.

  • Analogamente, le utilità integrate (ad es. i comandi shell come ls, mkdir) possono essere diverse dalle versioni disponibili in produzione, soprattutto se stai sviluppando in un ambiente non Linux (ad es. macOS). Puoi gestire il problema utilizzando alternative solo per nodi ai comandi nativi oppure creando programmi binari Linux da integrare nel deployment.

Nuovo tentativo in corso…

L'emulatore Cloud Functions non supporta i nuovi tentativi in caso di errore.

Che cosa succede ora?