ym88659208ym87991671
Как тестировать сценарий с Framework | Документация для разработчиков

Как тестировать сценарий с Framework

Обновлено 20 декабря 2023

Протестировать свой сценарий можно следующими способами:

  • Онлайн * с помощью приложения Салют или собственного устройства;
  • Офлайн * в виде локального тестирования.

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

Протестировать сценарий можно через приложение Салют или собственное устройство. Для этого:

  1. Локально запустите смартап с помощью команды:

    python3 manage.py run_app
  2. Передайте в интернет порт сервера. Значение по умолчанию * 8000. При отсутствии внешнего IP-адреса можно использовать специальные сервисы. Ниже представлен пример получения IP через Ngrok:

    1. Зарегистрируйте аккаунт на ngrok для получения токена.

    2. Скачайте и распакуйте бинарный файл для своей системы — ngrok.

    3. Запустите ngrok:

      ./ngrok http 8000
  3. Перейдите в свой смартап через Studio и укажите в поле "Настройки вебхука" https адрес, который был получен в результате выполнения предыдущего пункта. Сохраните изменения.

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

4) Убедитесь, что вы заходите в Studio по тому же Сбер ID, что и на устройстве, с которого хотите протестировать свой сценарий.

5) Скажите ассистент: «Запусти <имя вашего смартапа>».

Если все шаги выполнены верно, то после голосовой команды запустится сценарий 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
ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.