Как тестировать функции в интерактивном режиме

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

Как настроить учетные данные администратора (необязательно)

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

  • У триггеров Cloud Firestore и Realtime Database уже есть необходимые учетные данные, поэтому не требуется дополнительная настройка.
  • Для всех остальных API, в том числе Firebase API, таких как Authentication и FCM, или API Google, таких как Cloud Translation или Cloud Speech, необходимо выполнить описанные в этом разделе действия по настройке. Это относится к оболочке Cloud Functions и firebase emulators:start.

Чтобы настроить учетные данные администратора для эмулируемых функций:

  1. Откройте панель "Сервисные аккаунты" консоли Google Cloud.
  2. Убедитесь, что выбран App Engine сервисный аккаунт по умолчанию, и в меню параметров справа выберите Создать ключ.
  3. Когда появится запрос, выберите JSON в качестве типа ключа и нажмите Создать.
  4. Настройте учетные данные Google по умолчанию, чтобы они указывали на скачанный ключ:

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

После этого тесты функций смогут получать доступ к Firebase и API Google с помощью Admin SDK. Например, при тестировании триггера Authentication эмулируемая функция может вызывать admin.auth().getUserByEmail(email).

Как использовать оболочку Cloud Functions для запуска функций

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

myFunctionName(data, options)

Параметр data обязателен для триггеров Realtime Database, Cloud Firestore и PubSub и необязателен для всех остальных типов функций. Кроме того, необязательный параметр options действителен только для функций Realtime Database и Cloud Firestore.

При необходимости вы можете загрузить тестовые данные из локального файла, сохранив его как переменную и вызвав функцию с ней:

var data = require('./path/to/testData.json');
myFunction(data);

Как установить и настроить оболочку Cloud Functions

Для использования этой функции firebase-tools должна быть версии 3.11.0 или более поздней, а SDK firebase-functions – версии 0.6.2 или более поздней. Чтобы обновить оба файла, выполните следующие команды в каталоге functions/ для своего проекта:

npm install --save firebase-functions@latest
npm install -g firebase-tools

Если вы используете переменные конфигурации пользовательских функций, сначала выполните команду, чтобы получить специальную конфигурацию (запустите ее в каталоге functions) в локальной среде:

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

Наконец, запустите оболочку с помощью следующей команды:

firebase functions:shell

Вызов функций HTTPS

Чтобы вызвать функции HTTPS в оболочке, используйте модуль NPM request, но замените request названием функции, которую хотите эмулировать. Пример:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

Как вызывать вызываемые функции HTTPS

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

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

В качестве второго параметра можно передать Firebase-Instance-ID-token. Это должна быть строка.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

Эмуляция context.auth сейчас недоступна.

Как вызывать функции Realtime Database

При локальном запуске функций Realtime Database вам нужно будет предоставить подходящие тестовые данные. Как правило, это означает, что для операций onCreate нужно предоставить новые тестовые данные, для операций onDelete – старые или удаленные данные, а для функций onUpdate или onWrite – и те, и другие:

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

Помимо вариантов before/after оболочка предоставляет вариант params, который можно использовать для подстановочных знаков в пути:

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

По умолчанию оболочка запускает функции Realtime Database с правами администратора (сервисного аккаунта). Используйте параметр auth, чтобы запустить функции от имени определенного конечного пользователя или неаутентифицированного пользователя:

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

Как вызывать функции Firestore

При локальном запуске функций Firestore необходимо предоставить подходящие тестовые данные. Как правило, это означает, что для операций onCreate нужно предоставить новые тестовые данные, для операций onDelete – старые или удаленные данные, а для функций onUpdate или onWrite – и те, и другие. Обратите внимание, что данные Firestore должны быть представлены в виде пар "ключ-значение". Подробнее о поддерживаемых типах данных…

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

Помимо полей before/after объекта data, вы можете использовать поля params объекта options, чтобы имитировать подстановочные знаки в названии документа:

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

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

Как вызывать функции PubSub

Для функций Pub/Sub вставьте полезную нагрузку сообщения в экземпляр Buffer и при необходимости добавьте атрибуты данных, как показано ниже:

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

Как вызывать функции Аналитики

Вы можете вызвать функцию Аналитики без данных, выполнив команду myAnalyticsFunction() в оболочке. Чтобы запустить функцию с тестовыми данными, рекомендуем определить переменную для определенных полей данных о событиях, которые нужны вашей функции:

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

Вызов функций хранилища и аутентификации

Для функций хранения и аутентификации вызовите локальную функцию с тестовыми данными, которые вы хотите увидеть внутри функции. Тестовые данные должны соответствовать следующим форматам:

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