"いつもどおりで行きましょう。"そんなときは思い切って行動しましょう。よるテストコードそして、本題のテストコードは次の通り。expect(response.prompt()).toContain("元気だして。});});ポイント(1)VirtualAlexaのインスタンス生成インスタンス生成時に、テスト対象のスキルのLambda関数と対話モデルのJSONを読み込ませています。get-modelコマンドで取得できるJSONをそのままファイルに保存したものです。ポイント(2)スロットのないサンプル発話のテストまずはスロットを含まないフレーズのテスト。VirtualAlexa#utterメソッドでテストできます。そこからresponse.prompt()でoutputSpeechなどを取り出して内容をチェックすることでテストできます。ポイント(3)スロットを含むサンプル発話のテスト次に、スロットを含む発話のテスト。VirtualAlexa#intendメソッドにインテント名とスロットの値を設定してテストします。responseからoutputSpeechを取り出して期待するセリフが入っているかを確認します。スロットの値を取り出すのではなく、スロットの値に設定されたIDを取り出して処理を分岐させていたというところ。テストではIDは渡さず、スロットの値として"絶好調"という文字列を渡しています。インスタンス生成時に対話モデルを読み込んでいるので、VirtualAlexaがスロットとIDの対応がわかっておりテストが可能になっています。ポイント(4)スロットのシノニムによるテストスロットの値としてシノニムの文字列を与えた場合もちゃんとテストできます。これも、VirtualAlexaが対話モデルを元にリクエストを生成してくれているからテストできるのだとわかります。ポイント(5)カスタムスロットにない値のテストカスタムスロットに定義していない言葉をスロット値として渡すと、当然ながらIDとの対応が取れずもう一度聞き直す流れとなりますが、それもテストできます。その他filter1つ前のやり取りを受けて、返答を変えるなど、ステートフルな実装が必要になるケースがあります。セッション属性の値に応じて応答を変更するには、VirtualALexa#intentなどリクエストを発生させるメソッドを実行する前にセッション属性の値を設定したくなります。filterメソッドで設定すれば可能となります。virtual-alexaのインスタンスを生成した後、filterメソッドにリクエストを書き換えるコールバック関数を渡します。その中でセッション属性を設定すれば、セッション属性に応じたハンドラの動作をテストできます。次の様に、beforeEachなどでfilterメソッドを呼びます。filterに渡したコールバック関数が実行されるので注意が必要です。DynamoDBのモックVirtualAlexaにはDynamoDBのモックも含まれています。VirtualAlexaのインスタンスを生成した後、alexa.dynamoDB().mock()を実行することでモックされるようになります。不具合だと思うのだけど、次のように環境変数にAWSのリージョンを設定しておかないと接続時にエラーとなりました。setupFilesをjest.jsonに追加してテストの初期化時に設定しています。BeforeEachで作ればDBの状態に応じた挙動のテストも可能です。Displayインタフェース関連のテストVirtualAlexaはDisplayインタフェース特有の実装のテストにも対応しています。次の様にすると、リクエストにDisplayインタフェースサポートが追加されます。後は、intendやutterでリクエストを実行すれば、Dipslayインタフェースサポートされている場合のテストを行えます。ListTemplateやアクションリンクを実装すると、Display.ElementSelectedリクエストを受ける必要がありますが、そのテストもサポートしています。次のようにselectElementを実行するとDisplay.ElementSelectedリクエストがハンドラに送られます。引数にはtokenの値を渡します。バグを追う際の強い味方になってくれます。実機テストも重要VirtualAlexaを使えば、Alexaスキルをテストドリブンに開発しやすく、捗ります。テストできるのは次の2点に過ぎません。対話モデルが仕様どおり定義されているか否かその対話モデルに対応するLambda関数がプログラムとして意図した入力に対し意図した出力をするかどうか。これらの前段にあるAlexaがユーザの発話を意図通り聞き取り、適切なインテントにルーティングするかはテストできません。現状では、思ったように聞き取ってくれなかったり、別のインテントにリクエストを送ってきたりすることは往々にして起こります。実機テストしておくのが安心です。Alexaがしゃべるセリフの区切りやイントネーションに違和感を感じることもあります。実機での動作確認を通してそれらを検出し次の対応が必要になります。サンプル発話を増やすAlexaが聞き取りやすい発話にユーザを誘導するAlexaに喋らせる言い回しを変更する。使えば、Alexaスキル用のLambda関数をローカルで簡単に実行できます。Jestと組み合わせて使えば自動テストが実装できます。対話モデルも含めたテストが可能です。DynamoDBを使うスキルもモックでテストが可能です。テストドリブン開発大好き!というエンジニアを募集しています。12:00VirtualAlexaによるテストドリブンなAlexaスキル開発Tweet関連記事2019-07-03TypescriptのGASをJestでテストするmorishitaです。時々、業務で使うツールをGASで作ります。Consoleでホストする。簡単だった!morishitaです。以前、次のエントリを書きました。よる決済フォームの実装morishitaです。serviceをwebhookに変更したmorishitaです。2つの賞をいただきました!morishitaです。(9)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。