Я новичок в DynamoDB, и мне было интересно, есть ли какой-либо встроенный поддельный сервер DynamoDB, доступный в качестве зависимого / подключаемого модуля maven, для запуска сквозных тестов как части сборки maven. Например. что-то вроде Ахиллес, но для DynamoDB вместо Кассандры.

Стоит упомянуть, что я обнаружил этот проект, но обнаружил, что он слишком нестабилен и не был в состоянии заставить это работать.

Спасибо за помощь.

3
João Matos 16 Апр 2019 в 17:32

2 ответа

Лучший ответ

Я нашел два возможных подхода: DynamoDBEmbedded и Localstack. Относительно последнего, как отказано в сайте:

LocalStack предоставляет простую в использовании инфраструктуру для тестирования и моделирования для разработки облачных приложений. Он раскручивает среду тестирования на вашем локальном компьютере, которая предоставляет те же функциональные возможности и API, что и реальная облачная среда AWS.

Он высмеивает несколько сервисов 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) Убедитесь, что ваше приложение указывает на url локального стека, например, Динамо будет ждать вас в http://localhost:4569. Подробнее здесь.


Что касается первого, то есть 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 экземпляр.

4
João Matos 17 Апр 2019 в 16:34

В августе 2018 года Amazon анонсировала новое изображение 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, может быть полезно использовать расширения JUnit 5 для AWS который внедрит клиента в ваши тесты (да, я занимаюсь саморекламой):

  1. Добавьте JCenter в свою сборку.

    < EM> 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:dynamo-v1 (dynamo-v2 для клиента AWS Java SDK v2.x)

    < EM> pom.xml :

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

    build.gradle

    dependencies {
        testImplementation("by.dev.madhead.aws-junit5:dynamo-v1:5.0.2")
    }
    
  3. Используйте расширение в своих тестах:

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

Прочитайте полное руководство пользователя, оно очень короткое.

1
madhead 26 Сен 2019 в 09:43