单元测试使用alexa-sdk的Alexa技能

时间:2017-02-12 17:42:23

标签: alexa-skills-kit alexa-skill

我正在开发节点中的Alexa技能,我想知道如何对我的代码进行单元测试。我正在使用亚马逊发布的alexa sdk。

我发现有许多库可以实现这一目标,但它们似乎是在alexa sdk可用之前开发的。

提前致谢。

5 个答案:

答案 0 :(得分:5)

我们专门设计了Alexa仿真器,以便对Alexa技能进行简单的单元测试和功能测试:
http://docs.bespoken.tools/en/latest/tutorials/tutorial_bst_emulator_nodejs/

有了它,你可以这样打电话:

alexa.launched(function (error, response) {
    alexa.spoken('About the podcast', function (error, response) {
        assert.equal(response.response.outputSpeech.ssml, '<speak> Some SSML </speak>');
        done();
    });
});

此测试代码模仿用户启动该技能并说“关于播客”。这些交互会自动转换为正确的Alexa JSON请求,然后将这些请求发送到您的技能代码。

您还可以创建更复杂的单元测试,这些单元测试依赖于跨交互模仿Alexa设备的内部状态。这些在教程中有所描述。

答案 1 :(得分:0)

我正在使用alexa-skill-test-framework和mocha来生成alexa intent json。可以使用localstack在本地PC中设置AWS服务,Carrierwave Direct支持DynamoDB,SQS,Lambda和其他服务

答案 2 :(得分:0)

lex-bot-tester是为Amazon Alexa和Lex创建对话测试的框架和工具。

不使用技能的模拟版本,而是使用现有的SMAPI来处理Alexa。

可以手动创建测试,也可以使用名为urutu的工具自动生成测试。现在,代码生成是python,但技能实现可以使用任何支持的语言。

从命令行与Skill交互后,定义对话,生成的代码如下所示

#! /usr/bin/env python
import sys
import unittest

from lex_bot_tester.aws.alexa.alexaskilltest import AlexaSkillTest

verbose = True

class GeneratedTests(AlexaSkillTest):
    def test_book_my_trip_reserve_car(self):
        """
        Test generated by urutu on 2018-02-21 01:24:51
        """
        skill_name = 'BookMyTripSkill'
        intent = 'BookCar'
        conversation = [{'slot': None, 'text': 'ask book my trip to reserve a car', 'prompt': None},
                        {'slot': 'CarType', 'text': 'midsize',
                         'prompt': 'What type of car would you like to rent,  Our most popular options are economy, midsize, and luxury'},
                        {'slot': 'PickUpCity', 'text': 'vancouver',
                         'prompt': 'In what city do you need to rent a car?'},
                        {'slot': 'PickUpDate', 'text': 'tomorrow',
                         'prompt': 'What day do you want to start your rental?'},
                        {'slot': 'ReturnDate', 'text': 'next week',
                         'prompt': 'What day do you want to return the car?'},
                        {'slot': 'DriverAge', 'text': '25', 'prompt': 'How old is the driver for this rental?'}]
        simulation_result = self.conversation_text(skill_name, intent, conversation, verbose=verbose)
        self.assertSimulationResultIsCorrect(simulation_result, verbose=verbose)

 if __name__ == '__main__':
    unittest.main()

Testing Alexa Skills — Autogenerated tests有一个更详细的解释和一些视频。

答案 3 :(得分:0)

我们正在使用MochaJs和ChaiJs测试我们在nodeJs中的Alexa技能

我们遵循this教程来构建我们的环境。

我们在package.json

中添加了dev依赖项

"devDependencies": { "aws-lambda-mock-context": "^3.1.1", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "mocha": "^5.0.4" }

我们有一个测试文件夹,其中包含来自Alexa Developer Console的几个测试请求,我们对其进行单元测试。

我们的测试test / index.html

var Alexa = require(&#39; alexa-sdk&#39;);

const handlers = {
    'LaunchRequest': require('launchRequest')
    //other handlers
};

exports.handler = function(event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.registerHandlers(handlers);
    alexa.execute();
};

要运行测试,只需运行此cmd

即可
$ mocha

答案 4 :(得分:0)

对于Java,我以此方式创建了一个单元测试。

class GetMyRequestHandlerTest {

RequestHandler requestHandler = new GetMyRequestHandler();

@Test
void canHandle(){
    HandlerInput input = CreateSampleInput();
    boolean result = requestHandler.canHandle(input);
    assertTrue(result);
}

@Test
void handle() {
    HandlerInput input = CreateSampleInput();
    Optional<Response> response = requestHandler.handle(input);
    assertFalse(response.equals(null));
}

private HandlerInput CreateSampleInput()
{
    HandlerInput.Builder handlerInputBuilder = HandlerInput.builder();

    Intent intent = Intent.builder().withName(Constants.GetMyIntent)
                                    .putSlotsItem(Constants.SlotNumber, Slot.builder().withName(Constants.SlotNumber).withValue("4").build())
                                    .build();

    Request request = IntentRequest.builder().withIntent(intent).build();

    Session session = Session.builder().putAttributesItem(Attributes.STATE_KEY, Attributes.STATE_NUMBER).build();

    RequestEnvelope requestEnvelope = RequestEnvelope.builder().withRequest(request)
                                                            .withSession(session)
                                                            .build();

    HandlerInput input = handlerInputBuilder.withRequestEnvelope(requestEnvelope)
                                            .build();
    return input;

}