Рубрики
Без рубрики

Тестирование навыков Alexa

Проверьте свои навыки работы с Java Alexa с реальными запросами. С тегами java, alexa, test, bdd.

Проверьте свои навыки работы с Java Alexa с реальными запросами

Написать навык Alexa на Java довольно просто с помощью Alexa Skills Kit SDK для Java . 😃

Однако тестирование вашего кода может быть довольно хлопотным.

Вы можете и должны написать необходимые примеры модульных тестов для проверки целостности вашего кода. Но… Если вы хотите проверить свои общие навыки взаимодействия… Что ж, это может быть сложно и запутанно выполнить с помощью ваших стандартных инструментов тестирования. 😵

Есть несколько решений для тестирования навыков, но те, которые я нашел (для Java), требуют, чтобы навык был развернут/размещен и доступен для запуска тестовых примеров.

Я искал инструмент, который мог бы помочь мне написать автоматизированные тестовые примеры для моих навыков Alexa, инструмент, который можно использовать в моих модульных/интеграционных тестах, чтобы запускать реальные запросы JSON в моем коде и проверять многооборотные взаимодействия с моим навыком, без необходимости сначала развертывать или размещать его.

Когда я не нашел такого инструмента, я решил его создать. Мой alexa-тестер навыков 😀

Источники для этого поста можно найти здесь .

Чтобы использовать alexa-skills-tester , просто добавьте в свой проект следующее: (замените ВЕРСИЮ на текущую версию |/).


  info.tomfi.alexa
  alexa-skills-tester
  VERSION

Пример использования

Используя базовый Приятно познакомиться пользовательский навык: При запуске навыка он запрашивает имя пользователя, а затем отвечает приглашением Приятно познакомиться #name , завершая сеанс.

Давайте взглянем на код для этого навыка.

Обработчик запроса на запуск

public final class LaunchRequestHandlerImpl implements LaunchRequestHandler {
  @Override
  public boolean canHandle(final HandlerInput input, final LaunchRequest request) {
    return true;
  }

  @Override
  public Optional handle(final HandlerInput input, final LaunchRequest request) {
    return input.getResponseBuilder()
        .withSpeech("What is your name?")
        .withReprompt("Please tell me your name.")
        .withShouldEndSession(false)
        .build();
  }
}

Обработчик запроса намерения, обрабатывающий Намерение моего имени с помощью слота имен

public final class MyNameIntentRequestHandler implements IntentRequestHandler {
  @Override
  public boolean canHandle(final HandlerInput input, final IntentRequest request) {
    return request.getIntent().getName().equals("MyNameIntent");
  }

  @Override
  public Optional handle(final HandlerInput input, final IntentRequest request) {
    var name = request.getIntent().getSlots().get("nameSlot").getValue();
    return input.getResponseBuilder()
        .withSpeech(String.format("Nice to meet you %s!", name))
        .withShouldEndSession(true)
        .build();
  }
}

Обработчик завершенного сеанса запроса

public final class SessionEndedRequestHandlerImpl implements SessionEndedRequestHandler {
  @Override
  public boolean canHandle(final HandlerInput input, final SessionEndedRequest request) {
    return true;
  }

  @Override
  public Optional handle(final HandlerInput input, final SessionEndedRequest request) {
    return Optional.empty();
  }
}

Класс полезности для создания навыка

class NiceToMeetYouSkill {
  public static Skill getSkill() {
    return Skills.standard()
        .addRequestHandler(new LaunchRequestHandlerImpl())
        .addRequestHandler(new MyNameIntentRequestHandler())
        .addRequestHandler(new SessionEndedRequestHandlerImpl())
        .build();
  }
}

А теперь давайте проверим это умение

Вам следует ознакомиться с Ссылка на запрос и ответ Alexa в формате JSON . Это, конечно, следует считать общеизвестным для развития навыков.

Давайте создадим пару файлов поддельного запроса JSON для использования в наших тестах.

Давайте создадим пару файлов поддельного запроса JSON для использования в наших тестах.

{
  "version": "1.0",
  "session": {
    "new": true
  },
  "context": {
    "System": {}
  },
  "request": {
    "type": "LaunchRequest",
    "requestId": "amzn1.echo-api.request.fake-request-id",
    "timestamp": "2021-02-11T15:30:00Z",
    "locale": "en-US"
  }
}

Давайте создадим пару файлов поддельного запроса JSON для использования в наших тестах.

{
  "version": "1.0",
  "session": {
    "new": false
  },
  "context": {
    "System": {}
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "amzn1.echo-api.request.fake-request-id",
    "timestamp": "2021-02-11T15:31:00Z",
    "locale": "en-US",
    "intent": {
      "name": "MyNameIntent",
      "slots": {
        "nameSlot": {
          "name": "nameSlot",
          "value": "master"
        }
      }
    }
  }
}

Давайте создадим пару файлов поддельного запроса JSON для использования в наших тестах.

{
    "version": "1.0",
    "session": {
        "new": false
    },
    "context": {
        "System": {}
    },
    "request": {
        "type": "SessionEndedRequest",
        "requestId": "amzn1.echo-api.request.fake-request-id",
        "timestamp": "2021-02-11T15:32:00Z",
        "locale": "en-US"
    }
}

Теперь давайте создадим несколько тестовых примеров, используя вышеупомянутые файлы JSON, чтобы проверить взаимодействие с навыком.

Тестовые примеры, проверяющие навык “Приятно познакомиться”

final class SkillInteractionTest {
  @Test
  void verify_greeting_for_my_name_intent_as_a_followup_to_a_launch_request() throws IOException {
    givenSkill(NiceToMeetYouSkill.getSkill())
        .whenRequestIs(getClass().getClassLoader().getResourceAsStream("launch_request.json").readAllBytes())
        .thenResponseShould()
            .waitForFollowup()
            .haveOutputSpeechOf("What is your name?")
            .haveRepromptSpeechOf("Please tell me your name.")
        .followingUpWith(getClass().getClassLoader().getResourceAsStream("my_name_intent.json").readAllBytes())
        .thenResponseShould()
            .haveOutputSpeechOf("Nice to meet you master!")
            .and()
            .notWaitForFollowup();
  }

  @Test
  void verify_empty_response_for_session_ended_requests() throws IOException {
    givenSkill(NiceToMeetYouSkill.getSkill())
      .whenRequestIs(getClass().getClassLoader().getResourceAsStream("launch_request.json").readAllBytes())
      .thenResponseShould()
          .waitForFollowup()
          .haveOutputSpeechOf("What is your name?")
          .haveRepromptSpeechOf("Please tell me your name.")
      .followingUpWith(getClass().getClassLoader().getResourceAsStream("session_ended.json").readAllBytes())
      .thenResponseShould().beEmpty();
  }
}

Вот и все! Надеюсь, вы найдете этот инструмент полезным.

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

Вы можете ознакомиться с кодом для этой части руководства в Github .

👋 Увидимся в следующем уроке 👋

Оригинал: “https://dev.to/tomerfi/alexa-skills-testing-4pfd”