Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Mem-build pengujian unit

Emulator Firebase mempermudah Anda memvalidasi perilaku aplikasi sepenuhnya dan memverifikasi konfigurasi Aturan Keamanan Firebase. Gunakan Emulator Firebase untuk menjalankan dan mengotomatiskan pengujian unit di lingkungan lokal. Metode yang diuraikan pada dokumen ini akan membantu Anda dalam mem-build dan mengotomatiskan pengujian unit yang memvalidasi Aturan untuk aplikasi Anda.

Siapkan Firebase Emulator jika belum melakukannya.

Sebelum menjalankan emulator

Sebelum Anda mulai menggunakan emulator, perhatikan hal-hal berikut:

  • Pertama, emulator akan memuat aturan yang ditentukan dalam kolom firestore.rules atau 'storage.rules' pada file firebase.json Anda. Jika file tidak ada dan Anda tidak menggunakan metode loadFirestoreRules atau 'loadStorageRules' seperti yang dijelaskan di bawah, emulator akan memperlakukan semua project sebagai project yang memiliki aturan terbuka.
  • Meskipun sebagian besar Firebase SDK dapat langsung berfungsi dengan emulator, hanya library @firebase/rules-unit-testing yang mendukung pembuatan auth tiruan di Aturan Keamanan, sehingga mempermudah pengujian unit. Selain itu, library ini mendukung beberapa fitur khusus emulator seperti menghapus semua data, seperti yang tercantum di bawah ini.
  • Emulator juga akan menerima token Firebase Auth produksi yang disediakan melalui SDK Klien dan mengevaluasi aturan yang sesuai, agar aplikasi Anda dapat terhubung langsung ke emulator dalam integrasi dan pengujian manual.

Perbedaan antara emulator database dan produksi

  • Anda tidak harus membuat instance database secara eksplisit. Emulator akan otomatis membuat instance database yang diakses.
  • Setiap database baru dimulai dengan aturan tertutup, sehingga pengguna selain admin tidak dapat melakukan pembacaan atau penulisan.
  • Setiap database yang telah teremulasi menerapkan batas dan kuota paket Spark (terutama, hal ini membatasi setiap instance hingga 100 koneksi serentak).
  • Setiap database akan menerima string "owner" sebagai token autentikasi admin.
  • Emulator saat ini tidak memiliki interaksi yang berfungsi dengan produk Firebase lainnya. Secara khusus, alur Firebase Authentication normal tidak akan berfungsi. Sebagai gantinya, Anda dapat menggunakan metode initializeTestApp() di library rules-unit-testing, yang menggunakan kolom auth. Objek Firebase yang dibuat menggunakan metode ini akan berperilaku seolah-olah telah berhasil diautentikasi sebagai entity apa pun yang Anda berikan. Jika Anda meneruskan null, objek tersebut akan berperilaku sebagai pengguna yang tidak diautentikasi (misalnya, aturan auth != null akan gagal).

Menjalankan pengujian lokal

Gunakan modul @firebase/rules-unit-testing untuk berinteraksi dengan emulator yang berjalan secara lokal. Jika Anda menemukan error ECONNREFUSED atau waktu tunggu, periksa kembali apakah emulator sedang berjalan atau tidak.

Kami sangat menyarankan penggunaan 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.

Berinteraksi dengan emulator Realtime Database

Instance Firebase Realtime Database produksi 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 ns untuk menentukan nama database.

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

Metode Test SDK

Pilih produk untuk melihat metode yang digunakan oleh Firebase Test SDK untuk berinteraksi dengan emulator.

Cloud Firestore

Cloud Firestore

initializeTestApp({ projectId: string, auth: Object }) => FirebaseApp

Metode ini menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan project ID dan variabel autentikasi yang ditentukan pada opsi. Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan pada pengujian.

firebase.initializeTestApp({
  projectId: "my-test-project",
  auth: { uid: "alice", email: "alice@example.com" }
});

initializeAdminApp({ projectId: string }) => FirebaseApp

Metode ini menampilkan aplikasi Firebase admin yang diinisialisasi. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan. Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai admin guna menyiapkan status untuk pengujian.

