aws-lex - 使用 Node.js 对 Lex 机器人进行自动化测试
问题描述
我们正在使用 Amazon Lex 构建一个机器人。随着机器人的功能不断增长,我们需要一种方法来确保机器人在我们引入新更改时继续工作,但是手动执行此操作变得非常昂贵。我们无法在 Amazon Lex SDK 工具中找到为 Lex 机器人创建自动化测试的工具。是否有一些框架或工具可以帮助解决这个问题并与 Node.js 一起使用?
解决方案
我们面临同样的问题。环顾四周后,我认为构建一些简单的工具来为 Lex 运行自动化测试会更容易。请记住,此解决方案要求您首先在 Amazon Lex 中部署机器人,因此它不是创建单元测试,而更像是功能测试。
基本上我们所做的是创建一个像这样的简单库,它使用 Amazon SDK 向机器人发送文本:
let uuid = require('uuid/v4'),
aws = require('aws-sdk');
let config = {
awsAccount: process.env.AWS_ACCOUNT,
awsAccessKey: process.env.AWS_ACCESS_KEY_ID,
awsAccessKeySecret: process.env.AWS_SECRET_ACCESS_KEY,
awsRegion: process.env.AWS_DEFAULT_REGION,
botName: 'BotName',
botAlias: 'Dev'
};
let lex;
exports.config = config;
exports.initConfig = function() {
aws.config.update({
credentials: new aws.Credentials(config.awsAccessKey, config.awsAccessKeySecret),
region: config.awsRegion
});
lex = new aws.LexRuntime();
};
exports.speak = async function(userId, previousResponse, text) {
let res = await lex.postText({
botAlias: config.botAlias,
botName: config.botName,
inputText: text,
userId: userId,
requestAttributes: previousResponse ? previousResponse.requestAttributes : {},
sessionAttributes: previousResponse ? previousResponse.sessionAttributes : {}
}).promise();
return res;
};
exports.generateUserId = function() {
return uuid();
};
然后你可以使用像 Mocha 这样的工具来创建这样的测试:
let assert = require('chai').assert,
utils = require('./utils'); // this is the library above
utils.initConfig();
describe('your conversation name', function() {
it('conversation path 1', async function() {
let userId = utils.generateUserId();
let res = await utils.speak(userId, null, 'init message');
assert.equal(res.slots.slot1, 'val1'); // check slot value
assert.include(res.message, 'words included'); // check response from bot
res = await utils.speak(userId, res, 'send more messages');
assert.equal(res.slots.slot2, 'val2'); // check another slot value
assert.include(res.message, 'another words included'); // check response from bot
});
});
同样,这不是单元测试,而是功能测试。
注意:我之前看到此答案已被删除,因为它与另一个答案相同。我正在回答两个问题并混合了答案,但我已经更改了另一个答案,所以这是完全不同的。所以我再发一次。
推荐阅读
- php - 如何将 andWhere 和 orWhere 与 Doctrines Criteria 结合起来
- android-studio - 如果我们在 gradle.properties 中启用了 R8,我们是否需要在 build.gradle 中添加任何代码进行混淆?
- spring-cloud-dataflow - 春季云数据流http发布错误
- neo4j - Neo4j - 因果集群和 HA 集群之间的区别
- ios - Google 身份验证 - 用户代理在 WebView (Nylas api) 上给出错误
- google-chrome-devtools - 使用 Puppeteer 时是否可以关闭 devtool 状态?
- android - mpandroidchart y 轴的不同标签颜色
- python - 在文本文件中查找数据集的最大值和最小值;趣味拼图
- python - 函数调用返回结果连续次数
- javascript - 为什么可选的 0 宽度捕获组中的前瞻会阻止组匹配?