Menguji Mode Datastore menggunakan emulator Firestore

Google Cloud CLI menyediakan emulator lokal dalam memori untuk Firestore yang dapat Anda gunakan untuk menguji Firestore dalam aplikasi mode Datastore. Anda dapat menggunakan emulator dengan semua library klien mode Datastore. Anda harus menggunakan emulator hanya untuk pengujian lokal.

Gunakan gcloud emulators firestore dengan --database-mode=datastore-mode untuk menguji perilaku Firestore dalam mode Datastore. Jangan gunakan emulator gcloud emulators datastore yang menggunakan perilaku Cloud Datastore lama.

Jangan gunakan emulator untuk deployment produksi. Karena hanya menyimpan data dalam memori, emulator tidak akan mempertahankan data di seluruh operasi.

Menginstal emulator

Untuk menginstal emulator Firestore, instal dan update gcloud CLI:

  1. Instal gcloud CLI.

  2. Update penginstalan gcloud CLI untuk mendapatkan fitur terbaru:

    gcloud components update
    

Menjalankan emulator

  1. Jalankan perintah berikut untuk memulai emulator:

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

    Emulator mencetak host dan nomor port tempatnya berjalan.

    Secara default, emulator akan mencoba menggunakan 127.0.0.1:8080. Untuk mengikat emulator ke host dan port tertentu, gunakan flag --host-port opsional, yang menggantikan HOST dan PORT:

    gcloud emulators firestore start --database-mode=datastore-mode --host-port=HOST:PORT
    
  2. Gunakan pintasan keyboard Control + C untuk menghentikan emulator.

Menghubungkan ke emulator

Untuk menghubungkan library klien dan aplikasi ke emulator, tetapkan variabel lingkungan DATASTORE_EMULATOR_HOST. Jika variabel lingkungan ini ditetapkan, library klien akan otomatis terhubung ke emulator.

export DATASTORE_EMULATOR_HOST="HOST:PORT"

Mengimpor entity ke emulator

Fitur impor emulator memungkinkan Anda memuat entity dari sekumpulan file ekspor entity ke emulator. File ekspor entity dapat berasal dari ekspor database mode Datastore Anda atau dari instance emulator.

Untuk mengimpor entity ke emulator, kirim permintaan impor POST ke emulator. Anda dapat menggunakan curl atau alat serupa. Misalnya, permintaan berikut akan mengimpor semua entity dari sekumpulan file ekspor entity ke emulator:

Protokol

curl -X POST http://localhost:8080/emulator/v1/projects/[PROJECT_ID]:import \
-H 'Content-Type: application/json' \
-d '{"database":"[DATABASE]", "export_directory":"[EXPORT_DIRECTORY]"}'
Ubah localhost:8080 jika emulator menggunakan port yang berbeda.

dengan:

  • [PROJECT_ID] adalah ID project Anda.
  • [DATABASE] adalah jalur database. Misalnya, project dengan database default akan terlihat seperti berikut:

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

  • [EXPORT_DIRECTORY] adalah jalur ke file overall_export_metadata file ekspor entity Anda. Contoh:

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

Mengekspor entity di emulator

Fitur ekspor emulator memungkinkan Anda menyimpan entity di emulator ke dalam sekumpulan file ekspor entity. Selanjutnya, Anda dapat menggunakan operasi impor untuk memuat entity dalam file ekspor entity ke database mode Datastore Anda atau ke instance emulator.

Untuk mengekspor entity dalam instance emulator, kirim permintaan ekspor POST ke emulator. Anda dapat menggunakan curl atau alat serupa. Misalnya, permintaan berikut akan mengekspor semua entity di emulator:

Protokol

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"}'
Ubah localhost:8080 jika emulator menggunakan port yang berbeda.

dengan:

  • [PROJECT_ID] adalah ID project Anda.
  • [DATABASE_PATH] adalah jalur database. Misalnya, project dengan database default akan terlihat seperti berikut:

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

  • [EXPORT_DIRECTORY] menentukan direktori tempat emulator menyimpan file ekspor entity. Direktori ini tidak boleh sudah berisi kumpulan file ekspor entity. Contoh:

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

Reset data emulator

Emulator Firestore menyertakan endpoint REST untuk mereset semua data di emulator. Anda dapat menggunakan endpoint ini untuk menghapus data di antara pengujian tanpa menonaktifkan emulator.

Untuk mereset semua data di emulator, lakukan operasi POST HTTP pada endpoint berikut, dengan mengganti HOST dan PORT dengan host dan port yang Anda pilih, serta mengganti PROJECT_ID dengan project ID Anda sendiri:

http://HOST:PORT/reset

Sesuaikan host dan port jika emulator tidak menggunakan 127.0.0.1:8080. Kode Anda akan menunggu konfirmasi REST bahwa reset selesai atau gagal.

Anda dapat menjalankan operasi ini dari shell menggunakan curl:

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

Perbedaan emulator dengan produksi

Emulator mencoba untuk mereplikasi perilaku layanan produksi secara setia dengan beberapa batasan penting.

Konkurensi dan konsistensi

Emulator hanya mendukung konkurensi pesimis dan konsistensi kuat. Emulator tidak mendukung setelan konkurensi optimistis dan konsistensi akhir.

Transaksi

Emulator tidak menerapkan semua perilaku transaksi yang terlihat dalam produksi. Saat Anda menguji fitur yang melibatkan beberapa penulisan serentak ke satu dokumen, emulator mungkin lambat untuk menyelesaikan permintaan tulis. Pada beberapa kasus, mungkin diperlukan hingga 30 detik hingga kunci dapat dilepas. Jika perlu, sesuaikan waktu tunggu pengujian.

Indeks

Emulator tidak melacak indeks komposit dan akan mengeksekusi kueri apa pun yang valid. Pastikan untuk menguji aplikasi Anda terhadap instance mode Datastore sungguhan untuk menentukan indeks yang diperlukan.

Batas

Emulator tidak menerapkan semua batasan yang diterapkan dalam layanan produksi. Misalnya, emulator dapat mengizinkan transaksi yang akan ditolak oleh layanan produksi karena terlalu besar. Pastikan Anda memahami batasan yang didokumentasikan dan mendesain aplikasi untuk menghindarinya secara proaktif.

Langkah selanjutnya