firebase.initializeAdminApp({ projectId: "my-test-project" });
    

apps() => [FirebaseApp] Metode ini menampilkan semua pengujian dan aplikasi admin yang saat ini diinisialisasi. Gunakan metode ini untuk menghapus data aplikasi antar-pengujian atau setelah pengujian.

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

loadFirestoreRules({ projectId: string, rules: Object }) => Promise

Metode ini mengirim aturan ke database yang berjalan secara lokal. Diperlukan objek yang menentukan aturan sebagai string. Gunakan metode ini untuk menetapkan aturan database Anda.

firebase.loadFirestoreRules({
  projectId: "my-test-project",
  rules: fs.readFileSync("/path/to/firestore.rules", "utf8")
});
    

assertFails(pr: Promise) => Promise

Metode ini menampilkan promise yang ditolak jika input berhasil, atau promise yang berhasil jika input ditolak. Gunakan metode ini untuk menegaskan jika pembacaan atau penulisan database gagal.

firebase.assertFails(app.firestore().collection("private").doc("super-secret-document").get());
    

assertSucceeds(pr: Promise) => Promise

Metode ini menghasilkan promise yang berhasil jika input berhasil, dan promise yang ditolak jika input ditolak. Gunakan metode ini untuk menegaskan jika pembacaan atau penulisan database berhasil.

firebase.assertSucceeds(app.firestore().collection("public").doc("test-document").get());
    

clearFirestoreData({ projectId: string }) => Promise

Metode ini menghapus semua data yang terkait dengan project tertentu pada instance Firestore yang berjalan secara lokal. Gunakan metode ini untuk melakukan pembersihan setelah pengujian.

firebase.clearFirestoreData({
  projectId: "my-test-project"
});
   

Realtime Database

Realtime Database

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

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan pada pengujian.

Menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan nama database dan penggantian variabel autentikasi yang ditentukan dalam opsi.

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

initializeAdminApp({ databaseName: string }) => 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 opsi. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan ke database.

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

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

Gunakan metode ini untuk menetapkan aturan database Anda.

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

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

apps() => [FirebaseApp]

Menampilkan semua pengujian dan aplikasi admin yang saat ini diinisialisasi.

Gunakan metode ini untuk menghapus data aplikasi antar-pengujian atau setelah pengujian (perhatikan bahwa aplikasi yang diinisialisasi dengan pemroses 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 promise yang 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 promise yang ditolak jika input ditolak.

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

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

Cloud Storage

Cloud Storage

initializeTestApp({ storageBucket: string, auth: Object }) => FirebaseApp

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan pada pengujian.

Menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan nama bucket penyimpanan dan penggantian variabel autentikasi yang ditentukan dalam opsi.

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

initializeAdminApp({ storageBucket: string }) => 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 bucket penyimpanan yang ditentukan dalam opsi. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan ke bucket.

firebase.initializeAdminApp({ storageBucket: "my-bucket" });

loadStorageRules({ storageBucket: string, rules: Object }) => Promise

Gunakan metode ini untuk menetapkan aturan bucket penyimpanan Anda.

Mengirimkan aturan ke bucket penyimpanan yang dikelola secara lokal. Membawa objek opsi yang menentukan "storageBucket" dan "rules" Anda sebagai string.

firebase
      .loadStorageRules({
        storageBucket: "my-bucket",
        rules: fs.readFileSync("/path/to/storage.rules", "utf8")
      });

apps() => [FirebaseApp]

Menampilkan semua pengujian dan aplikasi admin yang saat ini diinisialisasi.

Gunakan metode ini untuk menghapus data aplikasi antar-pengujian atau setelah pengujian (perhatikan bahwa aplikasi yang diinisialisasi dengan pemroses 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 promise yang berhasil jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan bucket penyimpanan gagal:

firebase.assertFails(app.storage().ref("letters/private.doc").getMetadata());

assertSucceeds(pr: Promise) => Promise

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

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan bucket penyimpanan berhasil:

firebase.assertFails(app.storage().ref("images/cat.png").getMetadata());