在將您的應用程式連接到 Cloud Functions 模擬器之前,請確保您了解 Firebase 本機模擬器套件的整體工作流程,並安裝和設定本機模擬器套件並查看其CLI 命令。
選擇 Firebase 項目
Firebase 本機模擬器套件模擬單一 Firebase 專案的產品。
若要選擇要使用的項目,請在啟動模擬器之前,在 CLI 中在工作目錄中執行firebase use
。或者,您可以將--project
標誌傳遞給每個模擬器指令。
本機模擬器套件支援模擬真實的Firebase 專案和演示專案。
項目類型 | 特徵 | 與模擬器一起使用 |
---|---|---|
真實的 | 真正的 Firebase 專案是您建立和配置的專案(很可能透過 Firebase 控制台)。 真實專案具有即時資源,例如資料庫執行個體、儲存桶、函數或您為該 Firebase 專案設定的任何其他資源。 | 在處理真實的 Firebase 專案時,您可以為任何或所有受支援的產品運行模擬器。 對於您未模擬的任何產品,您的應用程式和程式碼將與即時資源(資料庫執行個體、儲存桶、函數等)進行互動。 |
示範 | 示範 Firebase 專案沒有真正的Firebase 配置,也沒有即時資源。這些項目通常透過代碼實驗室或其他教程存取。 示範項目的項目 ID 具有 | 使用示範 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 命令,如
ls
、mkdir
)可能與生產中可用的版本不同,特別是如果您在非 Linux 環境(例如 macOS)中進行開發。您可以透過使用僅 Node 的替代本機命令或建置 Linux 二進位檔案以與您的部署捆綁來解決此問題。
重試
Cloud Functions 模擬器不支援在失敗時重試函數。
接下來是什麼?
- 如需一組精選影片和詳細操作範例,請關注Firebase 模擬器訓練播放清單。
- 若要詳細了解 Cloud Functions for Firebase 模擬器,請參閱本機運行函數。