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

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

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

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

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

Инструментируйте свое приложение для вызываемых функций

Если ваш прототип и тестовые действия включают вызываемые серверные функции , настройте взаимодействие с эмулятором Cloud Functions for Firebase следующим образом:

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Быстрый
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

Инструментируйте свое приложение для эмуляции функций HTTPS.

Каждая функция HTTPS в вашем коде будет обслуживаться из локального эмулятора с использованием следующего формата URL:

http:// $HOST : $PORT / $PROJECT / $REGION / $NAME

Например, простая функция helloWorld с портом хоста и регионом по умолчанию будет обслуживаться по адресу:

https://localhost:5001/ $PROJECT /us-central1/helloWorld

Инструментируйте свое приложение для эмуляции функций очереди задач.

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

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

Инструментируйте свое приложение для эмуляции функций, запускаемых в фоновом режиме.

Эмулятор Cloud Functions поддерживает фоновые функции из следующих источников:

  • Эмулятор Realtime Database
  • Эмулятор Cloud Firestore
  • Эмулятор Authentication
  • Эмулятор Pub/Sub
  • Эмулятор оповещений Firebase

Чтобы инициировать фоновые события, измените внутренние ресурсы с помощью Emulator Suite UI или подключив свое приложение или тестовый код к эмуляторам с помощью SDK для вашей платформы.

Тестовые обработчики пользовательских событий, создаваемых расширениями

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

Чтобы протестировать пользовательские обработчики событий для расширений, генерирующих события, необходимо установить эмуляторы Cloud Functions и Eventarc.

Среда выполнения Cloud Functions устанавливает для переменной среды EVENTARC_EMULATOR значение localhost:9299 в текущем процессе, если эмулятор Eventarc запущен. Firebase Admin SDK автоматически подключается к эмулятору Eventarc, когда установлена ​​переменная среды EVENTARC_EMULATOR . Вы можете изменить порт по умолчанию, как описано в разделе «Настройка Local Emulator Suite .

Если переменные среды настроены правильно, Firebase Admin SDK автоматически отправляет события в эмулятор Eventarc. В свою очередь, эмулятор Eventarc выполняет обратный вызов эмулятора Cloud Functions , чтобы активировать любые зарегистрированные обработчики.

Вы можете проверить журналы функций в Emulator Suite UI для получения подробной информации о выполнении обработчика.

Настройка локальной среды тестирования

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

При использовании локального эмулятора Cloud Functions вы можете переопределить переменные среды для своего проекта, настроив файл .env.local . Содержимое .env.local имеет приоритет над .env и файлом .env специфичным для проекта.

Например, проект может включать в себя эти три файла, содержащие немного разные значения для разработки и локального тестирования:

.env .env.dev .env.local
ПЛАНЕТА=Земля

АУДИТОРИЯ=Люди

АУДИТОРИЯ = Люди-разработчики АУДИТОРИЯ=Местные жители

При запуске в локальном контексте эмулятор загружает переменные среды, как показано:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Секреты и учетные данные в эмуляторе Cloud Functions

Эмулятор Cloud Functions поддерживает использование секретов для хранения и доступа к конфиденциальной информации о конфигурации . По умолчанию эмулятор попытается получить доступ к вашим производственным секретам, используя учетные данные приложения по умолчанию . В определенных ситуациях, например в средах CI, эмулятор может не получить доступ к секретным значениям из-за ограничений разрешений.

Подобно поддержке переменных среды эмулятором Cloud Functions , вы можете переопределить значения секретов, настроив файл .secret.local . Это упрощает локальное тестирование ваших функций, особенно если у вас нет доступа к секретному значению.

Какие еще инструменты для тестирования Cloud Functions существуют?

Эмулятор Cloud Functions дополнен другими инструментами прототипирования и тестирования:

  • Оболочка Cloud Functions, которая позволяет интерактивно итеративно создавать прототипы и разрабатывать функции. Для разработки оболочка использует эмулятор Cloud Functions с интерфейсом в стиле REPL. Интеграция с эмуляторами Cloud Firestore или Realtime Database не предусмотрена. Используя оболочку, вы имитируете данные и выполняете вызовы функций для имитации взаимодействия с продуктами, которые в настоящее время не поддерживаются Local Emulator Suite : Analytics, Remote Config и Crashlytics.
  • Firebase Test SDK для облачных фун��ций — платформа Node.js с mocha для разработки функций. По сути, SDK Cloud Functions Test SDK обеспечивает автоматизацию поверх оболочки Cloud Functions.

