[日本語Alexa] TestFlowでスキルのテストを書いてみた

2018.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

TestFlowとは、Alexaスキルのコマンドラインテストツールです。マルチターンの会話をシミュレートし、簡潔でカラフルな出力を提供します。

Node.JSのVersion6以降で動作し、ローカル環境のみで使用するため、インターネットへの接続は必要ありません。(スキルが、その内部で外部リソースにアクセスする場合は、この限りではありません)

TestFlowは、特定のSDKに依存していないため、ASKのV1、V2の両方に対応している他、SDKを使用していないスキルもテストが可能です。

ちょっと試していませんが、コードを見ると、pyhonにも対応しているようです。

let SourceLang = 'javascript';
if (SourceCodeFile.slice(-2).toLowerCase()  === 'py') {
    SourceLang = 'python';
} else {
    MyLambdaFunction = require(SourceCodeFile); // Your Lambda source with exports.handler
}

大まかな仕組みとしては、概ね以下のとおりです。

  1. nodeで、testflow.jsというJavaScriptのプログラムを実行する
  2. testflow.jsは、指定された定義ファイル(dialog/default.txt)から1づつ実行するインテント及び、スロット値を読み込む
  3. 読み込まれたインテント及び、スロット値からパラメータを生成し、ターゲットスキルを起動(index.jsのハンドラを呼び出す)する
  4. スキルの戻ろ値をデコードして、ビジュアルに表示する
  5. 定義ファイルの最後まで、各行ごと2.3.4を繰り返す

2 テストしてみる

最初にテストしている様子です。こちらは、現在公開されている「ビンゴスキル」をテストしてみたものです。

参考:[日本語Alexa] Alexaスキル「ビンゴ大会」を公開しました。

https://www.amazon.co.jp/SAPPOROWORKS-%E3%83%93%E3%83%B3%E3%82%B4%E5%A4%A7%E4%BC%9A/dp/B07BT9KH5T

ビンゴスキルは、ASK-SDK V2を使用してTypeScriptで作成されているのですが、トランスパイルされたjsのコードをテスト対象にすることで、問題なくテストできています。

3 TestFlowのダウンロード

TestFlowは、GutHubからダウンロードできます。

$ git clone https://github.com/robm26/testflow

ダウンロードされた内容は、以下のとおりです。この中で、テスト実行に必要なのは、testflow.jsだけです。

/dialogs/ には、定義ファイルのサンプルがいくつか入っています。また、/tutorial/ の中の SETUP.md 及び、TUTORIAL.md には、セットアップ及びチュートリアルに関して詳しく紹介されいます。

4 テスト対象、定義ファイル、言語の指定

testflow.js は、コマンドラインから実行されるように設計された単一のNode.JSのスクリプトです。 このため、テスト対象、定義ファイル、言語の指定は、testflow.jsを直接編集することで設定します。

(1) テスト対象

ターゲットとなるスキルは、SourceCodeFileに、testflow.jsからの相対パスで指定します。また、ハンドラは、handlerNameに定義します。

const SourceCodeFile = './sampleskill/index.js';
const handlerName =  'handler'; //'lambda_handler'

(2) 定義ファイル

定義ファイルは、MyDialogに、testflow.jsからの相対パスで指定します。デフォルトでは、./dialogs/default.txtとなっていまが、ここを編集して変更することもできます。また /dialogs/ の階層下のファイル名をパラメータで指定することも出来るようになっています。

let MyDialog = './dialogs/default.txt';

if (process.argv[2]) {
    MyDialog = './dialogs/' + process.argv[2];
}

(3) 言語指定

言語設定はは、localeに指定します。

const locale = 'en-US';

5 定義ファイル

テストの内容は、テキストファイルに定義されます。1行に1つのリクエスト又は、インテントを入れます。

dialogs/default.txt

LaunchRequest
AMAZON.HelpIntent
AMAZON.StopIntent

インテント名に続けてスロットの値も指定できますが、スペースを含むスロット値は、エンコード(%20)する必要があります。インテントの前に?を付けると、スロット値の入力プロンプトが出せます。#は、コメントです。

dialogs/staterequest.txt

LaunchRequest
StateRequestIntent usstate=Vermont
StateRequestIntent usstate=New%20York
ISeeIntent animal=bear color=brown
# AMAZON.HelpIntent
AMAZON.StopIntent
MyNameIsIntent myName=
MyNameIsIntent myName=Madeline
? StateRequestIntent usstate=Texas
RecapIntent
AMAZON.StopIntent

6 出力のカスタマイズ

testflow.jsの中の、optionを編集することで、出力をカスタマイズすることが出来ます。

const options = {
    delay        : 1.0,   // 各行実行間のウエイト(N秒)
    speechOutput : true,  // Alexa側の発話を水色で表示する
    reprompt     : false, // ユーザーが応答しない場合の再送信
    attributes   : true,  // session.attributesをマゼンタで表示する
                          // ブール値の代わりに特定の1つの属性に注目することもできます
    slots        : true,  // key/value を青と緑で表示する
                          // エンティティ解決を、赤/赤で表示する
    requestEvent : false, // JSONがあなたのコードに送信したリクエスト
    cards        : false, // シンプルなカードのタイトルとテキストを表示する
    userId       : '123',  // ユーザーIDの最後の3文字を上書きする
    timestamp    : ''      // 2018-04-23T21:47:49Zのように時刻を設定できる(デフォルトは現在時間)
};

7 テスト実行

各種の設定が完了したら、コマンドラインから下記のようにテストを実行します。これにより、testflow.js内に指定されたターゲットが/dialogs/default.txtの定義に従ってテスト実行されます。

$ node testflow

default.txt以外の定義ファイル(dialogs/breakfast.txt)を指定する場合は、次のようになります。

$ node testflow breakfast.txt

8 VSCodeでの利用

今回は、VSCodeの中から使用してみたので、その状況を紹介させて下さい。

最初に、プロジェクトフォルダの中にTestFlowというフォルダを作成し、testflow.js及び、/dialogs/default.txt を配置しました。

続いて、launch.jsonにtestflowをキックする構成を追加します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "TestFlow",
            "program": "${workspaceFolder}/TestFlow/testflow.js",
            "cwd": "${workspaceFolder}/TestFlow"
        },
        // ・・・・略・・・・
    ]
}

これにより、デバックからテスト実行が可能になります。

9 最後に

今回は、コマンドラインから利用可能なテストツール(testflow)を試してみました。Alexaからのリクエストを生成してスキルを実行し、その出力を扱うことから、スキル自体はブラックボックスとして扱われています。このため、SDKやライブラリに依存すること無く、軽易にテストが可能です。

全てのインテントやスロットを一覧しておいて、簡単なハッピーパスのテストなどに使用すると、エンバグ防止に効果を発揮しそうです。

なお、テスト対象のスキルが、S3やDynamoDBなどのAWSサービスを使用している場合は、あらかじめ、AWS CLIから、利用できるように環境構築されている必要があります。

10 参考リンク


alexa/alexa-cookbook
TestFlow: Simulate Conversations with Your Alexa Skill Code to Ease Debugging