Протестировать свой сценарий можно следующими способами:
- Онлайн * с помощью приложения Салют или собственного устройства;
- Офлайн * в виде локального тестирования.
Тестирование онлайн
Протестировать сценарий можно через приложение Салют или собственное устройство. Для этого:
Локально запустите смартап с помощью команды:
python3 manage.py run_app
Передайте в интернет порт сервера. Значение по умолчанию * 8000. При отсутствии внешнего IP-адреса можно использовать специальные сервисы. Ниже представлен пример получения IP через Ngrok:
Зарегистрируйте аккаунт на ngrok для получения токена.
Скачайте и распакуйте бинарный файл для своей системы — ngrok.
Запустите ngrok:
./ngrok http 8000
Перейдите в свой смартап через Studio и укажите в поле "Настройки вебхука" https адрес, который был получен в результате выполнения предыдущего пункта. Сохраните изменения.
Убедитесь, что вы заходите в Studio по тому же Сбер ID, что и на устройстве, с которого хотите протестировать свой сценарий.
Скажите ассистенту: «Запусти <имя вашего смартапа>».
Если все шаги выполнены верно, то после голосовой команды запустится сценарий run_app
.
Тестирование офлайн
Смартап можно протестировать локально с помощью встроенного нормализатора. Для этого запустите смартап для локального тестирования с помощью команды:
python3 manage.py local_testing
В запущенной консоли можно:
- просматривать логи и ответы вашего приложения;
- вводить сообщения от имени пользователя, которые будут передаваться в текущий сценарий.
По умолчанию всегда выбирается первый сценарий. Чтобы поменять сценарий, нужно воспользоваться специальной командой, которая вводится в консоли вместо сообщения от пользователя:
show_scenarios
* показывает все доступные в вашем приложении сценарии;show_envs
* показывает все доступные переменные и настройки, которые можно менять с помощью следующей команды;set
* выставляет указанной переменной или настройке выбранное значение.
Например, команда ниже поменяет значение переменной intent
на run_app
, и вместо выбранного по умолчанию сценария сообщения будут попадать в сценарий run_app
.
set intent run_app
Функциональные тесты
Вы можете автоматизировать тестирование смартапа с помощью функциональных тестов. Такие тесты описываются в json-файлах по определенному шаблону. Чтобы создать папку со сгенерированными шаблонами тестовых файлов, выполните команду:
python3 manage.py tests --gen <имя новой папки с тестами>
Каждый тестовый файл содержит хотя бы один тест-кейс, в котором есть список сообщений и может быть задано начальное состояние пользователя. Список сообщений — это последовательность объектов с полями request
и response
. На основе значения поля request
формируется запрос в смартап, а полученный ответ сравнивается со значением поля response
. Для выполнения всех тестов выполните команду:
python3 manage.py tests --run <имя папки с тестами>
Если тест предполагает выполнение kafka-интеграции, ответом на сообщение, вызывающее интеграцию, будет запрос в интеграцию. Следующим сообщением вы должны имитировать ответ интеграции в поле request
и поставить флаг link_previous_behavior
в true
. Пример:
{
"test_case_1": {
"user": {},
"messages": [
{
"request": {
"payload": {
"message": {},
"intent": "integration_scenario"
}
},
"response": {
"user": {},
"messages": [
{
"messageName": "INTEGRATION_MESSAGE_NAME",
"payload": {
"key": "value"
}
}
]
}
},
{
"link_previous_behavior": true,
"request": {
"messageName": "EXAMPLE_SYSTEM_REPLY_MESSAGE_NAME",
"payload": {
"other_key": "other_value"
}
},
"response": {
"user": {},
"messages": [
{
"messageName": "ANSWER_TO_USER",
"payload": {
"pronounceText": "Успех!"
}
}
]
}
}
]
}
}
Предопределенные поля в тестах
Вы можете использовать существующие шаблоны запроса (request
) и ответа (response
). Эти шаблоны содержат предопределенные поля со значениями по умолчанию. Они находятся в файле predefined_fields_storage.json в директории static/references.
Чтобы их использовать, добавьте поле predefined_fields
в json-файл с вашими функциональными тест-кейсами. В значение этого поля поместите ключ (название шаблона) из файла predefined_fields_storage.json.
Пример использования предопределенных полей — это тест-кейс hello_oleg_5years_programm_no
из файла hello_scenario_tests.json в директории static/references/tests.
{
"hello_oleg_5years_programm_no": [
{
"request": {
"message": {},
"predefined_fields": "default_request_params"
},
"response": {
"predefined_fields": "default_response_scheme",
"pronounce_texts": [
"Как тебя зовут?"
]
}
},
{
"request": {
"message": {
"original_text": "Олег",
"normalized_text": "Олег .",
"tokenized_elements_list": [
{
"text": "Олег",
"grammem_info": {
"animacy": "anim",
"case": "nom",
"gender": "masc",
"number": "sing",
"raw_gram_info": "animacy=anim|case=nom|gender=masc|number=sing",
"part_of_speech": "NOUN"
},
"lemma": "Олег"
},
{
"text": ".",
"lemma": ".",
"token_type": "SENTENCE_ENDPOINT_TOKEN",
"token_value": {
"value": "."
},
"list_of_token_types_data": [
{
"token_type": "SENTENCE_ENDPOINT_TOKEN",
"token_value": {
"value": "."
}
}
]
}
]
},
"predefined_fields": "default_request_params"
},
"response": {
"predefined_fields": "default_response_scheme",
"pronounce_texts": [
"Добрый день, Олег! Меня зовут Сбер. Прошу любить и не жаловаться! Простите за глупую шутку, волнуюсь. Сколько лет вы программируете на Python?"
]
}
}
}
Также вы можете добавлять свои шаблоны с нужными полями, поместив их в файл predefined_fields_storage.json.
Использование предопределенных полей помогает избежать дублирования в тестовых сценариях.
Команда запуска тестов с использованием предопределенных полей:
python <YOUR_APP_NAME>/manage.py tests static/references/tests static/references/predefined_fields_storage.json --run
Проверка SSML-разметки
SSML-разметка делает речь ассистента более естественной и выразительной. Но ошибки в разметке могут исказить задуманное произношение. Для избежания этой проблемы можно проверить SSML-разметку на стадии дизайна навыка.
Проверка доступна для версии SmartApp Framework v2.0.1rc8 и выше.
Проверка запускается вместе с функциональными тестами.
Чтобы запустить только SSML-тесты, добавьте к команде запуска аргумент scenarios-off
:
python3 manage.py tests --run <имя папки с тестами> scenarios-off
Для отключения SSML-тестов замените аргумент на --ssml-off
.
Опционально можно сконфигурировать работу инструмента в app_config.py
навыка, переопределив поля:
SSML_TEST_ADDRESS
— url сервиса проверки SSML-разметки.SSML_RESOURCES
— список ресурсов для проверки. По умолчанию имеет значение["scenarios", "forms", "external_actions", "behaviors"]
.SSML_TEST_SUITE
— класс-инструмент для проверки SSML-строк, унаследованный от SsmlTestSuite
Пример проверки строк без ошибок:
> python manage.py tests --run --scenarios-off
Scenarios tests are off. Skipping them.
Testing SSML strings...
...
[+] Testing SSML string "<speak>С помощью <say-as interpret-as="spell-out">SSML</say-as> разметки я умею делать <break time="2s" /> паузы, <break /> произносить слова по <say-as interpret-as="characters">буквам</say-as> и многое другое.</speak>" from scenarios.tell_me_more_scenario.actions[3].nodes.pronounceText
[+] OK
[+] Total: 1/1
Testing SSML strings done
Пример проверки строк с ошибками:
> python manage.py tests --run --scenarios-off
Scenarios tests are off. Skipping them.
Testing SSML strings...
...
[+] Testing SSML string "<speak>С помощью <say-as interpret-as="spell-in">SSML</say-as> разметки я умею делать <break time="2s" /> паузы, <break /> произносить слова по <say-as interpret-as="characters">буквам</say-as> и многое другое.</speak>" from scenarios.tell_me_more_scenario.actions[3].nodes.pronounceText [!] SSML markup of the string is invalid. Message: " Validity error: Element 'say-as', attribute 'interpret-as': [facet 'enumeration'] The value 'spell-in' is not an element of the set {'cardinal', 'ordinal', 'characters', 'verbatim', 'spell-out', 'date', 'telephone', 'money', 'address'}. Element 'say-as', attribute 'interpret-as': 'spell-in' is not a valid value of the atomic type 'interpret-as.datatype'. "
[+] Total: 0/1
Testing SSML strings done