使用 Node.js 对 Lex 机器人进行自动化测试

Automated tests for Lex bot using Node.js

我们正在使用 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
    });
});

同样,这不是单元测试,而是功能测试。

注意:我看到这个答案之前被删除了,因为它与另一个答案相同。我在回答两个问题并混合了答案,但我已经更改了另一个答案,所以这是完全不同的。所以我再发一次。

Botium 提供 automated testing for chatbots, and Amazon Lex is one of the supported platforms. Botium Core is Open Source and available on Github - it lets you run automated testing with several CLI tools and Javascript test runners (see Botium Bindings)。 Botium Box 提供了一个漂亮的用户界面和一整套测试聊天机器人所需的所有东西 - 提供社区版。