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

在將您的應用程式連接到 Cloud Functions 模擬器之前,請確保您了解 Firebase 本機模擬器套件的整體工作流程,並安裝和設定本機模擬器套件並查看其CLI 命令

選擇 Firebase 項目

Firebase 本機模擬器套件模擬單一 Firebase 專案的產品。

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

本機模擬器套件支援模擬真實的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().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web modular API

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

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

Web namespaced API

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

為您的應用程式偵測 HTTPS 功能模擬

程式碼中的每個 HTTPS 函數都將使用以下 URL 格式從本機模擬器提供服務:

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

例如,具有預設主機連接埠和區域的簡單helloWorld函數將在以下位置提供服務:

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

為您的應用程式配備後台觸發功能模擬

Cloud Functions 模擬器支援以下來源的後台觸發函數:

  • 即時資料庫模擬器
  • Cloud Firestore 模擬器
  • 認證模擬器
  • 發布/訂閱模擬器

若要觸發後台事件,請使用模擬器套件 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 模擬器以觸發任何已註冊的處理程序。

您可以檢查模擬器套件 UI 中的函數日誌,以了解有關處理程序執行的詳細資訊。

配置本地測試環境

如果您的函數依賴基於 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,您可以模擬資料並執行函數調用,以模擬與本機模擬器套件目前不支援的產品的交互作用:Analytics、Remote Config 和 Crashlytics。
  • Firebase Test SDK for Cloud Functions,一個用於函數開發的帶有 mocha 框架的 Node.js。實際上,Cloud Functions Test SDK 在 Cloud Functions shell 之上提供自動化。

您可以在互動式測試函數和 Cloud Functions單元測試中找到有關 Cloud Functions shell 和 Cloud Functions Test SDK 的更多資訊。

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

對於大多數用例來說,Cloud Functions 模擬器與生產環境相當接近。我們投入了大量的工作來確保 Node 運行時中的所有內容都盡可能接近生產。但是,模擬器不會模仿完整的容器化生產環境,因此雖然您的函數程式碼將實際執行,但環境的其他方面(即本機檔案、函數崩潰後的行為等)將會有所不同。

雲端身分管理

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

記憶體和處理器限制

模擬器不會對您的函數強制執行記憶體或處理器限制。但是,模擬器確實透過timeoutSeconds運行時參數支援超時功能。

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

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

由於模擬器在本機電腦上運行,因此它取決於應用程式以及內建程式和實用程式的本機環境。

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

  • 您在本機安裝的用於模擬生產環境的應用程式(例如本教學中的 ImageMagick)的行為可能與生產環境有所不同,特別是當您需要不同的版本或在非 Linux 環境中進行開發時。考慮在函數部署的同時部署您自己的缺失程式的二進位副本。

  • 同樣,內建實用程式(例如,shell 命令,如lsmkdir )可能與生產中可用的版本不同,特別是如果您在非 Linux 環境(例如 macOS)中進行開發。您可以透過使用僅 Node 替代本機命令,或建立 Linux 二進位檔案以與您的部署捆綁在一起來解決此問題。

重試

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

接下來是什麼?