Тестирование
Это часть серии статей, посвященной созданию исходящего обзвона с использованием NLU.
- Настройка подключения
- Разработка бота
- Запуск обзвона
- Аналитика по диалогам
- Расширение сценария
- Тестирование (вы находитесь здесь)
Завершим туториал проверкой работоспособности написанного сценария.
Автоматические тесты
При написании автоматических тестов следует учитывать ряд особенностей телефонных ботов:
- Поведение
$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
, в таком случае недоступны.