Тестируйте функции в интерактивном режиме

Оболочка 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 по умолчанию, чтобы они указывали на загруженный ключ:

    Юникс

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

    Окна

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

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

Обслуживание функций с помощью оболочки Cloud Functions

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

myFunctionName(data, options)

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

Вызов функций базы данных реального времени

При локальном запуске функций базы данных реального времени вам необходимо предоставить соответствующие тестовые данные. Обычно это означает предоставление новых тестовых данных для операций 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}})

По умолчанию оболочка запускает функции базы данных реального времени с правами администратора (служебной учетной записи). Используйте опцию 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'}})

Вызов функций аналитики

Вы можете вызвать функцию Analytics без каких-либо данных, запустив 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);

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

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

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

,

Оболочка 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 по умолчанию, чтобы они указывали на загруженный ключ:

    Юникс

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

    Окна

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

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

Обслуживание функций с помощью оболочки Cloud Functions

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

myFunctionName(data, options)

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

Вызов функций базы данных реального времени

При локальном запуске функций базы данных реального времени вам необходимо предоставить соответствующие тестовые данные. Обычно это означает предоставление новых тестовых данных для операций 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}})

По умолчанию оболочка запускает функции базы данных реального времени с правами администратора (служебной учетной записи). Используйте опцию 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'}})

Вызов функций аналитики

Вы можете вызвать функцию Analytics без каких-либо данных, запустив 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);

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

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

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