Поддельный сервер DynamoDB для тестирования интеграции - PullRequest
1 голос
/ 16 апреля 2019

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

В августе 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:

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 , которое внедрит клиента в ваши тесты (да, я делаюсамореклама):

  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();
        }
    }
    
0 голосов
/ 17 апреля 2019

Я нашел два возможных подхода: 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) Makeубедитесь, что ваше приложение указывает на url localstack, например, Dynamo будет ждать вас на 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 экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...