Amazon Kinesis + 集成测试

Posted

技术标签:

【中文标题】Amazon Kinesis + 集成测试【英文标题】:Amazon Kinesis + Integration Tests 【发布时间】:2015-08-26 22:43:05 【问题描述】:

我目前正在开发一系列需要与 Kinesis 集成的 Web 服务 - 实施已经完成,但是我们有一系列集成测试(我们的 Web 服务都使用 Spring Boot,所以我们使用我们测试类上的@WebIntegrationTest 注释来启动服务器的本地实例,然后使用TestRestTemplate) 调用我们的资源,这些资源当前正在尝试连接到真正的Kinesis,但失败了。

虽然在普通单元测试中模拟对 Kinesis 库中方法的调用不是问题,但我们不能在集成测试中真正做到这一点,因为整个应用程序堆栈都与 Spring 连接。对于其他一些事情(例如 OAuth2 和对我们其他 Web 服务的调用),我们已经能够使用 WireMock 来模拟实际的端点——我真正想做的是以这种方式使用 WireMock 来模拟致电AmazonKinesisClient,但我找不到有关如何执行此操作的任何建议。

另外,我看到一些 AWS 组件具有由第三方编写的测试库,允许您运行它的本地版本(例如:DynamoDbLocal),但无法为 Kinesis 找到这样的解决方案。

有人能给我一些关于如何使用 Kinesis 运行集成测试的建议吗?

【问题讨论】:

我不熟悉 WebIntegrationTests,但是,您能否:在测试之前使用单个分片创建一个非生产测试流,运行测试,然后关闭它?或者在您的 put/get 调用上围绕 aws api 创建一个薄包装器,以便将对象汇集到队列中? 我也遇到了这个“问题”。我需要的另一个用例是每个开发人员都应该能够从本地环境运行集成测试。我不想为每个开发者创建流。 2017 年,仍然没有看到任何工具。 【参考方案1】:

现在给出解决方案可能已经太迟了,但我会补充一下我的团队在本地复制 AWS 资源所做的工作,因为我们使用了大量 Kinesis、DynamoDb、S3 和 cloudWatch。

我们围绕 Localstack -> https://github.com/localstack/localstack 创建了包装器,允许我们使用 docker-compose 将必要服务的本地实例作为 docker 容器启动。

一个典型的docker-compose.yml 文件对我们来说是这样的:

version: '2'
services:
  localstack:
    image: "localstack/localstack"
    environment:
      - SERVICES=kinesis,dynamodb,cloudwatch
    ports:
      - "4568"
      - "4569"
      - "4582"

然后在集成测试的设置阶段,我们的包装器启动 docker-compose up 并针对本地基础架构运行测试。 稍后在拆卸过程中,包装器会杀死容器。

【讨论】:

【参考方案2】:

我遇到了同样的问题,到目前为止我发现的唯一模拟实现是 nodejs 一个:https://github.com/mhart/kinesalite 它成功了——我设法针对它运行我的 Java Kinesis 客户端,只需要在 kinesis.properties 上设置端点:

kinesisEndpoint=http://localhost:4567

缺点是在构建时测试期间使用它并非易事 - 需要在测试之前找到一种方法来启动模拟运动(使用 maven 插件或其他东西),但还没有得到它。

【讨论】:

【参考方案3】:

只是对现有答案的一个小补充。顺便说一句,它们很棒,您应该在测试阶段真正使用localstack 之类的工具在测试之前启动虚假 AWS 服务。

如果您在测试中使用 JUnit 5,那么使用 JUnit 5 extensions for AWS,您的生活可能会更加简单,这是一些可用于测试 AWS 相关代码的 JUnit 5 扩展。这些扩展可用于为 localstack 等工具提供的 AWS 服务模拟注入客户端。支持 AWS Java SDK v 2.x 和 v 1.x:

@ExtendWith(DynamoDB.class)
class AmazonDynamoDBInjectionTest 
    @AWSClient(
        endpoint = Endpoint.class
    )
    private AmazonDynamoDB client;

    @Test
    void test() throws Exception 
        Assertions.assertNotNull(client);

        Assertions.assertEquals(
            Collections.singletonList("table"),
            client.listTables().getTableNames().stream().sorted().collect(Collectors.toList())
        );
    

这里,客户端将被注入到您的测试类中,并根据Endpoint配置类进行配置。

【讨论】:

以上是关于Amazon Kinesis + 集成测试的主要内容,如果未能解决你的问题,请参考以下文章

Spark Streaming 集成 AWS Kinesis

Amazon APi网关无法生成转换后的请求

pgspider zombodb+opendistro 集成

如何在 Amazon Kinesis 服务上部署和运行 Amazon Kinesis 应用程序

Amazon Kinesis:在同步 Kinesis 分片和租约时捕获异常

Amazon Kinesis Data Firehose