使用 Firestore 模擬器測試 Datastore 模式

Google Cloud CLI 提供 Firestore 的本機記憶體內模擬器,可用於測試 Firestore (Datastore 模式) 應用程式。您可以搭配所有 Datastore 模式用戶端程式庫使用模擬器。模擬器僅供本機測試使用。

使用 gcloud emulators firestore 搭配 --database-mode=datastore-mode 測試 Datastore 模式的 Firestore 行為。

請勿使用模擬器部署至正式環境。由於模擬器只會在記憶體中儲存資料,因此不會在執行期間保留資料。

安裝模擬器

如要安裝 Firestore 模擬器,請安裝及更新 gcloud CLI:

  1. 安裝 gcloud CLI

  2. 更新 gcloud CLI 安裝項目,取得最新功能:

    gcloud components update
    

執行模擬器

  1. 執行以下指令來啟用模擬器:

    gcloud emulators firestore start --database-mode=datastore-mode
    

    模擬器會顯示正在執行的主機和通訊埠編號。

    根據預設,模擬器會嘗試使用 127.0.0.1:8080。如要將模擬器繫結到特定主機和通訊埠,請使用選用的 --host-port 標記,並取代 HOSTPORT

    gcloud emulators firestore start --database-mode=datastore-mode --host-port=HOST:PORT
    
  2. 使用鍵盤快速鍵 Control + C 停止模擬器。

連線至模擬器

如要將用戶端程式庫和應用程式連線至模擬器,請設定 DATASTORE_EMULATOR_HOST 環境變數。設定這項環境變數後,用戶端程式庫會自動連線至模擬器。

export DATASTORE_EMULATOR_HOST="HOST:PORT"

將實體匯入模擬器中

模擬器的匯入功能可讓您從一組實體匯出檔案將實體載入到模擬器中。實體匯出檔案可以從您的 Datastore 模式資料庫匯出,也可以從模擬器執行個體匯出。

您可以透過兩種方式將實體匯入模擬器。第一種方法是在模擬器啟動指令中加入 import-data 標記。第二種方法是向模擬器傳送 POST 匯入要求。您可以使用 curl 或類似的工具。請參閱以下範例。

通訊協定

curl -X POST http://localhost:8080/emulator/v1/projects/PROJECT_ID:import \
-H 'Content-Type: application/json' \
-d '{"database":"DATABASE", "export_directory":"EXPORT_DIRECTORY"}'
如果模擬器使用不同的通訊埠,請修改 localhost:8080

CLI 旗標

gcloud emulators firestore start --database-mode=datastore-mode --import-data=EXPORT_DIRECTORY

其中:

  • [PROJECT_ID] 是專案的 ID。
  • [DATABASE] 是資料庫路徑。舉例來說,使用預設資料庫的專案會如下所示:

    {"database":"projects/myProject/databases/"}

  • [EXPORT_DIRECTORY] 是您實體匯出檔案中 overall_export_metadata 檔案的路徑。例如:

    {"export_directory":"/home/user/myexports/2024-03-26T19:39:33_443/2024-03-26T19:39:33_443.overall_export_metadata"}

在模擬器中匯出實體

模擬器的匯出功能可讓您將模擬器中的實體儲存為一組實體匯出檔案。之後您就可以使用匯入操作,將實體匯出檔案中的實體載入 Datastore 模式資料庫或模擬器執行個體中。

您可以透過兩種方式從模擬器匯出實體。第一種方法是在模擬器啟動指令中加入 export-on-exit 標記。第二種方法是向模擬器傳送 POST 匯出要求。您可以使用 curl 或類似的工具。請參閱以下範例。

通訊協定

curl -X POST http://localhost:8080/emulator/v1/projects/PROJECT_ID:export \
-H 'Content-Type: application/json' \
-d '{"database":"DATABASE_PATH", "export_directory":"EXPORT_DIRECTORY"}'
如果模擬器使用不同的通訊埠,請修改 localhost:8080

CLI 旗標

gcloud emulators firestore start --database-mode=datastore-mode --export-on-exit=EXPORT_DIRECTORY

其中:

  • [PROJECT_ID] 是專案的 ID。
  • [DATABASE_PATH] 是資料庫路徑。舉例來說,使用預設資料庫的專案會如下所示:

    {"database":"projects/myProject/databases/"}

  • [EXPORT_DIRECTORY] 會指定模擬器儲存實體匯出檔案的目錄。此目錄中不能已有一組實體匯出檔案。例如:

    {"export_directory":"/home/user/myexports/2024-03-26/"}

在模擬器中保存資料

根據預設,Firestore 模擬器不會將資料保留在磁碟上。如要保留模擬器資料,請執行下列指令,使用匯入和匯出旗標,在模擬器執行個體之間載入及儲存資料:

gcloud emulators firestore start --database-mode=datastore-mode --import-data=EXPORT_DIRECTORY --export-on-exit=EXPORT_DIRECTORY

重設模擬器資料

Firestore 模擬器包含 REST 端點,可重設模擬器中的所有資料。您可以使用這個端點清除測試之間的資料,不必關閉模擬器。

如要重設模擬器中的所有資料,請對下列端點執行 HTTP POST 作業,並將 HOSTPORT 分別替換成您選取的主機和連接埠,以及將 PROJECT_ID 替換成您自己的專案 ID:

http://HOST:PORT/reset

如果模擬器未使用 127.0.0.1:8080,請調整主機和通訊埠。 您的程式碼應等待 REST 確認重設完成或失敗。

您可以使用 curl 從殼層執行這項作業:

$ curl -X POST "http://HOST:PORT/reset"

模擬器與實際工作環境的差異

模擬器會盡可能忠實地複製正式版服務的行為,但仍有一些明顯限制。

並行與一致性

模擬器僅支援悲觀並行和強烈一致性。模擬器不支援樂觀並行和最終一致性設定。

交易

模擬器不會嘗試模擬實際環境中的交易行為。這個範例採用簡單的鎖定方法,並未嘗試模擬實際工作環境提供的各種並行模式。

測試涉及對單一文件進行多項並行寫入作業的功能時,模擬器可能需要較長時間才能完成寫入要求。模擬器最多可能需要 30 秒才能釋放鎖定。如需調整測試逾時間隔,請進行調整。

模擬器也不會嘗試模擬所有生產限制,例如涉及交易的逾時和大小限制。如果您測試的功能會受到這些正式版限制影響,建議使用正式版環境,而非模擬器。

索引

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

限制

模擬器不會強制執行正式環境中的所有限制。舉例來說,模擬器可能會允許交易,但實際工作環境服務會因交易過大而拒絕。請務必熟讀文件中的限制,並在設計應用程式時主動避開這些限制。

後續步驟