当前位置: 首页 > 工具软件 > LocalStack > 使用案例 >

使用Arquillian和LocalStack脱机测试AWS云堆栈

乐修远
2023-12-01

AWS云堆栈 (例如DynamoDB,S3等)上构建应用程序时,需要针对这些组件编写测试。 您可能首先想到的是拥有一个用于生产的环境和一个用于测试的环境,然后针对该环境运行测试。

这对于集成测试,部署测试,端到端测试或性能测试是很好的,但是对于组件测试,如果可以在本地和脱机运行AWS云堆栈 ,它将更快。

Localstack提供了此功能。 它提供了功能齐全的本地AWS云堆栈,因此您可以脱机开发和测试云应用程序。

Localstack提供了启动所有堆栈的不同方法,但是最简单的方法是使用Docker映像。 所以如果你跑
atlassianlabs / localstack,然后您就可以启动堆栈并使用下一个配置运行它:

  • 位于http:// localhost:4567的API网关
  • Kinesis位于http:// localhost:4568
  • DynamoDB位于http:// localhost:4569
  • DynamoDB流位于http:// localhost:4570
  • 位于http:// localhost:4571的Elasticsearch
  • S3位于http:// localhost:4572
  • Firehose位于http:// localhost:4573
  • Lambda位于http:// localhost:4574
  • SNS位于http:// localhost:4575
  • SQS位于http:// localhost:4576
  • http:// localhost:4577上的Redshift
  • 位于http:// localhost:4578的ES(Elasticsearch Service)
  • SES位于http:// localhost:4579
  • 位于http:// localhost:4580的Route53
  • http:// localhost:4581上的CloudFormation
  • 位于http:// localhost:4582的CloudWatch

因此,下一个问题是如何使启动容器,运行测试以及最终停止所有操作并使它可移植的所有过程自动化,因此您无需担心在Linux或MacOS中使用Docker的情况? 答案是使用Arquillian Cube

Arquillian CubeArquillian扩展,可用于在测试中管理Docker容器。 要使用它,您需要在计算机上运行的Docker守护程序(它可以是本地的,也可以不是本地的),但可能在本地。

Arquillian Cube提供了三种定义容器的方法:

  • 定义docker-compose文件。
  • 定义容器对象。
  • 使用容器对象DSL。

在此示例中,我将向您展示“容器对象DSL”方法,但其他方法也都可以使用。

您需要做的第一件事是在构建工具上添加Arquillian和Arquillian Cube依赖项。

<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>

然后,您可以编写测试,在这种情况下,该测试将测试您可以使用在Docker主机中启动的S3实例创建存储桶并添加一些内容:

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();
        amazonS3Client.setEndpoint("http://" + localStack.getIpAddress() + ":4572/");

        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()));

    }

}

要考虑的重要事项:

  1. 您用Arquillian赛跑者注释测试。
  2. 使用@DockerContainer批注将属性用于定义容器。
  3. 容器对象DSL只是允许您配置要使用的容器的DSL。 在这种情况下, 本地堆栈容器具有所需的端口绑定信息。
  4. 该测试仅连接到Amazon S3并创建一个存储桶并存储一些内容。

没有其他要求。 当您运行此测试时, Arquillian Cube将连接到已安装的Docker(Machine)主机并启动localstack容器。 当它启动并运行并且服务能够接收请求时,将执行测试。 之后,将容器停止并销毁。

提示1 :如果不能使用Arquillian Runner,也可以使用JUnit类规则来定义容器,如下所述: http : //arquillian.org/arquillian-cube/#_junit_rule

提示2:如果您打算在整个组织中使用localstack ,建议您使用Container Object方法而不是DSL,因为这样您可以将localstack Container Object打包到jar文件中,并导入所有需要使用它的项目。 您可以在http://arquillian.org/arquillian-cube/#_arquillian_cube_and_container_object中阅读

因此,现在您只需使用本地环境即可为在AWS云上运行的应用程序编写测试,而不必连接到远程主机。

我们不断学习,

亚历克斯

翻译自: https://www.javacodegeeks.com/2017/06/test-aws-cloud-stack-offline-arquillian-localstack.html

 类似资料: