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

將應用程式連線至 Cloud Firestore 模擬器前,請務必瞭解整體 Firebase Local Emulator Suite 工作流程,並安裝及設定 Local Emulator Suite,並查看其 CLI 指令

選擇 Firebase 專案

Firebase Local Emulator Suite 會模擬單一 Firebase 專案的產品。

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

Local Emulator Suite 支援模擬實際 Firebase 專案和示範專案。

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

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

實際專案會有即時資源,例如資料庫執行個體、儲存空間桶、函式,或您為該 Firebase 專案設定的任何其他資源。

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

對於您未模擬的任何產品,應用程式和程式碼會與實際資源 (資料庫執行個體、儲存空間 bucket、函式等) 互動。

示範

示範 Firebase 專案沒有實際的 Firebase 設定,也沒有實際資源。這些專案通常是透過程式碼研究室或其他教學課程存取。

示範專案的專案 ID 會加上 demo- 前置字串。

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

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

  • 設定更簡單,因為您可以不必建立 Firebase 專案,即可執行模擬器
  • 安全性更高,因為如果程式碼不小心叫用未模擬的 (實際) 資源,就不會發生資料變更、使用和帳單問題
  • 提供更完善的離線支援功能,因為您不需要連上網際網路即可下載 SDK 設定。

檢測應用程式,讓其與模擬器通訊

啟動時,Cloud Firestore 模擬器會為 firebase.json 檔案中的每個 firestore 設定建立預設資料庫和命名資料庫。

系統也會在回應任何 SDK 或 REST API 對模擬器的呼叫時,隱含建立命名資料庫,以便參照特定資料庫。這類隱含建立的資料庫會以開放規則運作。

如要在 Emulator Suite UI 中以互動方式使用預設和命名資料庫,請在瀏覽器的網址列中更新網址,選取預設或命名資料庫。

  • 舉例來說,如要瀏覽預設執行個體中的資料,請將網址更新為 localhost:4000/firestore/default/data
  • 如要在名為 ecommerce 的執行個體中瀏覽,請更新為 localhost:4000/firestore/ecommerce/data

Android、Apple 平台和 Web SDK

請按照下列方式設定應用程式內設定或測試類別,以便與 Cloud Firestore 互動。請注意,在下列範例中,應用程式程式碼會連線至預設專案資料庫。如需預設資料庫以外的其他 Cloud Firestore 資料庫範例,請參閱多資料庫指南

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 firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

您不需要額外設定,即可使用模擬器測試由 Firestore 事件觸發的 Cloud Functions。當 Firestore 和 Cloud Functions 模擬器同時執行時,兩者會自動搭配運作。

Admin SDK

設定 FIRESTORE_EMULATOR_HOST 環境變數後,Firebase Admin SDK 會自動連線至 Cloud Firestore 模擬器:

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

如果程式碼在 Cloud Functions 模擬器中執行,系統會在呼叫 initializeApp 時自動設定專案 ID 和其他設定。

如果您希望 Admin SDK 程式碼連線至在其他環境中執行的共用模擬器,則需要指定使用 Firebase CLI 設定的專案 ID。您可以直接將專案 ID 傳遞至 initializeApp,或設定 GCLOUD_PROJECT 環境變數。

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
環境變數
export GCLOUD_PROJECT="your-project-id"

在測試之間清除資料庫

正式版 Firestore 並未提供用於清除資料庫的平台 SDK 方法,但 Firestore 模擬器會提供專門用於此用途的 REST 端點,您可以在測試開始前,從測試架構設定/tearDown 步驟、測試類別或殼層 (例如使用 curl) 叫用此端點。您可以使用這個方法,而非單純關閉模擬器程序。

在適當的方法中執行 HTTP DELETE 作業,將 Firebase 專案 ID (例如 firestore-emulator-example) 提供給下列端點:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

程式碼應等待 REST 確認資料沖洗是否完成或失敗。

您可以透過殼層執行這項作業:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

實作這類步驟後,您可以依序執行測試並觸發函式,確保在執行期間會清除舊資料,且您使用的是新的基準測試設定。

匯入及匯出資料

資料庫和 Cloud Storage for Firebase 模擬器可讓您從執行中的模擬器執行個體匯出資料。定義要在單元測試或持續整合工作流程中使用的基準資料集,然後匯出並在團隊中分享。

firebase emulators:export ./dir

在測試中,在模擬器啟動時匯入基準資料。

firebase emulators:start --import=./dir

您可以指示模擬器在關機時匯出資料,方法是指定匯出路徑,或直接使用傳遞至 --import 旗標的路徑。

firebase emulators:start --import=./dir --export-on-exit

這些資料匯入和匯出選項也適用於 firebase emulators:exec 指令。詳情請參閱模擬器指令參考資料

以視覺化方式查看安全性規則活動

在您進行原型設計和測試迴圈時,可以使用 Local Emulator Suite 提供的圖像化工具和報表。

使用要求監控工具

Cloud Firestore 模擬器可讓您在 Emulator Suite UI 中以視覺化方式呈現用戶端要求,包括 Firebase Security Rules 的評估追蹤記錄。

開啟「Firestore」>「要求」分頁標籤,即可查看每項要求的詳細評估順序。

Firestore 模擬器要求監控工具顯示安全性規則評估結果

以圖表呈現規則評估報表

將安全性規則新增至原型設計後,您可以使用 Local Emulator Suite 偵錯工具進行偵錯。

執行一系列測試後,您可以查看測試涵蓋率報表,瞭解每項安全性規則的評估方式。

如要取得報表,請在模擬器執行期間查詢公開的端點。如要使用瀏覽器友善版本,請使用下列網址:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

這會將規則分解為運算式和子運算式,您可以將滑鼠游標懸停在運算式上,取得更多資訊,包括評估次數和傳回的值。如要取得這項資料的原始 JSON 版本,請在查詢中加入下列網址:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

這裡的 HTML 版本報表會醒目顯示會擲回未定義和空值錯誤的評估項目:

Cloud Firestore 模擬器與實際環境的差異

Cloud Firestore Emulator 會忠實複製實際服務的行為,但有幾項明顯限制。

Cloud Firestore 支援多個資料庫

目前,Emulator Suite UI 僅支援針對預設資料庫進行互動式建立、編輯、刪除、要求監控和安全性視覺化,但不適用於其他命名資料庫。

不過,模擬器本身會根據 firebase.json 檔案中的設定,並在回應 SDK 或 REST API 呼叫時隱含地建立命名資料庫。

交易

模擬器目前並未實作實際工作環境中顯示的所有交易行為。當您測試涉及在單一文件中執行多個並行寫入作業的功能時,模擬器可能會緩慢完成寫入要求。在某些情況下,解除鎖定可能需要長達 30 秒的時間。視需要調整測試逾時時間。

索引

模擬器不會追蹤複合式索引,而是會執行任何有效的查詢。請務必針對實際的 Cloud Firestore 例項測試應用程式,以便判斷需要哪些索引。

限制

模擬器不會強制執行正式版中強制執行的所有限制。舉例來說,模擬器可能會允許交易,但實際工作環境服務會將其視為太大而拒絕。請務必熟悉說明文件中的限制,並在設計應用程式時主動避免超出限制。

後續步驟