関数をインタラクティブにテストする

Cloud Functions shell は、テストデータを使用して関数を呼び出すための対話型 shell です。このシェルはあらゆる種類のトリガーに対応しています。

管理者の認証情報を設定する(省略可)

関数のテストにおいて、Firebase Admin SDK を介して Google API や他の Firebase API とやり取りするには、管理者の認証情報を設定しなければならない場合があります。

  • Cloud Firestore と Realtime Database のトリガーにはすでに十分な認証情報があるため、追加の設定は必要ありません
  • Firebase API(Authentication や FCM など)、Google API(Cloud Translation や Cloud Speech など)といった他のすべての API では、このセクションで説明する設定手順が必要です。これは、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
    

上記の手順を完了すると、関数テストで Admin SDK を使用して Firebase API や Google API にアクセスできるようになります。たとえば、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 以降と firebase-functions SDK のバージョン 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 を 2 番目のパラメータとして渡すことができます。これには文字列を設定する必要があります。

# 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 のデータは Key-Value ペアである必要があります。サポートされるデータ型を参照してください。

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

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

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

data オブジェクトの before/after フィールドだけでなく、options オブジェクトの params フィールドを使用すると、ドキュメント名のワイルドカードをシミュレートできます。

# 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 関数の場合は、関数の内部に表示するテストデータを使用してローカル関数を呼び出します。テストデータは、次に示す対応するデータ形式に従う必要があります。

コードに必要なフィールドのみを指定するか、関数の実行だけを行う場合はフィールドを指定しないでください。