在本地运行函数

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

  • HTTPS 函数
  • Callable 函数
  • 从 Firebase Authentication、Realtime Database、Cloud Firestore、Cloud Storage 和 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 Firestore 和 Realtime Database 触发器已经有足够的凭据,需要进行额外的设置。
  • 对于所有其他 API(包括 Authentication 和 FCM 等 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+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 模块化 API

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

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

Web 命名空间型 API

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

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

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

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

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

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

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

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

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

如需触发后台事件,您可以使用 Emulator Suite 界面修改后端资源,也可以使用适用于您平台的 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 界面中查看 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 函数用作托管代理。

日志记录

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

后续步骤

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