見出し画像

アドベントカレンダー2023#07: Google Apps Script(GAS)とGoogleスプレッドシートを利用したスタブの作成

Fulfillmentで外部モジュールを呼び出すテストの準備

今日は、Google Apps Script(GAS)とGoogle スプレッドシートを用いて、Webhookを利用するシステム開発におけるスタブの作成をしました。作成目的やコードなど解説します。

スタブ作成の目的と機能

  1. スタブの役割: スタブは、実際の下位レイヤーのモジュール(例:外部API)の代わりを果たし、上位レイヤー(例:Dialogflow)のテストを可能にします。これにより、下位レイヤーが未完成の場合でも、上位レイヤーの機能検証が可能になります。

  2. スタブの具体的な機能:

    • 簡易レスポンスの提供: スタブは、予め定義されたレスポンスを返し、下位レイヤーの未完成時でも上位レイヤーのテストを支援します。

    • テストの単純化: スタブは、単純なレスポンスを返すことでテストを簡素化し、特定の機能やシナリオに焦点を当てることができます。

    • 開発プロセスの加速: スタブを使用することで、下位レイヤーの開発を待たずに、上位レイヤーの作業を進めることができる。

  3. スプレッドシートの利用: テストデータやWebhookリクエストのパラメータをスプレッドシートに格納し、テストが行いやすく、異なるシナリオの模倣が容易になります。

DialogflowとStabの関係

Fulfillmentから呼び出されるStab

Google Apps Scriptでのスタブ作成方法

  1. GASプロジェクトの設定: Google スプレッドシートから新しいスクリプトを作成し、Webhookエンドポイントを模倣するコードを記述します。

function doPost(e) {

  const REQUEST_SHEET_NAME = "request";
  const RESPONCE_DATA = "受け取りました";
  
  // 実行時間の取得
  var date = new Date();
  var formattedDate = Utilities.formatDate(date, "JST", " HH:mm:ss");

  // Webhookリクエストからデータを、シート(request)に記録する
  const REQUEST_SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(REQUEST_SHEET_NAME)
  REQUEST_SHEET.getRange("1:1").insertCells(SpreadsheetApp.Dimension.ROWS);
  REQUEST_SHEET.getRange(1, 1).setValue(formattedDate);
  REQUEST_SHEET.getRange(1, 2).setValue(e.postData.contents);
  REQUEST_SHEET.getRange(1, 3).setValue(e);

  // 上位レイヤのモジュールへの応答を模倣
  var response = {
    data: RESPONCE_DATA,
    meta: { status: 'success' }
  };
  return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);         

}

2.実行テスト(コマンドプロンプトによる実行確認)

C:\>curl -v -L -H "Content-Type: application/json" -d '{"Action":"予算実績取得","sales-period":"今月","sales-keyword":"売上予測"}' https://script.google.com/macros/s/(デプロイしたID)/exec

3.実行結果(一番新しいリクエストが、最上段に記録される)

スタブの利点(補足)

スタブの準備は、開発プロセスの効率化、リスク低減、そして製品品質の向上などの重要な利点をもたらしてくれます。

  • 早期問題発見: スタブを用いることで、システムの各部分の連携を早期に検証し、大きな問題の早期発見と修正が可能になります。

  • 並行開発の促進: スタブにより、依存モジュールの完成を待たずに特定のモジュールの開発やテストが進められます。

  • インターフェースの確認: スタブを用いることで、モジュール間のインターフェースの適切な設計を早期に検証し、問題の修正が可能になります。

  • テスト駆動開発(TDD)のサポート: スタブはTDDにおいて重要な役割を果たし、要件に基づいた開発を実現します。

  • リスクの低減と開発プロセスの加速: スタブを用いることで、特に大規模プロジェクトにおける統合リスクを早期に把握し、対処することができます。


この記事が気に入ったらサポートをしてみませんか?