TestMyBot - это среда автоматизации тестирования для вашего проекта чат-бота. Он лишен мнений и абсолютно не зависит от каких-либо задействованных инструментов разработки. Лучше всего то, что он бесплатный и с открытым исходным кодом.
TestMyBot теперь доступен на Github.

Требования
TestMyBot в значительной степени полагается на Docker, чтобы предоставить свои выдающиеся возможности в автоматизации тестирования. Ваш чат-бот полностью перенесен в локальный контейнер докеров, и API-макеты возможны, манипулируя DNS образа докера. TestMyBot открывает канал для веб-перехватчика вашего чат-бота и отвечает на запросы ваших чат-ботов к API обмена сообщениями, предоставляя все необходимое для ваших тестовых спецификаций.
Поэтому сначала установите Docker на свои машины разработки.
Текущие требования к вашему чат-боту:
- Разработан на Node.js (поддерживаются другие языки, но требуется больше усилий по настройке)
- Разработано на платформе Facebook Messenger.
- Facebook Webhook должен прослушивать все интерфейсы (слушайте 0.0.0.0)
- Принимать самоподписанные SSL-сертификаты (для Node.js переменная среды NODE_TLS_REJECT_UNAUTHORIZED автоматически устанавливается в 0 с помощью TestMyBot)
- Проверка запроса должна быть отключена (для Botkit: validate_requests должно быть установлено в false)
Установка
Обычно вы не устанавливаете этот проект самостоятельно, но вы включаете его в свои проекты чат-ботов.
Чтобы установить его в проект чат-бота, введите:
$ npm install testmybot --save-dev
$ npm install testmybot-fbmock --save-dev
Обратите внимание, что вы должны установить его в локальном каталоге разработки (а не в глобальном реестре с параметром -g).
Основное использование
Вы можете найти несколько примеров проектов чат-ботов с элементарными тестами здесь и здесь.
С Жасмин настройка выглядит так:
$ npm install testmybot --save-dev
$ npm install testmybot-fbmock --save-dev
$ npm install jasmine --save-dev
$ ./node_modules/.bin/jasmine init
Добавьте файл с именем testmybot.json в каталог вашего проекта. Очень простая конфигурация, которая требуется всегда:
{
"docker": {
"container": {
"testmybot-fbmock": {
"env": {
"TESTMYBOT_FACEBOOK_WEBHOOKPORT": 5000,
"TESTMYBOT_FACEBOOK_WEBHOOKPATH": "webhook"
}
}
}
}
}
Вы сообщаете TestMyBot, что Facebook Webhook вашего чат-бота работает на порту 5000, а путь URL - / webhook. Вам не нужно указывать имя хоста, потому что он будет работать в контейнере докера с фиксированным именем хоста («testmybot»).
Добавьте файл spec / testmybot.spec.js с базовым тестовым примером:
describe('TestMyBot Sample Conversation Test Suite', function() { var bot = require('testmybot');beforeAll(function(done) { bot.beforeAll().then(done); }, 120000);beforeEach(function(done) { bot.beforeEach().then(done); }, 60000);afterEach(function(done) { bot.afterEach().then(done); }, 60000);afterAll(function(done) { bot.afterAll().then(done); }, 60000);it('should answer to hello', function(done) {bot.hears('hello');bot.says().then((msg) => { expect(msg.messageText).toMatch(/echo/); done(); }).catch((err) => { throw new Error(err); }); });it('should send a generic payload', function(done) {bot.hears('Generic');bot.says().then((msg) => { expect(msg.message.attachment.type).toEqual('template'); expect(msg.message.attachment.payload.template_type).toEqual('generic'); done(); }).catch((err) => { throw new Error(err); }); }); });
Обратите особое внимание на:
- Все тесты асинхронные
- Установка и завершение работы имеют большие таймауты, поскольку сборка, запуск и остановка контейнеров Docker может занять некоторое время. Это займет очень много времени, особенно при первом запуске. Впоследствии кеш Docker ускоряет работу.
- TestMyBot использует обещания Bluebird
В вашем package.json определите сценарий для TestMyBot с именем start_testmybot, который запускается в контейнере Docker.
...
"scripts": {
"start_testmybot": "node index.js",
},
...
Здесь вы можете передать переменные среды своему чат-боту. И, наконец, запустите тесты с Жасмин:
$ ./node_modules/.bin/jasmine init
Вы увидите какой-то вывод Docker, и, в конце концов, ваши тесты Jasmine должны быть успешными (конечно).
Конфигурация
Для построения конфигурации есть три шага:
- ./node_modules/testmybot/testmybot.default.json
- ./testmybot.default
- Параметр config в методе beforeAll
Последующие шаги перезаписывают параметры конфигурации из предыдущих шагов. Файлы .json преобразуются в простой объект в Node.js. Вот некоторые настройки, которые вам, возможно, придется адаптировать к вашей среде (но в большинстве случаев настройки по умолчанию будут работать нормально).
См. Справочные значения в ./node_modules/testmybot/testmybot.default.json.
API
testmybot.beforeAll (config) - создает сеть и контейнеры Docker из вашей конфигурации.
- config (необязательно) - вы можете передать необязательный аргумент конфигурации (объединенный с другой конфигурацией)
- возвращает обещание синей птицы
testmybot.afterAll () - удаляет сеть и контейнеры Docker.
- возвращает обещание синей птицы
testmybot.beforeEach () - запускает контейнеры Docker и ожидает подключения
- возвращает обещание синей птицы
testmybot.afterEach () - останавливает контейнеры Docker.
- возвращает обещание синей птицы
testmybot.hears (msg, channelId) - отправить текст (или структурированный контент) вашему чат-боту.
- msg - текст или структурированное содержимое
- channelId (необязательно) - канал для отправки сообщения (в Facebook: «отправитель» / «получатель» или идентификатор профиля пользователя). Вы можете имитировать параллельные разговоры с несколькими пользователями
testmybot.says (channelId, timeoutMillis) - получать текст (или структурированный контент) от вашего чат-бота.
- channelId (необязательно) - получать для этого канала (или идентификатора профиля пользователя)
- timeoutMillis (необязательно) - тайм-аут при отсутствии получения (по умолчанию: 5000)
- возвращает обещание bluebird, которое преобразуется в полученное сообщение.
Вот пример полученного сообщения. Он содержит (для краткости) текст сообщения (если применимо), полное исходное сообщение (в «orig») и тело сообщения (в «message)». Для структурированных сообщений нет messageText.
{
"orig": {
"recipient": {
"id":4440090943
},
"message": {
"text": "Text received, echo: hello"
}
},
"messageText": "Text received, echo: hello",
"message": {
"text": "Text received, echo: hello"
},
"channelId": 4440090943
}
Перспективы
Этой библиотеке предстоит пройти долгий путь.
- Поддержка чат-ботов Slack
- Поддержка чат-ботов Wechat
- Поддержка чат-ботов Microsoft Bot Framework
- Поддержка Python Chtabots
- Определите тестовые случаи по стенограммам разговора
- Выполняйте тесты в реальной среде с настоящими конечными точками
Ищем авторов
Как и все проекты с открытым исходным кодом, TestMyBot будет становиться лучше и полезнее, чем больше людей будут готовы внести свой вклад. Пожалуйста, присоединяйтесь к проекту Github, чтобы продвигать этот проект дальше.