DynamoDB假服务器进行集成测试

时间:2019-04-16 14:32:49

标签: java maven testing amazon-dynamodb

我是DynamoDB的新手,我想知道是否有任何类型的嵌入式DynamoDB伪造服务器可用作maven依赖项/插件,以便在maven构建中运行端到端测试。例如。类似Achilles,但适用于DynamoDB而不是Cassandra。

值得一提的是,我找到了this project,但发现它太不稳定了,无法正常工作。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我发现了两种可能的方法DynamoDBEmbeddedLocalstack。关于后者,如网站中所述:

  

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

它模拟了包括dynamodb在内的几种AWS服务。示例:

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)确保您的应用程序指向localstack网址,例如发电机将在http://localhost:4569等您。更多信息here


对于前者,即DynamoDBEmbedded,我们可以执行以下操作:

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

<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实例。

答案 1 :(得分:0)

2018年8月Amazon announcedDocker image上安装了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管道:

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,最好使用DynamoDB Local extension,它将在测试中注入客户端(是的,我正在自我推广):

  1. JCenter存储库添加到您的版本中。

    pom.xml

    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>central</id>
            <name>bintray</name>
            <url>https://jcenter.bintray.com</url>
        </repository>
    </repositories>
    

    build.gradle

    repositories {
        jcenter()
    }
    
  2. 添加对by.dev.madhead.aws-junit5:dynamodb-v1的依赖项

    pom.xml

    <dependency>
        <groupId>by.dev.madhead.aws-junit5</groupId>
        <artifactId>dynamodb-v1</artifactId>
        <version>1.0.0</version>
        <scope>test</scope>
    </dependency>
    

    build.gradle

    dependencies {
        testImplementation("by.dev.madhead.aws-junit5:dynamodb-v1:1.0.0")
    }
    
  3. 在测试中使用扩展名:

    @ExtendWith(DynamoDBLocalExtension.class)
    class MultipleInjectionsTest {
        @DynamoDBLocal(
            url = "http://dynamodb-local-1:8000"
        )
        private AmazonDynamoDB first;
    
        @DynamoDBLocal(
            urlEnvironmentVariable = "DYNAMODB_LOCAL_URL"
        )
        private AmazonDynamoDB second;
    
        @Test
        void test() {
            first.listTables();
            second.listTables();
        }
    }