Conecta tu app al emulador de Cloud Functions

Antes de conectar tu app al emulador de Cloud Functions, asegúrate de comprender el flujo de trabajo general de Firebase Local Emulator Suite y de instalar y configurar el Local Emulator Suite, y revisa los comandos de su CLI.

Elige un proyecto de Firebase

El Firebase Local Emulator Suite emula los productos para un solo proyecto de Firebase.

Para seleccionar el proyecto que quieres usar, ejecuta firebase use en la CLI en tu directorio de trabajo antes de iniciar los emuladores. También puedes pasar la marca --project a cada comando del emulador.

El Local Emulator Suite admite la emulación de proyectos reales de Firebase y de demostración.

Tipo de proyecto Características Uso con emuladores
Real

Los proyectos de Firebase reales son aquellos que creaste y configuraste (probablemente usando Firebase console).

Los proyectos reales tienen recursos activos, como instancias de bases de datos, buckets de almacenamiento, funciones o cualquier otro recurso que hayas configurado para ese proyecto de Firebase.

Cuando trabajas con proyectos reales de Firebase, puedes ejecutar emuladores para cualquiera de los productos compatibles o todos ellos.

Si se trata de un producto que no estás emulando, tus apps y código interactuarán con los recursos activos (instancias de bases de datos, bucket de almacenamiento, función, etcétera).

Demostración

Los proyectos de demostración de Firebase no tienen una configuración real de Firebase ni recursos activos. Por lo general, se accede a estos proyectos mediante codelabs o algún otro instructivo.

Los IDs de los proyectos de demostración tienen el prefijo demo-.

Cuando trabajas con proyectos de demostración de Firebase, tus apps y código interactúan solo con emuladores. Si tu app intenta interactuar con un recurso para el cual no se está ejecutando un emulador, ese código fallará.

Te recomendamos que uses proyectos de demostración siempre que sea posible. Estos son algunos de los beneficios:

  • Configuración más sencilla, ya que puedes ejecutar los emuladores sin crear un proyecto de Firebase
  • Mayor seguridad, ya que, si tu código invoca de forma accidental recursos no emulados (de producción), no hay posibilidad de que se modifiquen los datos, el uso ni la facturación
  • Mejor soporte sin conexión, ya que no es necesario acceder a Internet para descargar la configuración del SDK

Instrumenta la app para que se comunique con los emuladores

Instrumenta la app para funciones que admiten llamadas

Si tus actividades de prototipado y de realización de pruebas involucran funciones de backend que admiten llamadas, configura la interacción con el emulador de Cloud Functions for Firebase de la siguiente manera:

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);

Instrumenta la app para emular funciones HTTPS

Se entregará cada función HTTPS de tu código desde el emulador local con el siguiente formato de URL:

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

Por ejemplo, una función helloWorld simple con el puerto y la región de host predeterminados se entregarían en la siguiente ubicación:

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

Instrumenta la app para emular las funciones de la lista de tareas en cola

El emulador configura automáticamente listas de tareas en cola emuladas en función del las definiciones de activador, y el SDK de Admin redirige las solicitudes en cola al emulador si detecta que se está ejecutando a través de la variable de entorno CLOUD_TASKS_EMULATOR_HOST.

Ten en cuenta que el sistema de despacho usado en producción es más complejo que el implementado en el emulador, por lo que no deberías esperar que el comportamiento emulado replique con precisión los entornos de producción. Los parámetros dentro del emulador proporcionan límites superiores a la velocidad a la que se despachan y reintentan las tareas.

Instrumenta la app para emular funciones activadas en segundo plano

El emulador de Cloud Functions admite funciones activadas en segundo plano de las siguientes fuentes:

  • Emulador de Realtime Database
  • Emulador de Cloud Firestore
  • Emulador de Authentication
  • Emulador de Pub/Sub
  • Emulador de alertas de Firebase

Para activar eventos en segundo plano, modifica los recursos del backend con la Emulator Suite UI o conecta tu app o código de prueba a los emuladores con el SDK de tu plataforma.

Prueba controladores para eventos personalizados emitidos por Extensiones

Para las funciones que implementes para controlar eventos personalizados de Firebase Extensions con Cloud Functions v2, el emulador de Cloud Functions se vincula con el emulador de Eventarc para admitir activadores de Eventarc.

Si quieres probar los controladores de eventos personalizados para las extensiones que emiten eventos, debes instalar los emuladores de Eventarc y Cloud Functions.

El entorno de ejecución de Cloud Functions configura la variable de entorno de EVENTARC_EMULATOR como localhost:9299 en el proceso actual si el emulador de Eventarc se esté ejecutando. Los Firebase Admin SDK se conectan automáticamente al emulador de Eventarc cuando se configura la variable de entorno EVENTARC_EMULATOR. Puedes modificar el puerto predeterminado como se explica en Configura Local Emulator Suite.

Cuando las variables de entorno se configuran correctamente, el Firebase Admin SDK envía eventos automáticamente al emulador de Eventarc. A su vez, este último hace una llamada al emulador de Cloud Functions para activar cualquier controlador registrado.

Puedes verificar los registros de Functions en la Emulator Suite UI para obtener detalles sobre la ejecución del controlador.

