开发 Alexa 技能时如何测试高级交互

How to test advanced interactions when developing an Alexa Skill

我正在开发 Alexa Skill,如果我以最佳方式设置所有内容以便在开发时进行调试,我有点难以理解。

现在我正在使用 Node.js 在本地进行开发,准备就绪后上传到云端,并在开发人员控制台的测试部分使用服务模拟器测试对意图的所有响应。 我发现这个过程有点慢但是工作...但是,我仍然有两个问题:

1)有没有办法避免上传到云端的过程?

最重要的是 2) 如何在控制台中测试高级交互,例如多步交互?例如,如何测试触发对意图的响应,然后要求用户确认 (Yes/No)?现在唯一的方法就是使用实际设备。

非常感谢任何改进

请寻找答案(倒序回答),

  1. 您可以使用模拟器 (echosim.io) 测试多个步骤,但每次您都必须按住麦克风按钮(或按住 space 栏)。举例来说,首先你要用 echosim 向 Alexa 询问一些事情,然后 alexa 回应确认'yes/no' 然后你必须再次按住麦克风按钮以回应确认。

  2. 您可以自动化 lambda 部署过程。请参阅 link, http://docs.aws.amazon.com/lambda/latest/dg/automating-deployment.html

最好编写完整的单元测试,以便您可以在上传 Lambda 之前测试您的逻辑。它还将有助于减少 Lambda 部署的数量

以下是我在本地测试多步交互的方式。

我正在使用名为 BSTAlexa 的第 3 方免费工具:
http://docs.bespoken.tools/en/latest/api/classes/bstalexa.html

它模仿亚马逊在接受请求、将它们提供给您的技能以及维护交互状态方面的作用。

所以我通过配置 BSTAAlexa 开始我的测试脚本 - 将它指向我的技能配置(例如意图)和我的技能的本地实例(在我的例子中我给它一个本地 URL ).

然后我向 BSTAAlexa 提供了一系列文本请求,并验证我是否得到了预期的响应。我把所有这些都放在了摩卡脚本中。

效果很好。

就像@Tom 建议的那样 - 查看 bespoken.tools 以在本地测试技能。

另外,Alexa Command Line Interface 是最近发布的,它有一些您可能会研究的命令行选项。

例如,'api invoke-skill' 命令允许您通过命令行(或脚本)在本地调用技能,因此您不必使用服务模拟器。像这样...

$ask api invoke-skill -s $SKILL_ID -f $JSON --endpoint-region $REGION --debug

这是我制作的介绍 ASK CLI 的快速视频。它没有专门介绍测试,但会提供快速介绍。

https://youtu.be/p-zlSdixCZ4

希望对您有所帮助。

编辑:有另一个本地测试的想法。如果您使用节点和 Lambda 函数,您可以从另一个本地 .js 文件调用 index.js 文件(示例:test.js)并传入事件数据和上下文。这是一个例子:

//path to the Lambda index.js file
var lambdaFunction = require('../lambda/custom/index.js');

// json representing the event - just copy from the service simulator
var event = require('./events/GetUpdateByName.json');

var context = {
  'succeed': function (data) {
      console.log(JSON.stringify(data, null,'\t') );

  },
  'fail': function (err) {
      console.log('context.fail occurred');
      console.log(JSON.stringify(err, null,'\t') );
  }
};

function callback(error, data) {
  if(error) {
      console.log('error: ' + error);
  } else {
      console.log(data);
  }
}

// call the lambda function
lambdaFunction.handler (event, context, callback);