我有一个AWS Lambda函数,它将从Kinesis提取消息并将其发送到SQS。消息必须是某种格式。我如何测试这样的东西? Lambda将包含一些转换逻辑,但是我不确定如何测试这种东西。我还需要测试Lambda是否指向正确的原点和目标。有办法做这样的事吗?
答案 0 :(得分:2)
Lambda只是一个函数,因此您可以直接在测试框架中调用它。
您可以在lambda中添加一个日志,以获取传递给它的Kinesis事件的一些示例数据。
将执行转换的部分与处理程序样板以及发送到SQS的代码分开。
然后,您可以轻松地测试转换。
如果您使用任何流行的框架来部署堆栈(无服务器框架,SAM等),则可能会将您的基础结构描述为代码,并且对其进行设置和拆卸都不会那么困难。 / p>
然后,您可以使用AWS开发工具包将其发布到Kinesis或从SQS读取以确保一切正常。
我写了一个library,包装了AWS开发工具包并帮助您针对AWS服务编写测试断言。
答案 1 :(得分:0)
听起来您想测试lambda以及整个系统执行的转换。
lambda代码可以包含在单元测试中,而Kinesis-Lambda-SQS系统可以包含功能性的端到端测试。
对于端到端测试,我不知道您的数据如何进入Kinesis。重用任何您已经可以自动将特定测试数据自动发送到系统中的内容,可能是最容易的。您也许可以使用Kinesis CLI发送测试数据。 发送测试数据后,您可以使用SQS CLI来验证是否创建了正确的SQS消息。
答案 2 :(得分:0)
我同意埃雷兹(Erez)的评论,即您需要以两种方式进行思考。
aws-sdk
之类的库来模拟对aws-sdk-mock
的调用。在此示例中,我使用的是nodejs:sqs_sendMessage_is_mocked = record => {
AWSMock.mock('SQS', 'sendMessage', (params, callback) => {
if (record) {
record(params);
}
callback(null, { StatusCode: 200 });
});
};
在测试中,可能看起来像这样:
sqsParams = [];
sqs_sendMessage_is_mocked(p => sqsParams.push(p));
// invoke your function under test
// check for the expected parameters
// i.e. that the call is made a certain number of times
// or that the SQS Queue URL is being correctly set
expect(sqsParams[0].QueueUrl).to.equal('YourQueueURL');
以上示例完全不涉及Kinesis。理想情况下,您要确保整个堆栈都能正常工作。以我的经验,最有用的测试是跨越多个lambda并检查业务规则是否有效的测试,而不是只有一个元素可以完成非常具体的事情-单元测试已涵盖了这一点。
为此,您可以:
由于端到端测试的目标是验证已部署的堆栈是否正常运行,因此我赞成将堆栈实际部署到云中,而不是使用云模拟框架。