获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

将您的应用程序连接到 Cloud Functions 模拟器

在将您的应用连接到 Cloud Functions 模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流程,并安装和配置Local Emulator Suite 并查看其CLI 命令

选择一个 Firebase 项目

Firebase 本地模拟器套件模拟单个 Firebase 项目的产品。

要选择要使用的项目,在启动模拟器之前,请在 CLI 中在您的工作目录中运行firebase use 。或者,您可以将--project标志传递给每个模拟器命令。

Local Emulator Suite 支持模拟真实的Firebase 项目和演示项目。

项目类型特征与模拟器一起使用
真实的

真正的 Firebase 项目是您创建和配置的项目(很可能通过 Firebase 控制台)。

真实项目具有实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。

在处理真正的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

对于您未模拟的任何产品,您的应用程序和代码将与实时资源(数据库实例、存储桶、函数等)进行交互。

演示

演示 Firebase 项目没有真正的Firebase 配置,也没有实时资源。这些项目通常通过代码实验室或其他教程访问。

演示项目的项目 ID 具有demo-前缀。

使用演示 Firebase 项目时,您的应用和代码与模拟器交互。如果您的应用程序尝试与未运行模拟器的资源进行交互,则该代码将失败。

我们建议您尽可能使用演示项目。好处包括:

  • 设置更简单,因为您无需创建 Firebase 项目即可运行模拟器
  • 更强的安全性,因为如果您的代码意外调用非模拟(生产)资源,则不会发生数据更改、使用和计费
  • 更好的离线支持,因为无需访问互联网即可下载您的 SDK 配置。

检测您的应用程序以与模拟器对话

为您的应用程序检测可调用函数

如果您的原型和测试活动涉及可调用的后端函数,请配置与 Cloud Functions for Firebase 模拟器的交互,如下所示:

安卓
// 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);
迅速
Functions.functions().useFunctionsEmulator(origin: "http://localhost:5001")

Web version 9

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "localhost", 5001);

Web version 8

firebase.functions().useEmulator("localhost", 5001);

为您的应用程序检测 HTTPS 功能仿真

代码中的每个 HTTPS 函数都将使用以下 URL 格式从本地模拟器提供:

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

例如,具有默认主机端口和区域的简单helloWorld函数将在以下位置提供服务:

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

检测您的应用程序以进行后台触发的功能仿真

Cloud Functions 模拟器支持来自以下来源的后台触发函数:

  • 实时数据库模拟器
  • Cloud Firestore 模拟器
  • 身份验证模拟器
  • 发布/订阅模拟器

要触发后台事件,请使用 Emulator Suite UI 修改后端资源,或者使用适用于您平台的 SDK 将您的应用程序或测试代码连接到模拟器。

扩展程序发出的自定义事件的测试处理程序

对于使用 Cloud Functions v2 处理 Firebase Extensions 自定义事件而实施的函数,Cloud Functions 模拟器与 Eventarc 模拟器配对以支持Eventarc 触发器

要为发出事件的扩展测试自定义事件处理程序,您必须安装 Cloud Functions 和 Eventarc 模拟器。

如果 Eventarc 模拟器正在运行,Cloud Functions 运行时会将当前进程中的EVENTARC_EMULATOR环境变量设置为localhost:9299 。设置EVENTARC_EMULATOR环境变量后,Firebase Admin SDK 会自动连接到 Eventarc 模拟器。您可以修改默认端口,如配置本地仿真器套件中所述。

正确配置环境变量后,Firebase Admin SDK 会自动将事件发送到 Eventarc 模拟器。反过来,Eventarc 模拟器会回调 Cloud Functions 模拟器以触发任何已注册的处理程序。

您可以在 Emulator Suite UI 中查看函数日志以获取有关处理程序执行的详细信息。

配置本地测试环境

如果您的函数依赖于基于 dotenv 的环境配置,您可以在本地测试环境中模拟该行为。

