Catch up on highlights from Firebase at Google I/O 2023. Learn more

Интерактивное тестирование функций

Оболочка 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 Console.
  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
    

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

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

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

myFunctionName(data, options)

Параметр data требуется для триггеров базы данных реального времени, 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 в оболочке используется то же самое, что и для модуля 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

Вы можете вызвать функцию 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);

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

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

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