我是DynamoDB的新手,我想知道是否有任何类型的嵌入式DynamoDB伪造服务器可用作maven依赖项/插件,以便在maven构建中运行端到端测试。例如。类似Achilles,但适用于DynamoDB而不是Cassandra。
值得一提的是,我找到了this project,但发现它太不稳定了,无法正常工作。
谢谢您的帮助。
答案 0 :(得分:0)
我发现了两种可能的方法DynamoDBEmbedded和Localstack。关于后者,如网站中所述:
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 announced新Docker 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,它将在测试中注入客户端(是的,我正在自我推广):
将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()
}
添加对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")
}
在测试中使用扩展名:
@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();
}
}