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 progetti dimostrativi.

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, si accede a questi progetti 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 progetti demo, se possibile. I vantaggi includono:

  • Configurazione più semplice, poiché puoi eseguire gli emulatori senza dover 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 in modo che possa comunicare con gli emulatori

Esegui l'instrumentazione dell'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 verrà pubblicata dall'emulatore locale utilizzando il seguente formato dell'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

Strumenta l'app per l'emulazione delle funzioni della coda 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, pertanto non dovresti aspettarti che il comportamento simulato rispecchi esattamente gli ambienti di produzione. I parametri all'interno dell'emulatore forniscono limiti superiori alla frequenza con cui le attività vengono inviate e riprovate.

Esegui l'instrumentazione dell'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 che implementi per gestire gli eventi personalizzati Firebase Extensions con Cloud Functions versione 2, l'emulatore Cloud Functions si accoppia con l'emulatore Eventarc per supportare gli 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. I 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.

Configurare 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
PLANET=Earth

AUDIENCE=Utenti

AUDIENCE=Dev Humans AUDIENCE=Local Humans

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 alcune situazioni, ad esempio negli ambienti CI, l'emulatore potrebbe non riuscire ad accedere ai valori segreti a causa di limitazioni delle autorizzazioni.

Analogamente al supporto dell'emulatore Cloud Functions per le variabili di ambiente, puoi eseguire l'override dei valori dei secret impostando 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 strumenti per prototipi e test:

  • La shell 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 alcuna 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 Local Emulator Suite non supporta al momento: Analytics, Remote Config e Crashlytics.
  • L'SDK di test di Firebase per Cloud Functions, un framework Node.js con Mocha per lo sviluppo di funzioni. In effetti, l'SDK di test di Cloud Functions fornisce automazione sulla shell di Cloud Functions.

Puoi scoprire di più sulla shell di Cloud Functions e sull'SDK di test di Cloud Functions in Testare le funzioni in modo interattivo e Test di unità di Cloud Functions.

Differenze tra l'emulatore Cloud Functions e la produzione

L'emulatore Cloud Functions è abbastanza simile 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ù simile 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 correlato all'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 il service account di chiamata di 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 di runtime timeoutSeconds.

Tieni presente che il tempo di esecuzione della funzione può essere diverso da quello di 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.

Pianificare le 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 l'ambiente locale per lo sviluppo di Cloud Functions potrebbe essere diverso dall'ambiente di produzione di 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 in formato binario del programma mancante insieme al deployment della funzione.

  • 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 risolvere il problema utilizzando alternative solo Node ai comandi nativi o compilando i binari Linux da includere nel tuo deployment.

Nuovo tentativo in corso…

L'emulatore Cloud Functions non supporta la ripetizione delle funzioni in caso di errore.

Che cosa succede ora?