JAICP

Тестирование


Это часть серии статей, посвященной созданию исходящего обзвона с использованием CAILA.

  1. Настройка подключения
  2. Разработка бота
  3. Запуск обзвона
  4. Аналитика по диалогам
  5. Расширение сценария
  6. Тестирование (вы находитесь здесь)

Завершим туториал проверкой работоспособности написанного сценария.

Автоматические тесты

При написании автоматических тестов следует учитывать ряд особенностей телефонных ботов:

  • Поведение $dialer.getPayload.
  • События, специфические для телефонного канала.
  • Воспроизведение аудио.

Основные ветки

Сперва добавьте в файл test.xml тест-кейсы на основные ветки прохождения диалога:

<test-case id="Есть симптомы">
  <q>/start</q>
  <a state="/Start"/>
  <a state="/Start"/>
  <a state="/Симптомы"/>
  <q>да</q>
  <a state="/Симптомы/Есть"/>
  <a state="/Прощание"/>
</test-case>

По аналогии самостоятельно напишите тест-кейс на случай, когда у клиента нет симптомов коронавирусной инфекции.


Строковые подстановки

Напишите тест-кейс на нераспознанный ответ клиента на вопрос о симптомах.

В тех местах, где в тегах a используются строковые подстановки, укажите фактическое ожидаемое имя клиента и полученный ответ на вопрос:

a: Приветствую вас, {{$session.userName}}!
a: Так и записала: {{$parseTree.text}}. Помните о гигиене и о средствах индивидуальной защиты.

Учитывайте, что в канале, отличном от телефонного, $dialer.getPayload всегда возвращает пустой объект. Из-за этого в данном тест-кейсе ожидается обращение не по имени.

<test-case id="Не распознано">
  <q>/start</q>
  <a>Приветствую вас, незнакомец!</a>
  <a state="/Start"/>
  <a state="/Симптомы"/>
  <q>все сложно</q>
  <a>Так и записала: все сложно. Помните о гигиене и о средствах индивидуальной защиты.</a>
  <a state="/Прощание"/>
</test-case>

Слот-филлинг

Обработку интентов со слот-филлингом также можно покрывать автоматическими тестами. Создайте для стейта /Перезвоните несколько тест-кейсов с проверкой различных вариантов обработки времени перезвона.

Воспользуйтесь тегом <state>, чтобы не дублировать в каждом тест-кейсе одинаковое начало диалога и таким образом сократить код:

<test-case id="Просьба перезвонить, первый раз время некорректно">
  <state>Симптомы</state>
  <q>позвоните позже</q>
  <a>Когда вам перезвонить?</a>
  <q>за завтраком</q>
  <a>Когда можно будет позвонить?</a>
  <q>в одиннадцать утра</q>
  <a state="/Перезвоните"/>
  <a state="/Прощание"/>
</test-case>

<test-case id="Просьба перезвонить, время корректно">
  <state>Симптомы</state>
  <q>извините не могу говорить</q>
  <a>Когда вам перезвонить?</a>
  <q>после шести</q>
  <a state="/Перезвоните"/>
  <a state="/Прощание"/>
</test-case>

<test-case id="Просьба перезвонить с указанием времени">
  <state>Симптомы</state>
  <q>перезвоните пожалуйста через час</q>
  <a state="/Перезвоните"/>
  <a state="/Прощание"/>
</test-case>

Нераспознанная речь

Начнем писать тест-кейс на стейт /NoInput.

Для начала проверьте, как обрабатывается отсутствие распознанной речи. Обратите внимание, что для эмуляции отправки события в сценарий используется тег <event>:

<test-case id="Плохое качество связи">
  <state>Симптомы</state>
  <event>speechNotRecognized</event>
  <a state="/NoInput"/>
</test-case>

Воспроизведение аудио

Продолжим предыдущий тест-кейс, чтобы протестировать воспроизведение аудио о проблемах со связью.

Чтобы проверить содержимое ответов с типом audio, нужно воспользоваться более гибким тегом <responseData>. Проверить им требуется только первый ответ, так как для второго — текстового — достаточно обычного тега <a>, поэтому укажите в атрибуте field первый элемент массива replies.

Полный тест-кейс может выглядеть так:

<test-case id="Плохое качество связи">
  <state>Симптомы</state>
  <event>speechNotRecognized</event>
  <a state="/NoInput"/>
  <event>speechNotRecognized</event>
  <a state="/NoInput"/>
  <event>speechNotRecognized</event>
  <responseData field="replies[0]">
    {
      "type": "audio",
      "audioUrl": "https://example.com/comms-issue.wav",
      "state": "/NoInput"
    }
  </responseData>
  <a state="/Прощание"/>
</test-case>

Подробнее о тестировании ответов с типом audio


Ручное тестирование

Вы можете запустить тестовый виджет и в текстовом режиме проверить работу сценария.

Специфические для телефонного канала возможности, такие как обработка события speechNotRecognized и обращение к методам $dialer, в таком случае недоступны.

Тестирование в виджете