测试聊天机器人的新方法——Botfuel Dialog

玉幡竿
• 阅读 2334

文章作者:Maxime Khoy

原文链接:Writing integration tests for a Botfuel Dialog chatbot

编译:一熊翻译组 Mason

测试聊天机器人的新方法——Botfuel Dialog

前言:因为 Botfuel Dialog 聊天机器人是一个网络应用,你可以依靠它强大的编程功能,例如单元与集成测试,来测试你的机器人。

目标

在这篇教程中你可以学习如何使用 Jest 来测试你的聊天机器人,它是一个由 Facebook 开发的测试库。不过,你也可以使用其它测试库,例如 Mocha。

至于这篇教程的目标,是让你学习如何将机器人的手动测试自动化,以确保聊天机器人如期工作。

对于这篇教程,我们会从简单的样例机器人开始。请确保你已按照入门教程运行直至安装部分。

举个例子,初始的样例机器人会有如下的行为:

测试聊天机器人的新方法——Botfuel Dialog

让我们来写一个测试来确保这一简单功能的运转。

配置

首先,我们需要安装 Jest 作开发基础:

npm install --dev jest

一旦 Jest 安装完成,添加如下test脚本到你的package.json文件:

"scripts": {
  "start": "botfuel-run",
  "train": "botfuel-train",
  "test": "jest"
},

你可以通过npm test来运行 Jest。

为了在测试模式下运行聊天机器人,我们需要一个配置文件指出我们将用到的test适配器。用如下内容在根级别创建一个test-config.js文件:

module.exports = {
  adapter: 'test',
};

写测试

为了模拟人与机器人之间的对话,我们会使用Botplay方法。这种方法需要一组用户消息,其可以代表所有用户会发给聊天机器人的所有消息。对于用户来说,它可能是以下几种类型:

  • PostbackMessage (回执消息)
  • UserImageMessage (用户图片消息)
  • UserTextMessage (用户文本消息)

在我们的样例中,他们都是些简单的UserTextMessage

举个例子,模拟这段对话:

测试聊天机器人的新方法——Botfuel Dialog

我们会编写:

const bot = new Bot(config);
const userId = bot.adapter.userId;

await bot.play([
  new UserTextMessage('Hello'),
  new UserTextMessage('My name is Bob'),
]);

用户与机器人被捕捉的输出消息被储存进bot.adapter.log,所以我们可以编写以下程序来测试机器人是否如期响应:

expect(bot.adapter.log)
  .toEqual([
    new UserTextMessage('Hello'),
    new BotTextMessage('Hello human!'),
    new UserTextMessage('My name is Bob'),
    new BotTextMessage('Nice to meet you Bob!'),
  ]
    .map(msg => msg.toJson(userId))
  );

比较期望的与实际的输出,我们提供方便的toJson方法以便消息可以相比做原生的 JSON。这种方法需要userId作为一个参数,因为每个UserTextMessage都可以转化为 JSON 的形式,并以消息作者的分类储存在userId下。

这里,你同样也可以使用全部的消息类型。

让我们来写一下完整的测试样例吧!

在聊天机器人的跟级别构建一个tests库并在其中用如下内容创建一个hello.test.js文件:

const { Bot, BotTextMessage, UserTextMessage } = require('botfuel-dialog');
const config = require('../test-config');

test('answers greeting and name', async () => {
  const bot = new Bot(config);
  const userId = bot.adapter.userId;

  await bot.play([new UserTextMessage('Hello'), new UserTextMessage('My name is Bob')]);

  expect(bot.adapter.log).toEqual(
    [
      new UserTextMessage('Hello'),
      new BotTextMessage('Hello human!'),
      new UserTextMessage('My name is Bob'),
      new BotTextMessage('Nice to meet you Bob!'),
    ].map(msg => msg.toJson(userId)),
  );
});

运行测试前,先执行以下命令:

BOTFUEL_APP_TOKEN=<the BOTFUEL_APP_TOKEN> BOTFUEL_APP_ID=<the BOTFUEL_APP_ID> BOTFUEL_APP_KEY=<the BOTFUEL_APP_KEY> npm test

这里需要你的应用证书因为你的聊天机器人会调用 NLP API。

你会看到如下结果:

测试聊天机器人的新方法——Botfuel Dialog

到此为止,恭喜你,你已经成功地将一个聊天机器人的测试样例自动化!

一熊翻译组隶属于一熊科技,我们不生产科技杂文,我们只是 GFW 上语种间的搬运工,欢迎点击「一熊翻译组」来加入我们。主线产品「倍洽」日前迎来新版本上线,欲体验智能聊天机器人所带来的未来气息,与全新工作体验的无穷魅力,欢迎点击「倍洽」,从创建属于你的第一个团队开始……

测试聊天机器人的新方法——Botfuel Dialog

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
MBR笔记
<bochs:100000000000e\WGUI\Simclientsize(0,0)!stretchedsize(640,480)!<bochs:2b0x7c00<bochs:3c00000003740i\BIOS\$Revision:1.166$$Date:2006/08/1117