Когда вы создаете свои приложения в облачном стеке AWS (например, DynamoDB, S3,…), вам необходимо написать тесты для этих компонентов. Первая идея, которая у вас может возникнуть, — это иметь одну среду для производства и другую для тестирования и запускать тесты на нее.
Это хорошо для интеграционных тестов, тестов развертывания, сквозных тестов или тестов производительности, но для тестов компонентов будет быстрее, если вы сможете запускать облачный стек AWS локально и автономно.
Localstack предоставляет эту функцию. Он предоставляет полностью функциональный локальный облачный стек AWS, поэтому вы можете разрабатывать и тестировать свои облачные приложения в автономном режиме.
Localstack поставляется с различными способами запуска всего стека, но самый простой из них — использование образа Docker. Так что если вы бежите
atlassianlabs / localstack, тогда вы получаете стек и работаете со следующей конфигурацией:
- API-шлюз по адресу http: // localhost: 4567
- Kinesis на http: // localhost: 4568
- DynamoDB по адресу http: // localhost: 4569
- DynamoDB Streams на http: // localhost: 4570
- Elasticsearch на http: // localhost: 4571
- S3 на http: // localhost: 4572
- Пожарный дом на http: // localhost: 4573
- Лямбда на http: // localhost: 4574
- SNS на http: // localhost: 4575
- SQS на http: // localhost: 4576
- Redshift на http: // localhost: 4577
- ES (Elasticsearch Service) по адресу http: // localhost: 4578
- SES на http: // localhost: 4579
- Route53 на http: // localhost: 4580
- CloudFormation на http: // localhost: 4581
- CloudWatch по адресу http: // localhost: 4582
Итак, следующий вопрос: как автоматизировать весь процесс запуска контейнера, запустить тесты и, наконец, остановить все и сделать его переносимым, чтобы вам не пришлось беспокоиться, если вы используете Docker в Linux или MacOS? Ответ использует Arquillian Cube .
Arquillian Cube — это расширение Arquillian, которое можно использовать для управления контейнерами Docker в ваших тестах. Чтобы использовать его, вам нужен демон Docker, работающий на компьютере (он может быть локальным или нет), но, вероятно, он будет локальным.
Arquillian Cube предлагает три различных способа определения контейнера (ов):
- Определение файла docker-compose .
- Определение объекта-контейнера.
- Использование контейнерного объекта DSL.
В этом примере я собираюсь показать вам подход «Контейнерный объект DSL», но любой другой работает также.
Первое, что вам нужно сделать, это добавить зависимости Arquillian и Arquillian Cube в ваш инструмент сборки.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
< dependencyManagement > < dependencies > < dependency > < groupId >org.arquillian.cube</ groupId > < artifactId >arquillian-cube-docker</ artifactId > < version >1.6.0</ version > </ dependency > < dependency > < groupId >org.jboss.arquillian</ groupId > < artifactId >arquillian-bom</ artifactId > < version >1.1.13.Final</ version > < type >pom</ type > < scope >import</ scope > </ dependency > </ dependencies > </ dependencyManagement > < dependencies > < dependency > < groupId >com.amazonaws</ groupId > < artifactId >aws-java-sdk</ artifactId > < version >1.11.86</ version > </ dependency > < dependency > < groupId >org.jboss.arquillian.junit</ groupId > < artifactId >arquillian-junit-standalone</ artifactId > < scope >test</ scope > </ dependency > < dependency > < groupId >org.arquillian.cube</ groupId > < artifactId >arquillian-cube-docker</ artifactId > < scope >test</ scope > </ dependency > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.12</ version > < scope >test</ scope > </ dependency > < dependency > < groupId >org.assertj</ groupId > < artifactId >assertj-core</ artifactId > < version >3.6.2</ version > < scope >test</ scope > </ dependency > </ dependencies > |
Затем вы можете написать тест, который в этом случае проверяет, что вы можете создать сегмент и добавить некоторый контент, используя экземпляр S3, запущенный на хосте Docker:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.S3Object; import java.io.ByteArrayInputStream; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; import org.junit.Test; import org.junit.runner.RunWith; import static org.assertj.core.api.Assertions.assertThat; @RunWith (Arquillian. class ) public class S3Test { @DockerContainer Container localStack = Container.withContainerName( "localstack" ) .fromImage( "atlassianlabs/localstack:0.5.3.1" ) .withPortBinding(IntStream.rangeClosed( 4567 , 4578 ).boxed() .collect(Collectors.toList()).toArray( new Integer[ 0 ])) .withPortBinding( 8080 ) .build(); @Test public void should_create_bucket_and_add_content() { final AmazonS3Client amazonS3Client = new AmazonS3Client(); String bucketName = "my-first-s3-bucket-" + UUID.randomUUID(); String key = "MyObjectKey" ; amazonS3Client.createBucket(bucketName); assertThat(amazonS3Client.listBuckets()).hasSize( 1 ); amazonS3Client.putObject(bucketName, key, "abcdef" ); final S3Object object = amazonS3Client.getObject(bucketName, key); assertThat(object.getObjectContent()).hasSameContentAs( new ByteArrayInputStream( "abcdef" .getBytes())); } } |
Важные вещи, которые следует учитывать:
- Вы комментируете свой тест с помощью бегуна Arquillian.
- Используйте аннотацию @DockerContainer для атрибута, используемого для определения контейнера.
- Контейнерный объект DSL — это просто DSL, который позволяет вам настроить контейнер, который вы хотите использовать. В этом случае контейнер localstack с необходимой информацией о привязке порта.
- Тест просто подключается к Amazon S3, создает корзину и сохраняет некоторый контент.
Больше ничего не требуется. Когда вы запустите этот тест, Arquillian Cube подключится к установленному хосту Docker (Machine) и запустит контейнер localstack . Когда он работает и сервисы могут получать запросы, тесты выполняются. После этого контейнер останавливается и уничтожается.
СОВЕТ 1. Если вы не можете использовать Arquillian runner, вы также можете использовать правило класса JUnit для определения контейнера, как описано здесь: http://arquillian.org/arquillian-cube/#_junit_rule
СОВЕТ 2. Если вы планируете использовать localstack во всей организации, я предлагаю вам использовать подход « объект-контейнер» вместо DSL, потому что тогда вы можете упаковать контейнер-объект localstack в jar-файл и импортировать его во все проекты, которые вам нужны. Вы можете прочитать на http://arquillian.org/arquillian-cube/#_arquillian_cube_and_container_object
Теперь вы можете писать тесты для своего приложения, работающего в облаке AWS, без необходимости подключения к удаленным хостам, просто используя локальную среду.
Мы продолжаем учиться,
Alex
Ссылка: | Протестируйте облачный стек AWS в автономном режиме с Arquillian и LocalStack от нашего партнера по JCG Алекса Сото в блоге One Jar To Rule All . |