Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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

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

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

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

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

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

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

    Unix

    $ 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 . Например, при тестировании триггера аутентификации эмулируемая функция может вызвать 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 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

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

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 Callable вам необходимо предоставить соответствующие тестовые данные.

# 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:'bar'},
    // 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);

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

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

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