Проверьте свои навыки работы с 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 Optionalhandle(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 Optionalhandle(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 Optionalhandle(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”