將您的應用程序連接到 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 模擬器
  • 身份驗證模擬器
  • 發布/訂閱模擬器

要觸發後台事件,請使用適用於您平台的 SDK 將您的應用程序或測試代碼連接到模擬器。

配置本地測試環境

如果您的函數依賴於基於 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 模擬器不支持在失敗時重試函數。

接下來是什麼?