Дополнительную информацию об оболочке Cloud Functions и SDK Cloud Functions Test SDK можно найти в разделах Тестирование функций в интерактивном режиме и Модульное тестирование облачных функций .

Чем эмулятор Cloud Functions отличается от рабочей версии

Эмулятор Cloud Functions достаточно близок к производственной среде для большинства случаев использования. Мы проделали огромную работу, чтобы все в среде выполнения Node было максимально приближено к рабочему. Однако эмулятор не имитирует полную контейнерную производственную среду, поэтому, хотя код вашей функции будет выполняться реалистично, другие аспекты вашей среды (например, локальные файлы, поведение после сбоя функций и т. д.) будут отличаться.

Облачный IAM

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

Ограничения памяти и процессора

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

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

Планирование различий в локальной и производственной средах.

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

Имейте в виду, что ваша локальная среда для разработки Cloud Functions может отличаться от производственной среды Google:

  • Приложения, которые вы устанавливаете локально для имитации производственной среды (например, ImageMagick из этого руководства ), могут отличаться по поведению от производственных, особенно если вам требуются другие версии или вы разрабатываете в среде, отличной от Linux. Рассмотрите возможность развертывания собственной двоичной копии отсутствующей программы вместе с развертыванием функции.

  • Аналогично, встроенные утилиты (например, команды оболочки, такие как ls , mkdir ) могут отличаться от версий, доступных в рабочей среде, особенно если вы разрабатываете в среде, отличной от Linux (например, macOS). Эту проблему можно решить, используя альтернативы собственным командам, предназначенные только для Node, или создав двоичные файлы Linux для включения в ваше развертывание.

Повторная попытка

Эмулятор Cloud Functions не поддерживает повторную попытку выполнения функций в случае сбоя.

Что дальше?

,

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

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

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

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

Инструментируйте свое приложение для вызываемых функций

Если ваш прототип и тестовые действия включают вызываемые серверные функции , настройте взаимодействие с эмулятором Cloud Functions for Firebase следующим образом:

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Быстрый
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

Инструментируйте свое приложение для эмуляции функций HTTPS.

Каждая функция HTTPS в вашем коде будет обслуживаться из локального эмулятора с использованием следующего формата URL:

http:// $HOST : $PORT / $PROJECT / $REGION / $NAME

Например, простая функция helloWorld с портом хоста и регионом по умолчанию будет обслуживаться по адресу:

https://localhost:5001/ $PROJECT /us-central1/helloWorld

Инструментируйте свое приложение для эмуляции функций очереди задач.

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

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

Инструментируйте свое приложение для эмуляции функций, запускаемых в фоновом режиме.

Эмулятор Cloud Functions поддерживает фоновые функции из следующих источников:

  • Эмулятор Realtime Database
  • Эмулятор Cloud Firestore
  • Эмулятор Authentication
  • Эмулятор Pub/Sub
  • Эмулятор оповещений Firebase

Чтобы инициировать фоновые события, измените внутренние ресурсы с помощью Emulator Suite UI или подключив свое приложение или тестовый код к эмуляторам с помощью SDK для вашей платформы.

Тестовые обработчики пользовательских событий, создаваемых расширениями

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

Чтобы протестировать пользовательские обработчики событий для расширений, генерирующих события, необходимо установить эмуляторы Cloud Functions и Eventarc.

Среда выполнения Cloud Functions устанавливает для переменной среды EVENTARC_EMULATOR значение localhost:9299 в текущем процессе, если эмулятор Eventarc запущен. Firebase Admin SDK автоматически подключается к эмулятору Eventarc, когда установлена ​​переменная среды EVENTARC_EMULATOR . Вы можете изменить порт по умолчанию, как описано в разделе «Настройка Local Emulator Suite .

