[日本語Alexa] TestFlowでスキルのテストを書いてみた
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 }
大まかな仕組みとしては、概ね以下のとおりです。
- nodeで、testflow.jsというJavaScriptのプログラムを実行する
- testflow.jsは、指定された定義ファイル(dialog/default.txt)から1づつ実行するインテント及び、スロット値を読み込む
- 読み込まれたインテント及び、スロット値からパラメータを生成し、ターゲットスキルを起動(index.jsのハンドラを呼び出す)する
- スキルの戻ろ値をデコードして、ビジュアルに表示する
- 定義ファイルの最後まで、各行ごと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