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, чтобы продвигать этот проект дальше.