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

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

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

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

  • Триггеры Cloud Firestore и Realtime Database уже имеют достаточные учетные данные и не требуют дополнительной настройки.
  • Для всех остальных API, включая API Firebase, такие как 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

Для функций PubSub вставьте полезную нагрузку сообщения в экземпляр 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);

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

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

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