Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

將您的應用程序連接到 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 模擬器不支持在失敗時重試函數。

接下來是什麼?