Недавно я запустил свой первый навык Amazon Alexa Chef Basil. Я часами пробовал разные фразы на своем Amazon Echo и даже после запуска не был уверен, что код был протестирован на 100%. Я действительно тестировал, что происходит по истечении времени ожидания API? Или когда намерение проходит через слот, которого я не ожидал?

Я решил, что пора написать несколько модульных тестов.

Как веб-разработчик, я использую такие инструменты, как Javascript, Node.js и Jasmine. Я был рад использовать свои любимые технологии для развития и проверки своих навыков. При написании своего первого теста я понял, что необходимо создать некоторую базовую инфраструктуру, уникальную для навыка Alexa.

Вы можете следить и скачать код из этой статьи здесь.

К концу этой статьи мы перейдем к следующему:

  1. Как написать модульный тест на основе умения Amazon Alexa.
  2. Издевательские запросы и ответы.
  3. Проверка правильности ответов SSML.

Настройка

Для тестирования мы будем использовать нодовый модуль jasmine-node. Его можно скачать с помощью NPM:

npm install jasmine-node -g

Я использовал пример кода Hello World от Amazon. После того, как вы загрузили код, откройте объект намерения HelloWorld, расположенный в src / index.js, чтобы его можно было протестировать на единицу. Чтобы любое намерение или метод можно было протестировать, вы должны иметь возможность требовать их в своем тестовом файле.

module.exports.HelloWorld = HelloWorld;

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

- src
- spec
    - json
    - src

Мокинг-запросы и ответы

Когда пользователь вызывает ваш навык, запрос направляется в вашу функцию намерения с переменными intent, session и response.

intent и session - это объекты JSON, которые мы можем имитировать в папке JSON.

intent = { “slots”: {} }
session = { “attributes”: {} }

response - это объект Javascript, используемый для того, чтобы сообщить Alexa, какую речь говорить пользователю. Мы создадим шпиона вокруг ответа, чтобы убедиться, что наши намерения передают ему правильные параметры.

response = jasmine.createSpyObj(
    ‘response’, [ ‘tell’, ‘tellWithCard’, ‘ask’, ‘askWithCard’ ]
);

Проверка SSML

Язык разметки синтеза речи (SSML) используется для выражения речи в виде текста. Одна из моих любимых неприятностей при тестировании навыка заключается в том, что, хотя ваш код работает безупречно, если вы испортите SSML, Alexa тихо завершит работу без ошибок. Если вы забудете закрыть тег, ваш новый горячий навык превратится в беспорядок.

Чтобы сделать эту проблему более управляемой, я создал валидатор SSML, который добавлен как настраиваемый сопоставитель Jasmine. В настоящее время он проверяет:

beforeEach(function() {
    this.addMatchers({
        isSSML: function(expected) {
            return validator.test(this.actual, expected);
        }
    });
});

Тесты

Отлично, у нас есть некоторые компоненты, которые помогут подтвердить намерение. Давайте посмотрим на настоящий модульный тест и посмотрим, как все это сочетается.

В тесте мы вызываем HelloWorldIntent, который мы ранее предоставили, и передаем имитирующие параметры. Поскольку response является шпионским, мы проверяем, вызывается ли правильная функция ответа. Мы также проверяем правильность речи SSML с помощью настраиваемого сопоставителя.

Все, что вам осталось сделать, это запустить тест и посмотреть, как проходят утверждения!

jasmine-node spec/

Заключение

На этом этапе вы должны были узнать, как сделать свой навык Alexa более удобным в обслуживании с помощью модульных тестов. А теперь иди и напиши несколько тестов на свои потрясающие навыки.

Код в этой статье предназначен только для того, чтобы быть прототипом того, как можно построить более крупную структуру для тестирования навыков Alexa. Каждая часть кода может быть расширена, чтобы сделать ее более надежной и полезной. Например, должен быть сопоставитель карт, больше примеров сеансов JSON и модульные тесты вокруг валидаторов.

Я очень взволнован тем, в каком направлении движется проект с открытым исходным кодом alexa-app. Они работают над абстрагированием большей части кода Alexa, так что это больше похоже на работу с приложением Express. Будущие компоненты тестирования должны создаваться независимо от приложения alexa, но при этом легко интегрироваться с аналогичными модулями. Это захватывающее время для сообщества Javascript, и нам предстоит проделать большую работу, чтобы сделать базу кода Alexa более надежной и удобной в обслуживании.

Загрузите код из этой статьи здесь.