Firebase関数ユニットテスト


サーバー運営をfirebaseとして行い、firebase公式ドキュメントを整理したいです.

クラウド機能ユニットテスト


このページでは、지속적 통합(CI)시스템에 포함될 테스트に関する推奨事項とツール、例えば함수용 단위 테스트 작성について説明します.Firebaseはクラウド機能にFirebase Test SDKを提供し、テストしやすい.firebase-functions-testとしてnpmに配備され、firebase-functionsの同期テストSDKです.クラウド機能のFirebase Test SDKを使用すると、次のことができます.
  • firebase-機能に必要な환경 변수를 설정 및 설정 해제のように、適切なテスト設定と無効化を処理します.
  • SDKは샘플 데이터이벤트 컨텍스트를 생성なので、テストに関するフィールドを指定するだけです.
  • テスト設定


    関数フォルダで、次のコマンドを実行してfirebase-functions-testとテストフレームMochaをインストールします.
    npm install --save-dev firebase-functions-test
    npm install --save-dev mocha
    次に、関数フォルダにtestフォルダを作成し、テストコードの新しいファイルを作成し、index.test.jsと同じ名前を指定します.
    最後はfunctions/pacakageです.jsonを変更して、次の内容を追加します.
    "scripts": {
      "test": "mocha --reporter spec"
    }
    テストを作成すると、npm testを関数ディレクトリで実行してテストを実行できます.

    初期化クラウド機能のFirebase Test SDK

    firebase-functions-testを使用するには、次の2つの方法があります.

  • オンラインモード(推奨):テスト専用のFirebaseプロジェクトと対話して、実際にデータベースの書き込み、ユーザーの作成などの操作を行い、テストコードを使用して結果を確認するテストを作成します.つまり、関数で使用される他のGoogle SDKも正常に動作します.

  • オフラインモード:副作用なしで独立したオフライン単位テストを作成します.これは、データベースの書き込みやユーザーの作成など、Firebase製品と対話するすべてのメソッド呼び出しがルート処理される必要があることを意味します.クラウドリカバリまたはリアルタイムデータベース関数があると、テストコードの複雑さが大幅に増加するため、オフラインモードは一般的に推奨されません.
  • オンラインモードでのSDKの初期化(推奨)


    テストプロジェクトとインタラクティブなテストを作成するには、firebase-adminでアプリケーションを初期化するために必要なプロジェクト構成値とサービスアカウントキーファイルのパスを指定する必要があります.
    Firebaseプロジェクトの構成値を取得するには、次の手順に従います.
  • Firebaseコンソールでプロジェクト設定を開きます.
  • 私のアプリケーションから目的のアプリケーションを選択します.
  • の右側のペインで、AppleとAndroidアプリケーションのプロファイルをダウンロードするオプションを選択します.
  • 鍵ファイルを作成する方法は次のとおりです.
  • Google Cloudコンソールのサービスアカウントウィンドウを開きます.
  • アプリケーション・エンジンのデフォルト・サービス・アカウントを選択し、右側のオプション・メニューを使用してキーを作成します.
  • メッセージが表示された場合は、鍵タイプとしてJSONを選択し、「作成」をクリックします.
  • 鍵ファイルを保存した後、SDKを以下のように初期化します.
    const test = require('firebase-functions-test')({
      databaseURL: 'https://my-project.firebaseio.com',
      storageBucket: 'my-project.appspot.com',
      projectId: 'my-project',  
    }, 'path/to/serviceAccountKey.json');

    オフラインモードでのSDKの初期化


    完全オフラインテストを作成するには、パラメータなしでSDKを初期化します.
    // At the top of test/index.test.js
    const test = require('firebase-functions-test')();

    シミュレーション構成値


    関数コードでfunctions.config()を使用すると、構成値をシミュレートできます.たとえば、functions/index.jsに次のコードが含まれている場合.
    const functions = require('firebase-functions');
    const key = functions.config().stripe.key;
    次に、テストファイルの値を次のようにシミュレートできます.
    // Mock functions config values
    test.mockConfig({ stripe: { key: '23wr42ewr34' }});

    関数のインポート


    関数をインポートするには、requireを使用してデフォルトの関数ファイルをモジュールにインポートします.インポートできるのはfirebase-functions-testを初期化し、処理構成値をシミュレートした後のみです.
    // after firebase-functions-test has been initialized.
    const myFunctions = require('../index.js');	// relative path to functions code
    オフラインモードでfirebase-functions-testを初期化し、関数コードにadminを追加します.InitializeApp()がある場合は、関数をインポートする前にスタブを処理する必要があります.
    // If index.js calls admin.initializeApp at the top of the file.
    // we need to stub it out before requiring index.js. This is because the
    // functions will be executed as a part of the require process.
    // Here we stub admin.initializeApp to be a dummy function that doesn't do anything
    adminInitStub = sinon.stub(admin, 'initializeApp');
    // Now we can require index.js and save the exports inside a namespace called myFunctions.
    myFunctions = require('../index.js');

    HTTPではなくバックグラウンド関数のテスト


    HTTP以外の関数をテストするには、次の手順に従います.
  • test.wrapメソッドでテストする関数をパッケージします.
  • テストデータを構成します.
  • 作成された関数を呼び出します.
  • で構成されたテストデータと、指定するイベントコンテキストフィールドが含まれます.
  • アクションのプレゼンテーションを作成します.
  • まず、テストする関数をカプセル化します.functions/index.jsにmakeUppercaseというテスト関数があるとします.functions/test/index.test.jsでは、次のコードを記述します.
    const myFunctions = require('../index.js');
    const wrpped = test.wrap(myFunctions.makeUppercase);
    wrappedは呼び出し時にmakeUppercaseを呼び出す関数です.wrappedは2つのパラメータを使用します.
  • データ(必須):makeUppercaseに送信するデータ.作成した関数ハンドラは、渡された最初のパラメータに直接対応します.Firebase-functions-testは、基準データまたはサンプルデータを構成する方法を提供します.
  • EventContextOptions(オプション):指定するイベントコンテキストのフィールド.イベントコンテキストは、作成した関数ハンドラに送信される2番目のパラメータです.wrappedを呼び出すと、イベントコンテキストはeventContextOptionsパラメータを含まない適切なフィールドとして作成されます.この指定後、生成されたフィールドの一部を再定義できます.再定義するフィールドのみを含める必要があります.再定義されていないすべてのフィールドが作成されます.