Catch up on highlights from Firebase at Google I/O 2023. Learn more

將您的應用程序連接到 Cloud Functions 模擬器

在將您的應用程序連接到 Cloud Functions 模擬器之前,請確保您了解整個 Firebase Local Emulator Suite 工作流程,並安裝和配置Local Emulator Suite 並查看其CLI 命令

選擇一個 Firebase 項目

Firebase Local Emulator Suite 模擬單個 Firebase 項目的產品。

要選擇要使用的項目,請在啟動模擬器之前,在 CLI 中運行firebase use 。或者,您可以將--project標誌傳遞給每個模擬器命令。

Local Emulator Suite 支持模擬真實的Firebase 項目和演示項目。

項目類型特徵與模擬器一起使用
真實的

一個真正的 Firebase 項目是您創建和配置的項目(很可能是通過 Firebase 控制台)。

真實項目具有實時資源,例如數據庫實例、存儲桶、函數或您為該 Firebase 項目設置的任何其他資源。

在處理真實的 Firebase 項目時,您可以為任何或所有受支持的產品運行模擬器。

對於您未模擬的任何產品,您的應用程序和代碼將與實時資源(數據庫實例、存儲桶、函數等)交互。

演示

一個演示 Firebase 項目沒有真正的Firebase 配置,也沒有實時資源。這些項目通常通過代碼實驗室或其他教程訪問。

演示項目的項目 ID 具有demo-前綴。

使用演示 Firebase 項目時,您的應用程序和代碼與模擬器交互。如果您的應用程序嘗試與未運行模擬器的資源進行交互,則該代碼將失敗。

我們建議您盡可能使用演示項目。好處包括:

  • 設置更簡單,因為您無需創建 Firebase 項目即可運行模擬器
  • 更強的安全性,因為如果您的代碼不小心調用了非模擬(生產)資源,就沒有數據更改、使用和計費的機會
  • 更好的離線支持,因為無需訪問互聯網即可下載您的 SDK 配置。

檢測您的應用以與模擬器對話

檢測您的應用程序以獲取可調用函數

如果您的原型和測試活動涉及可調用的後端函數,請像這樣配置與 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);
迅速
Functions.functions().useEmulator(withHost: "localhost", port: 5001)

Web modular API

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

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

Web namespaced API

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 模擬器。您可以按照Configure Local Emulator Suite中的討論修改默認端口。

正確配置環境變量後,Firebase Admin SDK 會自動將事件發送到 Eventarc 模擬器。反過來,Eventarc 模擬器會回調 Cloud Functions 模擬器以觸發任何已註冊的處理程序。

您可以在 Emulator Suite UI 中查看 Functions 日誌,了解有關處理程序執行的詳細信息。

配置本地測試環境

如果您的功能依賴於基於 dotenv 的環境配置,您可以在本地測試環境中模擬該行為。

使用本地 Cloud Functions 模擬器時,您可以通過設置.env.local文件來覆蓋項目的環境變量。 .env.local的內容優先於.env和項目特定的.env文件。

例如,一個項目可能包括這三個文件,其中包含用於開發和本地測試的略有不同的值:

.env .env.dev .env.local
行星=地球

觀眾=人類

觀眾=開發人員觀眾=當地人

在本地上下文中啟動時,模擬器加載環境變量,如下所示:

  $ 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,允許交互式、迭代函數原型設計和開發。該 shell 使用具有 REPL 風格接口的 Cloud Functions 模擬器進行開發。不提供與 Cloud Firestore 或實時數據庫模擬器的集成。使用 shell,您可以模擬數據並執行函數調用以模擬與 Local Emulator Suite 當前不支持的產品的交互:Analytics、Remote Config 和 Crashlytics。
  • 用於 Cloud Functions 的 Firebase 測試 SDK,一個帶有用於功能開發的 mocha 框架的 Node.js。實際上,Cloud Functions Test SDK 在 Cloud Functions shell 之上提供了自動化。

您可以在交互式測試函數和雲函數單元測試中找到有關 Cloud Functions shell 和 Cloud Functions Test SDK 的更多信息。

Cloud Functions 模擬器與生產環境有何不同

對於大多數用例,Cloud Functions 模擬器非常接近生產環境。我們已經投入大量工作來確保 Node 運行時中的所有內容都盡可能接近生產環境。然而,模擬器並不模仿完整的容器化生產環境,因此雖然您的函數代碼會真實執行,但您環境的其他方面(即本地文件、函數崩潰後的行為等)會有所不同。

雲 IAM

Firebase 模擬器套件不會嘗試複製或遵守任何與 IAM 相關的運行行為。模擬器遵守提供的 Firebase 安全規則,但在通常使用 IAM 的情況下,例如設置 Cloud Functions 調用服務帳戶和權限,模擬器不可配置,將使用開發人員計算機上的全局可用帳戶,類似於直接運行本地腳本。

內存和處理器限制

模擬器不會對您的函數強制執行內存或處理器限制。但是,模擬器確實通過timeoutSeconds運行時參數支持超時功能。

請注意,當函數在模擬器中運行時,函數執行時間可能與生產時間不同。我們建議您在使用模擬器設計和測試功能後,在生產環境中運行有限的測試以確認執行時間。

規劃本地和生產環境的差異

由於模擬器在您的本地計算機上運行,因此它取決於您的應用程序和內置程序和實用程序的本地環境。

請注意,您用於 Cloud Functions 開發的本地環境可能與 Google 生產環境不同:

  • 您在本地安裝以模擬生產環境的應用程序(例如本教程中的 ImageMagick)在行為上可能與生產環境不同,尤其是當您需要不同的版本或在非 Linux 環境中開發時。考慮在函數部署的同時部署您自己的丟失程序的二進制副本。

  • 同樣,內置實用程序(例如lsmkdir等 shell 命令)可能與生產中可用的版本不同,尤其是當您在非 Linux 環境(例如 macOS)中進行開發時。您可以通過使用純節點替代本機命令或通過構建 Linux 二進製文件與您的部署捆綁在一起來處理此問題。

重試

Cloud Functions 模擬器不支持在失敗時重試函數。

接下來是什麼?