Подключите свое приложение к эмулятору Realtime Database.

Прежде чем подключать приложение к эмулятору Realtime Database, убедитесь, что вы понимаете общий рабочий процесс 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 вы можете запускать эмуляторы для любого или всех поддерживаемых продуктов.

Для всех продуктов, которые вы не эмулируете, ваши приложения и код будут взаимодействовать с активным ресурсом (экземпляром базы данных, сегментом хранилища, функцией и т. д.).

Демонстрация

В демонстрационном проекте Firebase нет реальной конфигурации Firebase и активных ресурсов. Доступ к таким проектам обычно предоставляется через практические работы или другие учебные материалы.

Идентификаторы демопроектов имеют префикс demo-.

При работе с демонстрационными проектами Firebase ваши приложения и код взаимодействуют только с эмуляторами. Если приложение попытается взаимодействовать с ресурсом, для которого не запущен эмулятор, код не сработает.

Рекомендуем по возможности использовать демопроекты. Преимущества подписки на Google One включают:

  • Простая настройка, поскольку вы можете запускать эмуляторы, не создавая проект Firebase.
  • Повышенная безопасность. Если ваш код случайно вызовет неэмулированные (рабочие) ресурсы, данные не будут изменены, а плата за использование не будет взиматься.
  • Улучшенная поддержка офлайн-режима, поскольку для скачивания конфигурации SDK не требуется доступ к интернету.

Как настроить приложение для взаимодействия с эмуляторами

SDK для Android, платформ Apple и веб-приложений

Настройте конфигурацию в приложении или тестовые классы для взаимодействия с Realtime Database, как описано ниже.

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val database = Firebase.database
database.useEmulator("10.0.2.2", 9000)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.useEmulator("10.0.2.2", 9000);
Swift
    // In almost all cases the ns (namespace) is your project ID.
let db = Database.database(url:"http://127.0.0.1:9000?ns=YOUR_DATABASE_NAMESPACE")
Unity
// Connects to the RTDB Emulator running on port 9000.
// Note: You may need to append your namespace: "?ns=YOUR_PROJECT_ID"
FirebaseDatabase database = FirebaseDatabase.GetInstance("http://127.0.0.1:9000");

Web

import { getDatabase, connectDatabaseEmulator } from "firebase/database";

const db = getDatabase();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  connectDatabaseEmulator(db, "127.0.0.1", 9000);
} 

Web

var db = firebase.database();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  db.useEmulator("127.0.0.1", 9000);
} 

Для тестирования функций Cloud Functions, активируемых событиями Realtime Database, с помощью эмулятора дополнительная настройка не требуется. Когда эмуляторы Realtime Database и Cloud Functions запущены, они автоматически работают вместе.

Admin SDK сек.

Firebase Admin SDK автоматически подключается к эмулятору Realtime Database, когда задана переменная среды FIREBASE_DATABASE_EMULATOR_HOST:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Если ваш код выполняется в эмуляторе Cloud Functions, идентификатор проекта и другие параметры будут автоматически заданы при вызове initializeApp.

Если вы хотите, чтобы код Admin SDK подключался к общему эмулятору, работающему в другой среде, вам нужно будет указать тот же идентификатор проекта, который вы задали с помощью интерфейса командной строки Firebase. Вы можете передать идентификатор проекта напрямую в initializeApp или задать переменную среды GCLOUD_PROJECT.

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
Переменная среды
export GCLOUD_PROJECT="your-project-id"

Очищайте базу данных между тестами

Чтобы очистить Realtime Database между действиями, можно удалить ссылку на базу данных. Этот подход можно использовать в качестве альтернативы простому завершению процесса эмулятора.

Kotlin
// With a DatabaseReference, write null to clear the database.
database.reference.setValue(null)
Java
// With a DatabaseReference, write null to clear the database.
database.getReference().setValue(null);
Swift
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

Web

import { getDatabase, ref, set } from "firebase/database";

// With a database Reference, write null to clear the database.
const db = getDatabase();
set(ref(db), null);

Web

// With a database Reference, write null to clear the database.
firebase.database().ref().set(null);

Естественно, ваш код должен ожидать подтверждения того, что очистка завершена или не удалась, используя функции асинхронной обработки событий вашей платформы.

Реализовав такой шаг, вы можете упорядочить тесты и запустить функции с уверенностью, что старые данные будут удалены между запусками и вы используете новую базовую конфигурацию теста.

Как импортировать и экспортировать данные

Эмуляторы базы данных и 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.

Визуализация оценок правил

Добавляя правила безопасности в прототип, вы можете отлаживать их с помощью инструментов Local Emulator Suite.

После выполнения набора тестов вы можете посмотреть отчеты о покрытии тестами, в которых показано, как оценивалось каждое из ваших правил. Чтобы получить отчеты, отправьте запрос к конечной точке эмулятора, пока он работает. Чтобы открыть версию для браузера, перейдите по следующему URL:

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

Правила будут разбиты на выражения и подвыражения. Наведите на них указатель мыши, чтобы увидеть дополнительную информацию, в том числе количество выполнений и возвращенные значения. Чтобы получить эти данные в формате JSON, добавьте в запрос следующий URL:

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

Что дальше?