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

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

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

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

Мы рекомендуем вам использовать демо-проекты везде, где это возможно. Преимущества включают:

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

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

При запуске эмулятор Cloud Firestore создает базу данных по умолчанию и именованную базу данных для каждой конфигурации firestore в файле firebase.json .

Именованные базы данных также создаются неявно в ответ на любые вызовы SDK или REST API к эмулятору, которые ссылаются на определенную базу данных. Такие неявно созданные базы данных работают с открытыми правилами .

Для интерактивной работы с базами данных по умолчанию и именованными базами данных в Emulator Suite UI обновите URL-адрес в адресной строке браузера, чтобы выбрать либо базу данных по умолчанию, либо именованную базу данных.

  • Например, чтобы просмотреть данные в экземпляре по умолчанию, обновите URL-адрес на localhost:4000/firestore/default/data
  • Для просмотра экземпляра с именем ecommerce обновите его до localhost:4000/firestore/ecommerce/data .

Платформы Android, Apple и Web SDK

Настройте конфигурацию вашего приложения или тестовые классы для взаимодействия с Cloud Firestore следующим образом. Обратите внимание, что в следующих примерах код приложения подключается к базе данных проекта по умолчанию. Примеры, включающие дополнительные базы данных Cloud Firestore за пределами базы данных по умолчанию, см. в руководстве для нескольких баз данных .

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Быстрый
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

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

Admin SDK s

Firebase Admin SDK автоматически подключается к эмулятору Cloud Firestore , если задана переменная среды FIRESTORE_EMULATOR_HOST :

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

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

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

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

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

Production Firestore не предоставляет метода SDK платформы для очистки базы данных, но эмулятор Firestore предоставляет вам конечную точку REST специально для этой цели, которую можно вызвать из шага настройки/удаления тестовой среды, из тестового класса или из оболочки (например, с помощью curl ) перед запуском теста. Вы можете использовать этот подход в качестве альтернативы простому завершению процесса эмулятора.

В соответствующем методе выполните операцию HTTP DELETE, указав свой идентификатор проекта Firebase, например firestore-emulator-example , в следующей конечной точке:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

Естественно, ваш код должен ожидать подтверждения REST о том, что сброс завершен или не удался.

Эту операцию можно выполнить из оболочки:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

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

Импорт и экспорт данных

База данных и 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 .

Используйте монитор запросов

Эмулятор Cloud Firestore позволяет визуализировать клиентские запросы в Emulator Suite UI , включая трассировку оценки для Firebase Security Rules .

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

Монитор запросов эмулятора Firestore, показывающий оценки правил безопасности

Отчеты об оценке Visualize Rules

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

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

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

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

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

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

Ниже в HTML-версии отчета выделены оценки, которые выдают неопределенные и нулевые ошибки:

Чем эмулятор Cloud Firestore отличается от производства

Эмулятор Cloud Firestore пытается точно воспроизвести поведение производственной службы с некоторыми заметными ограничениями.

Поддержка нескольких баз данных для Cloud Firestore

В настоящее время Emulator Suite UI поддерживает интерактивное создание, редактирование, удаление, мониторинг запросов и визуализацию безопасности для базы данных по умолчанию, но не для дополнительных именованных баз данных.

Однако сам эмулятор создает именованную базу данных на основе конфигурации в файле firebase.json и неявно в ответ на вызовы SDK или REST API.

Транзакции

В настоящее время эмулятор не реализует все транзакционное поведение, наблюдаемое в производстве. При тестировании функций, включающих несколько одновременных записей в один документ, эмулятор может медленно выполнять запросы на запись. В некоторых случаях для снятия блокировок может потребоваться до 30 секунд. При необходимости рассмотрите возможность соответствующей корректировки тестовых тайм-аутов.

Индексы

Эмулятор не отслеживает составные индексы, а вместо этого выполняет любой допустимый запрос. Обязательно протестируйте свое приложение на реальном экземпляре Cloud Firestore , чтобы определить, какие индексы вам понадобятся.

Пределы

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

Что дальше?