將應用程式連線至 Cloud Functions 模擬器

將應用程式連線至 Cloud Functions 模擬器之前,請務必瞭解整體 Firebase 本機模擬器套件的工作流程,並安裝及設定本機模擬器套件並查看其 CLI 指令

選擇 Firebase 專案

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

如要選取要使用的專案,請先透過 CLI 在工作目錄中執行 firebase use,再啟動模擬器。或者,您也可以將 --project 標記傳遞至每個模擬器指令。

本機模擬器套件支援模擬「實際」的 Firebase 專案和示範專案。

專案類型 功能與特色 與模擬器搭配使用
真實

真正的 Firebase 專案是您建立及設定的專案 (很有可能透過 Firebase 控制台進行)。

真實專案包含使用中的資源,例如資料庫執行個體、儲存空間值區、函式,或是您為該 Firebase 專案設定的任何其他資源。

使用實際的 Firebase 專案時,您可以針對任何或所有支援的產品執行模擬器。

針對並非您要模擬的任何產品,應用程式和程式碼會與即時資源 (資料庫執行個體、儲存空間值區、函式等) 互動。

示範

示範 Firebase 專案沒有實際的 Firebase 設定,也沒有即時資源。一般來說,您可以透過程式碼研究室或其他教學課程存取這些專案。

示範專案的專案 ID 含有 demo- 前置字串。

使用示範 Firebase 專案時,您的應用程式和程式碼「只會」與模擬器互動。如果應用程式嘗試與未執行模擬器的資源互動,該程式碼將會失敗。

建議您盡可能使用示範專案。Meet 具備以下優點:

  • 設定更簡單,因為您無須建立 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);
Swift
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web

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

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

Web

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 模擬器支援下列來源的背景觸發函式:

  • 即時資料庫模擬器
  • Cloud Firestore 模擬器
  • 驗證模擬器
  • Pub/Sub 模擬器

如要觸發背景事件,請使用模擬器套件 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
PLANET=Earth

AUDIENCE=人類

AUDIENCE=Dev Humans AUDIENCE=當地人

在本機環境中啟動時,模擬器會載入環境變數,如下所示:

  $ 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 殼層可用於互動式疊代函式原型設計和開發作業。殼層採用 Cloud Functions 模擬器,搭配 REPL 樣式的介面來進行開發作業。但不會與 Cloud Firestore 或即時資料庫模擬器整合。您可以使用殼層模擬資料並執行函式呼叫,模擬本機模擬器套件目前不支援的產品 (Analytics (分析)、遠端設定和 Crashlytics) 與產品的互動。
  • Cloud Functions 適用的 Firebase Test SDK,此為含有 mocha 架構的 Node.js,可用於開發函式。實際上,Cloud Functions Test SDK 在 Cloud Functions 殼層上方提供自動化功能。

如要進一步瞭解 Cloud Functions 殼層和 Cloud Functions 測試 SDK,請參閱互動式測試函式Cloud Functions 的單元測試

Cloud Functions 模擬器與實際工作環境之間的差異

就大多數用途而言,Cloud Functions 模擬器非常接近實際工作環境。我們致力確保節點執行階段中的所有項目都盡可能接近實際工作環境。不過,模擬器不會模擬完整的容器化實際工作環境,因此雖然函式程式碼可以實際執行,但環境的其他方面 (例如本機檔案、函式停止運作後的行為等) 會有所不同。

Cloud IAM

Firebase 模擬器套件不會試圖複製或尊重任何在執行時與 IAM 相關的行為。模擬器符合所提供的 Firebase 安全性規則,但在通常會使用 IAM 的情況下 (例如設定 Cloud Functions 叫用服務帳戶,因此權限),模擬器將無法設定,而且將使用開發人員機器上的全域可用帳戶,類似直接執行本機指令碼。

記憶體和處理器限制

模擬器不會強制執行函式的記憶體或處理器限制。不過,模擬器可以透過 timeoutSeconds 執行階段引數支援逾時函式。

請注意,在模擬器中執行函式時,函式執行時間可能與實際工作環境不同。使用模擬器設計並測試函式後,建議您在實際工作環境中執行有限的測試來確認執行時間。

規劃本機與實際工作環境的差異

由於模擬器是在本機電腦上執行,因此會因應用程式及內建程式和公用程式而異。

請注意,Cloud Functions 開發環境的本機環境可能與 Google 實際工作環境不同:

  • 在本機安裝來模擬實際工作環境的應用程式 (例如本教學課程的 ImageMagick) 可能會與實際工作環境的行為不同,尤其是您需要在非 Linux 環境中開發不同版本或開發時。建議您同時部署自己遺漏的程式的二進位檔副本,以及函式部署。

  • 同樣地,內建公用程式 (例如 lsmkdir 等殼層指令) 可能與實際工作環境中的可用版本不同,特別是在非 Linux 環境 (例如 macOS) 中進行開發時。如要處理這個問題,您可以使用僅限節點的替代方案取代原生指令,或是建構 Linux 二進位檔與部署作業搭配使用。

重試中

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

接下來呢?