アドベントカレンダー2023#07: Google Apps Script(GAS)とGoogleスプレッドシートを利用したスタブの作成
Fulfillmentで外部モジュールを呼び出すテストの準備
今日は、Google Apps Script(GAS)とGoogle スプレッドシートを用いて、Webhookを利用するシステム開発におけるスタブの作成をしました。作成目的やコードなど解説します。
スタブ作成の目的と機能
スタブの役割: スタブは、実際の下位レイヤーのモジュール(例:外部API)の代わりを果たし、上位レイヤー(例:Dialogflow)のテストを可能にします。これにより、下位レイヤーが未完成の場合でも、上位レイヤーの機能検証が可能になります。
スタブの具体的な機能:
簡易レスポンスの提供: スタブは、予め定義されたレスポンスを返し、下位レイヤーの未完成時でも上位レイヤーのテストを支援します。
テストの単純化: スタブは、単純なレスポンスを返すことでテストを簡素化し、特定の機能やシナリオに焦点を当てることができます。
開発プロセスの加速: スタブを使用することで、下位レイヤーの開発を待たずに、上位レイヤーの作業を進めることができる。
スプレッドシートの利用: テストデータやWebhookリクエストのパラメータをスプレッドシートに格納し、テストが行いやすく、異なるシナリオの模倣が容易になります。
DialogflowとStabの関係
Google Apps Scriptでのスタブ作成方法
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において重要な役割を果たし、要件に基づいた開発を実現します。
リスクの低減と開発プロセスの加速: スタブを用いることで、特に大規模プロジェクトにおける統合リスクを早期に把握し、対処することができます。