DynamoDB虚假服务器用于集成测试

4
我是新手对DynamoDB不熟悉,想知道是否有嵌入式DynamoDB假服务器可用作为maven依赖/插件,以便在maven构建的一部分运行端到端测试。例如,类似于Cassandra的Achilles。值得一提的是,我发现了这个项目,但我发现它太不稳定了,我无法让它工作。谢谢你的帮助。

1
尝试这个 https://medium.com/@sandeep12.rao/integration-testing-with-dynamo-db-a6404a903c8f - best wishes
2个回答

4
我找到了两种可能的方法,DynamoDBEmbeddedLocalstack。关于后者,在该网站上声明:

LocalStack提供了一个易于使用的测试/模拟框架,用于开发云应用程序。它在您的本地计算机上启动一个测试环境,提供与真实的AWS云环境相同的功能和API。

它模拟了几个aws服务,包括dynamodb。例如:

1)在我的pom.xml中的依赖项下:

<dependency>
   <groupId>cloud.localstack</groupId>
   <artifactId>localstack-utils</artifactId>
   <version>0.1.19</version>
   <scope>test</scope>
</dependency>

2)将以下标头添加到您的单元测试类中:

@RunWith(LocalstackDockerTestRunner.class)
@LocalstackDockerProperties(randomizePorts = true, services = {"dynamodb"})

3) 确保您的应用程序指向本地堆栈网址,例如,Dynamo将在http://localhost:4569等待您。更多信息此处


关于前者,即DynamoDBEmbedded,我们可以采取以下措施:

1)在pom.xml文件的dependencies部分:

<dependency>
   <groupId>com.amazonaws</groupId>
   <artifactId>DynamoDBLocal</artifactId>
   <version>1.11.477</version>
   <scope>test</scope>
</dependency>

2)然后在我们的单元测试中:

private AmazonDynamoDB amazonDynamoDB;

@Before
public void setup() throws Exception {

    amazonDynamoDB =  DynamoDBEmbedded.create().amazonDynamoDB();//dynamoDB.getAmazonDynamoDB();
    amazonDynamoDB.createTable(new CreateTableRequest()
            .withTableName(TABLE_NAME)
            .withKeySchema(new KeySchemaElement().withAttributeName(ITEM).withKeyType(KeyType.HASH))
            .withAttributeDefinitions(
                    new AttributeDefinition().withAttributeName(ITEM).withAttributeType(ScalarAttributeType.S))
            .withProvisionedThroughput(new ProvisionedThroughput(10L, 15L))
    );
}

确保我们的DAO使用这个amazonDynamoDB实例。


关于localstack的第三步。如此处所述,从版本0.11.0开始,所有API都通过单个边缘服务公开,该服务默认情况下可通过http://localhost:4566访问。因此,我们应该使用类似`endpointConfiguration = new AwsClientBuilder.EndpointConfiguration("http://localhost:" + localStackContainer.getMappedPort(4566), Regions.US_EAST_1.getName())的东西,然后是AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(endpointConfiguration)`。 - Alexander Radchenko

2
2018年8月,亚马逊宣布推出了新的Docker镜像,其中包含Amazon DynamoDB Local。使用该镜像无需下载和运行任何JAR文件,也不需要添加第三方特定于操作系统的二进制文件(我指的是sqlite4java)。
只需在测试之前启动Docker容器即可,非常简单:
docker run -p 8000:8000 amazon/dynamodb-local

你可以按照上面的描述手动进行本地开发,或在CI流程中使用它。许多CI服务提供了在流程期间启动附加容器以为测试提供依赖项的功能。以下是Gitlab CI/CD的示例:
test:
  stage: test
  image: openjdk:8-alpine
  services:
    - name: amazon/dynamodb-local
      alias: dynamodb-local
  script:
    - DYNAMODB_LOCAL_URL=http://dynamodb-local:8000 ./gradlew clean test

或者使用Bitbucket Pipelines:
definitions:
  services:
    dynamodb-local:
      image: amazon/dynamodb-local

step:
  name: test
  image:
    name: openjdk:8-alpine
  services:
    - dynamodb-local
  script:
    - DYNAMODB_LOCAL_URL=http://localhost:8000 ./gradlew clean test

启动容器后,您可以创建指向该容器的客户端:

private AmazonDynamoDB createAmazonDynamoDB(final DynamoDBLocal configuration) {
    return AmazonDynamoDBClientBuilder
        .standard()
        .withEndpointConfiguration(
            new AwsClientBuilder.EndpointConfiguration(
                "http://localhost:8000",
                Regions.US_EAST_1.getName()
            )
        )
        .withCredentials(
            new AWSStaticCredentialsProvider(
                // DynamoDB Local works with any non-null credentials
                new BasicAWSCredentials("", "")
            )
        )
        .build();
}

如果您正在使用JUnit 5,使用 AWS的JUnit 5扩展可以是一个好主意,它将在测试中注入客户端(是的,我在自我推销):

  1. Add a dependency on me.madhead.aws-junit5:dynamo-v1 (dynamo-v2 for AWS Java SDK v2.x client)

    pom.xml:

    <dependency>
        <groupId>me.madhead.aws-junit5</groupId>
        <artifactId>dynamo-v1</artifactId>
        <version>6.0.3</version>
        <scope>test</scope>
    </dependency>
    

    build.gradle

    dependencies {
        testImplementation("me.madhead.aws-junit5:dynamo-v1:6.0.3")
    }
    
  2. Use the extension in your tests:

    @ExtendWith(DynamoDB.class)
    class Test {
        @AWSClient(
            endpoint = Endpoint.class
        )
        private AmazonDynamoDB client;
    
        @Test
        void test() {
            client.listTables();
        }
    }
    

阅读完整的用户指南,它真的很简短。


不错!你能建议一些方法在每个单元测试之前/之后自动启动/停止 Docker 镜像吗? - João Matos
@JoãoMatos,如果您正在使用以下的CI/CD服务,则容器将在测试作业之前自动启动并在之后自动停止。如果您在本地进行操作,只需执行docker run / docker stop即可。 - madhead

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