Configura un entorno de pruebas local

Si tus funciones dependen de la configuración del entorno basada en dotenv, puedes emular ese comportamiento en tu entorno de pruebas local.

Cuando usas un emulador de Cloud Functions local, puedes anular las variables de entorno del proyecto configurando un archivo .env.local. El contenido de .env.local tiene prioridad sobre .env y el archivo .env específico del proyecto.

Por ejemplo, un proyecto podría incluir estos tres archivos que contienen valores ligeramente distintos para el desarrollo y las pruebas locales:

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

Cuando se inicia en el contexto local, el emulador carga las variables de entorno como se muestra a continuación:

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

Secretos y credenciales en el emulador de Cloud Functions

El emulador de Cloud Functions admite el uso de secretos para almacenar información de configuración sensible y acceder a ella. De forma predeterminada, el emulador intentará acceder a los secretos de producción con las credenciales predeterminadas de la aplicación. En algunas situaciones, como los entornos de CI, es posible que el emulador no pueda acceder a los valores de los secretos debido a restricciones de permisos.

De manera similar a la compatibilidad del emulador de Cloud Functions con las variables de entorno, puedes anular los valores de los secretos con la configuración de un archivo .secret.local. Esto te permite probar las funciones de forma local, en particular, si no tienes acceso al valor del secreto.

¿Qué otras herramientas existen para probar Cloud Functions?

El emulador de Cloud Functions se complementa con otras herramientas de prototipado y pruebas.

  • La shell de Cloud Functions, que permite el prototipado y el desarrollo de funciones interactivas e iterativas. La shell utiliza el emulador de Cloud Functions con una interfaz de estilo REPL para llevar a cabo el desarrollo. No se proporciona ninguna integración en los emuladores de Cloud Firestore o Realtime Database. Con la shell, puedes simular datos y realizar llamadas a funciones para imitar la interacción con productos que Local Emulator Suite no admite actualmente, como Analytics, Remote Config y Crashlytics.
  • El SDK de Firebase Test para Cloud Functions, un framework de Node.js con Mocha para desarrollar funciones. Cuando se implementa, el SDK de Firebase Test para Cloud Functions proporciona automatización sobre la shell de Cloud Functions.

Puedes encontrar más información sobre la shell de Cloud Functions y el SDK de Firebase Test para Cloud Functions en Prueba funciones de forma interactiva y Prueba de unidades de Cloud Functions.

Diferencias entre el emulador de Cloud Functions y el entorno de producción

El emulador de Cloud Functions es bastante parecido al entorno de producción en la mayoría de los casos de uso. Nos esforzamos mucho para asegurarnos de que todos los elementos del entorno de ejecución del nodo sean lo más similares posible a la producción. Sin embargo, el emulador no imita el entorno de producción alojado en contenedores por completo, por lo que, si bien el código de tu función se ejecutará de forma realista, otros aspectos del entorno (es decir, archivos locales, el comportamiento después de fallas de las funciones, etc.) no lo harán.

Cloud IAM

Firebase Emulator Suite no intenta replicar ni respetar ningún comportamiento relacionado con la IAM para la ejecución. Los emuladores cumplen con las reglas de seguridad de Firebase proporcionadas, pero, en situaciones en las que normalmente se usaría la IAM (por ejemplo, para configurar Cloud Functions que invoquen la cuenta de servicio y los permisos), el emulador no se puede configurar y utiliza la cuenta con disponibilidad global en tu máquina de desarrollador, de manera similar a ejecutar una secuencia de comandos local directamente.

Restricciones de memoria y procesador

El emulador no aplica restricciones de memoria o procesador para tus funciones. Sin embargo, sí admite funciones de tiempo de espera a través del argumento de tiempo de ejecución timeoutSeconds.

Ten en cuenta que el tiempo de ejecución de la función puede diferir de la producción cuando las funciones se ejecutan en el emulador. Te recomendamos que, después de diseñar y probar funciones con el emulador, ejecutes pruebas limitadas en la producción para confirmar los tiempos de ejecución.

Planifica diferencias en los entornos locales y de producción

Ya que el emulador se ejecuta en la máquina local, depende de tu entorno local para las aplicaciones y las utilidades y los programas integrados.

Ten en cuenta que el entorno local para el desarrollo de Cloud Functions puede diferir del entorno de producción de Google:

  • Las aplicaciones que instalas de forma local para simular el entorno de producción (p. ej., ImageMagick de este instructivo) pueden tener un comportamiento diferente en la producción, en especial si necesitas una versión diferente o desarrollas en un entorno que no es Linux. Te recomendamos implementar tu propia copia binaria del programa faltante junto con la implementación de tu función.

  • De manera similar, las utilidades integradas (p. ej., los comandos de shell como ls y mkdir) pueden diferir de las versiones disponibles en producción, sobre todo si desarrollas en un entorno que no es Linux (p. ej., macOS). Para manejar este problema, puedes usar alternativas a los comandos nativos que sean exclusivas de Node.js o compilar objetos binarios de Linux para empaquetarlos con la implementación.

Reintentando

El emulador de Cloud Functions no admite reintentar las funciones en caso de falla.

Próximos pasos