Emulator Firebase Realtime Database

Emulator Realtime Database dimaksudkan untuk mempermudah penulisan pengujian unit yang memeriksa perilaku aturan keamanan database Anda.

Pada prinsipnya, seluruh aplikasi Anda dapat dijalankan terhadap emulator lokal dan bukan database produksi, tetapi ada beberapa masalah yang mungkin akan Anda hadapi. Secara khusus, integrasi dengan Firebase Auth akan rusak. Kami sedang berusaha menyempurnakan hal ini. Untuk saat ini, sebaiknya Anda mencoba menulis beberapa pengujian guna memastikan bahwa aturan keamanan berfungsi seperti yang diharapkan.

Ketika emulator dijalankan, database Anda akan "dikunci" dari perspektif keamanan (".read" dan ".write" salah). Sebelum melakukan penulisan, Anda harus menetapkan aturan keamanan. Anda dapat melakukannya langsung dari dalam framework pengujian unit menggunakan modul SDK pengujian. Lihat penjelasan selengkapnya di bawah.

Seperti biasa, kami sangat mengharapkan masukan Anda. Jika punya masukan, langsung saja beri tahu kami.

Perbedaan antara emulator dan produksi

  1. Anda tidak harus membuat instance database secara eksplisit. Emulator akan otomatis membuat instance database yang diakses.
  2. Setiap database baru dimulai dengan aturan tertutup, sehingga pengguna selain admin tidak dapat melakukan pembacaan atau penulisan.
  3. Setiap database yang telah teremulasi menerapkan batas dan kuota paket Spark (terutama, hal ini membatasi setiap instance untuk 100 koneksi serentak).
  4. Setiap database akan menerima string "owner" sebagai token autentikasi admin.
    1. Jika Anda ingin menggunakan REST API sebagai admin, sertakan header
      Authorization: Bearer owner.
    2. Anda dapat menggunakan ini untuk menetapkan aturan menggunakan curl. Dengan asumsi aturan Anda berada dalam file database.rules.json, berikut ini seharusnya berfungsi:
      curl -X PUT -H 'Authorization: Bearer owner' --data @database.rules.json http://localhost:9000/.settings/rules.json?ns=<name>
  5. Emulator database tidak memiliki interaksi yang berfungsi dengan produk Firebase lainnya. Secara khusus, alur autentikasi Firebase normal tidak akan berfungsi. Sebagai gantinya, kami telah menyediakan metode initializeTestApp() dalam modul pengujian, yang menempati kolom auth. Pengendali Firebase yang dibuat menggunakan metode ini akan berperilaku seolah-olah telah berhasil diautentikasi sebagai entity apa pun yang Anda berikan. Jika Anda meneruskan null, pengendali tersebut akan berperilaku sebagai pengguna tak terautentikasi (misalnya, aturan auth != null akan gagal).

Menginstal emulator

Untuk menginstal emulator Realtime Database, gunakan Firebase CLI dan ikuti langkah-langkah berikut.

  1. Untuk menginstal emulator Realtime Database: firebase setup:emulators:database
  2. Mulai emulator menggunakan perintah berikut. Emulator berjalan selama semua pengujian Anda. firebase serve --only database Perhatikan bahwa emulator Realtime Database memerlukan Java 8 atau yang lebih tinggi.

Berinteraksi dengan emulator

Instance Firebase Realtime Database normal dapat diakses di subdomain firebaseio.com, dan Anda dapat mengakses REST API seperti ini:

https://<database_name>.firebaseio.com/path/to/my/data.json

Emulator berjalan secara lokal, dan tersedia di localhost:9000. Untuk berinteraksi dengan instance database tertentu, Anda harus menggunakan parameter kueri untuk menentukan nama database.

http://localhost:9000/path/to/my/data.json?ns=<database_name>

Kami telah menyediakan modul @firebase/testing untuk mempermudah interaksi dengan emulator menggunakan Firebase SDK. Dengan modul @firebase/testing, Anda dapat berinteraksi dengan versi emulator Realtime Database yang berjalan secara lokal. Jika Anda mendapatkan error ECONNREFUSED atau waktu tunggu, periksa kembali apakah emulator sedang berjalan atau tidak.

Sebaiknya gunakan Node.js versi terbaru agar Anda dapat menggunakan notasi async/await. Hampir semua perilaku yang mungkin ingin Anda uji melibatkan fungsi asinkron, dan modul pengujian dirancang untuk digunakan dengan kode berbasis Promise.

Modul ini menampilkan metode berikut:

initializeTestApp({ databaseName: , auth: }) => FirebaseApp

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan dalam pegujian.

Menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan nama database dan penggantian variabel autentikasi yang ditentukan dalam pilihan. Harap diperhatikan bahwa ini TIDAK menggunakan databaseURL, karena tidak dijalankan terhadap server jarak jauh.

firebase.initializeTestApp({
  databaseName: "my-database",
  auth: { uid: "alice" }
});

initializeAdminApp({ databaseName: }) => FirebaseApp

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai admin guna menyiapkan status untuk pengujian.

Menampilkan aplikasi Firebase admin yang diinisialisasi sesuai dengan nama database yang ditentukan dalam pilihan. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan ke database.

firebase.initializeAdminApp({ databaseName: "my-database" });

loadDatabaseRules({ databaseName: , rules: }) => Promise

Gunakan metode ini untuk menetapkan aturan database Anda.

Mengirimkan aturan ke database yang berjalan secara lokal. Membawa objek pilihan yang menentukan "databaseName" dan "rules" Anda sebagai string.

firebase
      .loadDatabaseRules({
        databaseName: "my-database",
        rules: "{'rules': {'.read': false, '.write': false}}"
      });

apps() => [FirebaseApp]

Menampilkan semua pengujian yang saat ini diinisialisasi dan aplikasi admin.

Gunakan metode ini untuk menghapus data aplikasi di antara atau setelah pengujian (perhatikan bahwa aplikasi yang diinisialisasi dengan listener aktif membuat JavaScript tidak bisa keluar):

 Promise.all(firebase.apps().map(app => app.delete()))

assertFails(pr: Promise) => Promise

Menampilkan promise yang ditolak jika input berhasil, dan berhasil jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan database gagal:

firebase.assertFails(app.database().ref("secret").once("value"));

assertSucceeds(pr: Promise) => Promise

Menampilkan promise yang berhasil jika input berhasil, dan ditolak jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan database berhasil:

firebase.assertSucceeds(app.database().ref("public").once("value"));

Menghasilkan laporan pengujian

Setelah menjalankan serangkaian pengujian, Anda dapat mengakses laporan cakupan pengujian yang menunjukkan evaluasi dari setiap aturan keamanan Anda. Untuk mendapatkan laporan, buat kueri untuk endpoint yang terekspos pada emulator selagi endpoint ini berjalan. Untuk versi yang cocok dengan browser, gunakan URL berikut:

http://localhost:9000/.inspect/coverage?ns=<database_name>

URL ini memerinci aturan Anda ke dalam ekspresi dan subekspresi yang dapat Anda klik untuk mengetahui informasi lebih lanjut, termasuk jumlah eksekusi dan nilai yang ditampilkan. Untuk versi JSON mentah data ini, sertakan URL berikut dalam kueri Anda:

http://localhost:9000/.inspect/coverage.json?ns=<database_name>

Quickstart

Jika Anda hanya ingin mendapatkan contoh minimal yang berfungsi, cobalah quickstart JavaScript.

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.