使用本地 Cloud Functions 模拟器时,您可以通过设置.env.local文件来覆盖项目的环境变量。 .env.local的内容优先于.env和项目特定的.env文件。

例如,一个项目可以包含以下三个文件,其中包含用于开发和本地测试的略有不同的值:

.env .env.dev .env.local
PLANET=地球

观众=人类

观众=开发人类观众=当地人

在本地上下文中启动时,模拟器会加载环境变量,如下所示:

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

Cloud Functions 模拟器中的密钥和凭据

Cloud Functions 模拟器支持使用机密来存储和访问敏感的配置信息。默认情况下,模拟器将尝试使用应用程序默认凭据访问您的生产机密。在某些情况下,例如 CI 环境,模拟器可能由于权限限制而无法访问机密值。

与 Cloud Functions 模拟器对环境变量的支持类似,您可以通过设置.secret.local文件来覆盖机密值。这使您可以轻松地在本地测试您的函数,尤其是在您无权访问秘密值的情况下。

还有哪些其他用于测试 Cloud Functions 的工具?

Cloud Functions 模拟器由其他原型和测试工具补充:

  • Cloud Functions shell,它允许交互式、迭代函数原型设计和开发。该外壳使用具有 REPL 样式接口的 Cloud Functions 模拟器进行开发。不提供与 Cloud Firestore 或实时数据库模拟器的集成。使用 shell,您可以模拟数据并执行函数调用,以模拟与 Local Emulator Suite 当前不支持的产品的交互:Analytics、Remote Config 和 Crashlytics。
  • Cloud Functions 的 Firebase 测试 SDK,一个带有 mocha 框架的 Node.js,用于函数开发。实际上,Cloud Functions 测试 SDK 在 Cloud Functions shell 上提供了自动化。

您可以在以交互方式测试函数Cloud Functions 单元测试中找到有关 Cloud Functions shell 和 Cloud Functions Test SDK 的更多信息。

Cloud Functions 模拟器与生产环境有何不同

对于大多数用例,Cloud Functions 模拟器非常接近生产环境。我们已经投入大量工作来确保 Node 运行时中的所有内容都尽可能接近生产环境。但是,模拟器并不能模拟完整的容器化生产环境,因此虽然您的函数代码将真实执行,但您环境的其他方面(即本地文件、函数崩溃后的行为等)会有所不同。

云 IAM

Firebase Emulator Suite 不会尝试复制或尊重任何与 IAM 相关的运行行为。模拟器遵守提供的 Firebase 安全规则,但在通常使用 IAM 的情况下,例如设置调用服务帐户的 Cloud Functions 并因此设置权限,模拟器是不可配置的,并将使用您的开发人员机器上的全局可用帐户,类似于直接运行本地脚本。

内存和处理器限制

模拟器不会对您的函数强制执行内存或处理器限制。但是,模拟器确实通过timeoutSeconds运行时参数支持超时功能。

请注意,在模拟器中运行函数时,函数执行时间可能与生产时间不同。我们建议您在使用模拟器设计和测试功能后,在生产环境中运行有限的测试以确认执行时间。

规划本地和生产环境的差异

由于模拟器在您的本地计算机上运行,​​因此它取决于您的本地环境中的应用程序以及内置程序和实用程序。

请注意,您用于 Cloud Functions 开发的本地环境可能与 Google 生产环境不同:

  • 您在本地安装以模拟生产环境的应用程序(例如本教程中的 ImageMagick)在行为上可能与生产环境不同,尤其是当您需要不同的版本或在非 Linux 环境中开发时。考虑在函数部署的同时部署您自己的缺失程序的二进制副本。

  • 同样,内置实用程序(例如lsmkdir等 shell 命令)可能与生产中可用的版本不同,尤其是在非 Linux 环境(例如 macOS)中开发时。您可以通过使用仅节点替代本机命令或构建 Linux 二进制文件以与您的部署捆绑来处理此问题。

重试

Cloud Functions 模拟器不支持在失败时重试函数。

接下来是什么?