Если переменные среды настроены правильно, Firebase Admin SDK автоматически отправляет события в эмулятор Eventarc. В свою очередь, эмулятор Eventarc выполняет обратный вызов эмулятора Cloud Functions , чтобы активировать любые зарегистрированные обработчики.

Вы можете проверить журналы функций в Emulator Suite UI для получения подробной информации о выполнении обработчика.

Настройка локальной среды тестирования

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

При использовании локального эмулятора Cloud Functions вы можете переопределить переменные среды для своего проекта, настроив файл .env.local . Содержимое .env.local имеет приоритет над .env и файлом .env специфич��ым для проекта.

Например, проект может включать в себя эти три файла, содержащие немного разные значения для разработки и локального тестирования:

.env .env.dev .env.local
ПЛАНЕТА=Земля

АУДИТОРИЯ=Люди

АУДИТОРИЯ = Люди-разработчики АУДИТОРИЯ=Местные жители

При запуске в локальном контексте эмулятор загружает переменные среды, как показано:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Секреты и учетные данные в эмуляторе Cloud Functions

Эмулятор Cloud Functions поддерживает использование секретов для хранения и доступа к конфиденциальной информации о конфигурации . По умолчанию эмулятор попытается получить доступ к вашим производственным секретам, используя учетные данные приложения по умолчанию . В определенных ситуациях, например в средах CI, эмулятор может не получить доступ к секретным значениям из-за ограничений разрешений.

Аналогично поддержке переменных среды эмулятором Cloud Functions , вы можете переопределить значения секретов, настроив файл .secret.local . Это упрощает локальное тестирование ваших функций, особенно если у вас нет доступа к секретному значению.

Какие еще инструменты для тестирования Cloud Functions существуют?

Эмулятор Cloud Functions дополнен другими инструментами прототипирования и тестирования:

  • Оболочка Cloud Functions, которая позволяет интерактивно итеративно создавать прототипы и разрабатывать функции. Для разработки оболочка использует эмулятор Cloud Functions с интерфейсом в стиле REPL. Интеграция с эмуляторами Cloud Firestore или Realtime Database не предусмотрена. Используя оболочку, вы имитируете данные и выполняете вызовы функций для имитации взаимодействия с продуктами, которые в настоящее в��емя не поддерживаются Local Emulator Suite : Analytics, Remote Config и Crashlytics.
  • Firebase Test SDK для облачных функций — платформа Node.js с mocha для разработки функций. По сути, SDK Cloud Functions Test SDK обеспечивает автоматизацию поверх оболочки Cloud Functions.

Дополнительную информацию об оболочке Cloud Functions и SDK Cloud Functions Test SDK можно найти в разделах Тестирование функций в интерактивном режиме и Модульное тестирование облачных функций .

Чем эмулятор Cloud Functions отличается от рабочей версии

Эмулятор Cloud Functions достаточно близок к производственной среде для большинства случаев использования. Мы проделали огромную работу, чтобы все в среде выполнения Node было максимально приближено к рабочему. Однако эмулятор не имитирует полную контейнерную производственную среду, поэтому, хотя код вашей функции будет выполняться реалистично, другие аспекты вашей среды (например, локальные файлы, поведение после сбоя функций и т. д.) будут отличаться.

Облачный IAM

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

Ограничения памяти и процессора

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

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

Планирование различий в локальной и производственной средах.

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

Имейте в виду, что ваша локальная среда для разработки Cloud Functions может отличаться от производственной среды Google:

  • Приложения, которые вы устанавливаете локально для имитации производственной среды (например, ImageMagick из этого руководства ), могут отличаться по поведению от производственных, особенно если вам требуются другие версии или вы разрабатываете в среде, отличной от Linux. Рассмотрите возможность развертывания собственной двоичной копии отсутствующей программы вместе с развертыванием функции.

  • Аналогично, встроенные утилиты (например, команды оболочки, такие как ls , mkdir ) могут отличаться от версий, доступных в рабочей среде, особенно если вы разрабатываете в среде, отличной от Linux (например, macOS). Эту проблему можно решить, используя альтернативы собственным командам, предназначенные только для Node, или создав двоичные файлы Linux для включения в ваше развертывание.

Повторная попытка

Эмулятор Cloud Functions не поддерживает повторную попытку выполнения функций в случае сбоя.

Что дальше?