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


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

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

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

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

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

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

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

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

  4. Убедитесь, что вы заходите в SmartMarket 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

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней