亚马逊Kinesis + 集成测试

14

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

虽然在普通的单元测试中,mock Kinesis 库内部方法的调用不是问题,但由于整个应用程序栈都与 Spring 关联,我们无法在集成测试中做到这一点。对于一些其他事情(如 OAuth2 和我们的其他 Web 服务的调用),我们已经可以使用 WireMock 模拟实际端点 - 我真正想做的是使用 WireMock 来模拟调用 AmazonKinesisClient,但是我找不到有关如何做到这一点的建议。

或者,我看到有些 AWS 组件由第三方编写了测试库,可以让您运行本地版本(例如:DynamoDbLocal),但是找不到类似 Kinesis 的解决方案。

是否有人能够给我一些关于如何运行与 Kinesis 的集成测试的建议?


我对WebIntegrationTests不熟悉,但是你可以这样做:在测试之前创建一个单一分片的非生产测试流,运行测试,然后关闭它。或者在您的put/get调用周围创建一个薄包装器,通过队列传输对象? - Chris Riddell
我也遇到了这个“问题”。我还需要一个用例,就是每个开发人员都应该能够从本地环境运行集成测试。我不想为每个开发人员创建数据流。 - Mantas
2017年了,仍然没有看到任何工具出现。 - prayagupa
3个回答

12

可能已经为找出解决方案而晚了,但我将分享我的团队复制 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并针对本地基础设施运行测试。 稍后在拆卸阶段,包装器会杀死容器。


1

我遇到了同样的问题,目前我找到的唯一一个模拟实现是一个nodejs实现:https://github.com/mhart/kinesalite 它确实能够解决问题 - 我成功地在其上运行了我的Java Kinesis客户端,只需在kinesis.properties中设置端点即可:

kinesisEndpoint=http://localhost:4567

不足之处在于在构建时测试中使用它并不容易 - 需要想办法在测试之前启动模拟kinesis(使用maven插件或其他方式),我还没有完成...


0

对现有答案的一个小补充。顺便说一下,它们很棒,你真的应该在测试期间使用localstack这样的工具来启动假的AWS服务。

如果您在测试中使用JUnit 5,那么使用JUnit 5扩展程序 for AWS可能会更加简单,这是一些JUnit 5扩展程序,可用于测试与AWS相关的代码。这些扩展可以用于注入由类似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配置类进行配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接