在本地运行函数

Firebase CLI 包含一个 Cloud Functions 模拟器,可以模拟以下类型的函数:

  • HTTPS 函数
  • Callable 函数
  • 任务队列函数
  • Firebase AuthenticationRealtime DatabaseCloud FirestoreCloud Storage、支持的 Firebase 提醒和 Cloud Pub/Sub 触发的后台函数。

您可以在本地运行函数,以便在部署到生产环境之前对其进行测试。

安装 Firebase CLI

如需使用 Cloud Functions 模拟器,请先安装 Firebase CLI:

npm install -g firebase-tools

如需使用本地模拟器,您的 Cloud Functions 必须依赖于以下产品:

  • firebase-admin 8.0.0 版或更高版本。
  • firebase-functions 3.0.0 版或更高版本。

设置管理员凭据(可选)

如果您希望自己的函数测试通过 Firebase Admin SDK 与 Google API 或其他 Firebase API 进行交互,则可能需要设置管理员凭据。

  • Cloud FirestoreRealtime Database 触发器已经有足够的凭据,需要进行额外的设置。
  • 对于所有其他 API(包括 AuthenticationFCM 等 Firebase API,或 Cloud Translation 和 Cloud Speech 等 Google API),您都需要执行本部分中说明的设置步骤。无论您使用的是 Cloud Functions shell 还是 firebase emulators:start,都需要遵循此要求。

如需为所模拟的函数设置管理员凭据,请执行以下操作:

  1. 打开 Google Cloud 控制台的“服务账号”窗格
  2. 确保已选择 App Engine 默认服务账号,并使用右侧的选项菜单选择创建密钥
  3. 出现提示时,选择 JSON 作为密钥类型,然后点击创建
  4. 将您的 Google 默认凭据设置为指向已下载的密钥:

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase emulators:start
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase emulators:start
    

完成这些步骤之后,您的函数测试便可以使用 Admin SDK 访问 Firebase 和 Google API。例如,在测试 Authentication 触发器时,模拟的函数可以调用 admin.auth().getUserByEmail(email)

设置函数配置(可选)

如果您使用的是自定义函数配置变量,请先在本地环境中运行以下命令以获取自定义配置(在 functions 目录中运行):

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

运行模拟器套件

如需运行 Cloud Functions 模拟器,请使用 emulators:start 命令:

firebase emulators:start

根据您已使用 firebase init 在本地项目中初始化的产品,emulators:start 命令将启动用于 Cloud Functions、Cloud Firestore、Realtime Database 和 Firebase Hosting 的模拟器。如果要启动特定的模拟器,请使用 --only 标志:

firebase emulators:start --only functions

如果要在模拟器启动后运行测试套件或测试脚本,请使用 emulators:exec 命令:

firebase emulators:exec "./my-test.sh"

对您的应用进行插桩 (instrument) 处理以便与模拟器通信

如需对您的应用进行插桩处理以与模拟器交互,您可能需要进行一些其他配置。

针对 Callable 函数对您的应用进行插桩处理

如果您的原型设计和测试活动涉及 Callable 后端函数,请按如下方式配置与 Cloud Functions for Firebase 模拟器的交互:

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

对您的应用进行插桩处理以便模拟 HTTPS 函数

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

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

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

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

针对任务队列函数模拟对您的应用进行插桩处理

模拟器会根据触发器定义自动设置模拟的任务队列,如果 Admin SDK 检测到模拟器是通过 CLOUD_TASKS_EMULATOR_HOST 环境变量运行的,则会将已加入队列的请求重新路由到模拟器。

请注意,在生产环境中使用的调度系统比在模拟器中实现的调度系统更复杂,因此您不应期望模拟行为能够精确反映生产环境。模拟器中的参数对任务的调度和重试速率提供了上限。

针对后台触发的函数模拟对您的应用进行插桩处理

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

  • Realtime Database 模拟器
  • Cloud Firestore 模拟器
  • Authentication 模拟器
  • Pub/Sub 模拟器
  • Firebase 提醒模拟器

如需触发后台事件,您可以使用 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 模拟器。您可以按照配置 Local Emulator Suite 中的说明修改默认端口。

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

您可以在 Emulator Suite UI 中查看 Cloud Functions 日志,详细了解处理程序的执行情况。

与其他服务交互

Emulator Suite 包含多个模拟器,这些模拟器可以用来测试跨产品交互。

Cloud Firestore

如果您有一些函数使用 Firebase Admin SDK 向 Cloud Firestore 执行写入操作,这些写入操作将被发送到正在运行的 Cloud Firestore 模拟器。如果这些写入操作触发了其他函数,这些函数将在 Cloud Functions 模拟器中运行。

Cloud Storage

如果您有一些函数使用 Firebase Admin SDK(版本 9.7.0 或更高)向 Cloud Storage 执行写入操作,这些写入操作将被发送到正在运行的 Cloud Storage 模拟器。如果这些写入操作触发了其他函数,这些函数将在 Cloud Functions 模拟器中运行。

Firebase Authentication

如果您有一些函数使用 Firebase Admin SDK(版本 9.3.0 或更高)向 Firebase Authentication 执行写入操作,这些写入操作将被发送到正在运行的 Authentication 模拟器。如果这些写入操作触发了其他函数,这些函数将在 Cloud Functions 模拟器中运行。

Firebase Hosting

如果您使用 Cloud Functions Firebase Hosting 生成动态内容firebase emulators:start 会将您的本地 HTTP 函数用作托管代理。

Firebase 提醒

在包含至少一个支持的 Firebase 提醒触发器的任何项目中,模拟器界面都包含一个 FireAlerts 标签页。如需模拟提醒触发器,请执行以下操作:

  1. 打开 FireAlerts 标签页。此标签页会显示一个下拉列表,其中填充有与触发器关联的提醒类型(例如,如果您有 onNewFatalIssuePublished 触发器,则会显示 crashlytics.newFatalIssue)。
  2. 选择提醒类型。表单会自动填充默认值,这些值可以修改。您可以修改事件的字段(来自提醒事件的其他信息是推理的模拟值或是随机生成)。
  3. 选择发送提醒以向函数模拟器发送合成提醒,Firebase 控制台的提醒(以及日志)中提供了日志记录。

日志记录

模拟器会将日志从您的函数流式传输到运行这些函数的终端窗口。该窗口会显示您的函数内的 console.log()console.info()console.error()console.warn() 语句的所有输出内容。

后续步骤

如需查看使用 Firebase 模拟器套件的完整示例,请参阅测试快速入门示例