Перед подключением приложения к эмулятору Cloud Firestore убедитесь, что вы понимаете общий рабочий процесс Firebase Local Emulator Suite , а также что вы установили и настроили Local Emulator Suite и ознакомились с его командами CLI .
Выберите проект Firebase
Firebase Local Emulator Suite эмулирует продукты для одного проекта Firebase.
Чтобы выбрать проект, перед запуском эмуляторов выполните в командной строке firebase use
в вашем рабочем каталоге. Или передайте флаг --project
каждой команде эмулятора.
Local Emulator Suite поддерживает эмуляцию реальных проектов Firebase и демонстрационных проектов.
Тип проекта | Функции | Использование с эмуляторами |
---|---|---|
Настоящий | Настоящий проект Firebase — это проект, который вы создали и настроили (скорее всего, через консоль Firebase ). Реальные проекты имеют активные ресурсы, такие как экземпляры базы данных, сегменты хранения, функции или любые другие ресурсы, которые вы настраиваете для этого проекта Firebase. | Работая с реальными проектами Firebase, вы можете запускать эмуляторы для любого или всех поддерживаемых продуктов. Для любых продуктов, которые вы не эмулируете, ваши приложения и код будут взаимодействовать с реальным ресурсом (экземпляром базы данных, контейнером хранилища, функцией и т. д.). |
Демо | Демонстрационный проект Firebase не имеет реальной конфигурации Firebase и активных ресурсов. Доступ к таким проектам обычно осуществляется через практическое руководство или другие обучающие материалы. Идентификаторы демонстрационных проектов имеют префикс | При работе с демонстрационными проектами 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 и веб-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
.
SDK администратора Node.js
admin.initializeApp({ projectId: "your-project-id" });
Переменная среды
export GCLOUD_PROJECT="your-project-id"
Очищайте базу данных между тестами
В производственном 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 > Запросы , чтобы просмотреть подробную последовательность оценки для каждого запроса.
Отчеты об оценках 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-версии отчета выделены оценки, которые выдают неопределенные ошибки и ошибки со значением NULL:
Чем эмулятор Cloud Firestore отличается от производства
Эмулятор Cloud Firestore пытается точно воспроизвести поведение производственной службы с некоторыми заметными ограничениями.
Поддержка нескольких баз данных для Cloud Firestore
В настоящее время Emulator Suite UI поддерживает интерактивное создание, редактирование, удаление, мониторинг запросов и визуализацию безопасности для базы данных по умолчанию, но не для дополнительных именованных баз данных.
Однако сам эмулятор создает именованную базу данных на основе конфигурации в файле firebase.json
и неявно в ответ на вызовы SDK или REST API.
Транзакции
В настоящее время эмулятор реализует не все транзакционные функции, наблюдаемые в рабочей среде. При тестировании функций, включающих несколько одновременных операций записи в один документ, эмулятор может медленно обрабатывать запросы на запись. В некоторых случаях снятие блокировок может занимать до 30 секунд. При необходимости рассмотрите возможность соответствующей корректировки времени ожидания теста.
Индексы
Эмулятор не отслеживает составные индексы и вместо этого выполняет любой допустимый запрос. Обязательно протестируйте приложение на реальном экземпляре Cloud Firestore , чтобы определить, какие индексы вам понадобятся.
Пределы
Эмулятор не обеспечивает соблюдение всех ограничений, установленных в рабочей среде. Например, эмулятор может разрешить транзакции, которые были бы отклонены рабочей службой как слишком большие. Убедитесь, что вы знакомы с документированными ограничениями и разрабатываете приложение так, чтобы заблаговременно их избегать.
Что дальше?
- Подборку видеороликов и подробные практические примеры смотрите в обучающем плейлисте по работе с эмуляторами Firebase .
- Изучите расширенные варианты использования, включающие тестирование правил безопасности и Firebase Test SDK: Test Security Rules (Firestore) .
- Поскольку запущенные функции представляют собой типичную интеграцию с Cloud Firestore , узнайте больше о Cloud Functions for Firebase в разделе Запуск функций локально .