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

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 {@DockerContainerContainer 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();@Testpublic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python取文本中间_Python读取两个字符串之间的特定文本行

我无法让python读取特定的行。我正在做的事情是这样的&#xff1a;lines of data not neededlines of data not neededlines of data not needed--------------------------------------***** REPORT 1 *****--------------------------------------[key] lines of interest ar…

c语言7.5return的值是,这个真心搞不懂了。求助

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼回复 15楼. 假如你每天签到拿4经验&#xff0c;300000/475000天&#xff0c;如果从1岁开始签到&#xff0c;那100年36500天&#xff0c;你差不多要活200年保持每天签到(谁知道200年后还有没有签到这玩意)&#xff0c;如果你每天再水…

Java命令行界面(第22部分):argparser

John Lloyd的argparser是本系列的第二十二篇有关基于Java的命令行参数解析的文章中介绍的库。 该库的主页除了提供单个源代码示例外&#xff0c;还提供了指向基于Javadoc的API文档 &#xff0c;JAR文件&#xff0c;ZIP文件和TAR文件的链接。 本帖子中使用的示例与本系列的前二十…

python中布尔类型的值包括0和1_Python中布尔型变量的值为0和1。( )

【单选题】以下哪个不能作为字典的键。【多选题】以下哪些元素是可变序列。【单选题】已知 x[1,2,3,4,5,6,7],执行语句x.pop()的结果是()。【多选题】以下哪几个可以作为字典的键。【单选题】以下哪个属于列表的定界符。【多选题】以下哪几个选项类型属于元组。【单选题】下面代…

如何粗暴地下载huggingface_hub指定数据文件

参考这里&#xff1a; https://huggingface.co/docs/huggingface_hub/guides/download 可见下载单个文件&#xff0c;下载整个仓库文件都是可行的。 这是使用snapshot_download下载的一个例子&#xff1a; https://qq742971636.blog.csdn.net/article/details/135150482 sn…

顺序表输入栈元素c语言,C语言数据结构之栈简单操作

C语言数据结构之栈简单操作实验&#xff1a;编写一个程序实现顺序栈的各种基本运算&#xff0c;并在此基础上设计一个主程序&#xff0c;完成如下功能&#xff1a;(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称…

rete_Rete之外的生活– RIP Rete 2013 :)

rete我只是对我的新算法做最后的修改。 它融合了Leaps &#xff0c; 面向集合的Match和Left / Right取消链接的概念 &#xff0c;以及我自己的一些想法。 该代码已提交&#xff0c;但我正在积累工作并编写更多测试。 我将在一周左右的时间内写一个完整的博客&#xff0c;详细介…

25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势

存储虚拟化是一种对物理存储资源进行抽象的技术&#xff0c;使其看起来像是一个集中的资源。虚拟化掩盖了管理内存、网络、服务器和存储中资源的复杂性。存储虚拟化运行在多个存储设备上&#xff0c;使它们看起来就像一个单一的存储池。这些池化的存储设备可以来自不同的供应商…

android代码画出波浪球,Android绘制波浪曲线,效果很赞的。

github地址&#xff1a;https://github.com/sddyljsx/Android-SurfView-WaveViewpackage neal.canvas;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import and…

Java命令行界面(第14部分):google-options

google-options的GitHub页面指出google-options是“来自Google&#xff08;java&#xff09;的人们的命令行参数解析库。” 该页面继续说&#xff1a;“这是Bazel Project中的命令行参数解析器。 com.google.devtools.common.options程序包已拆分为一个单独的jar&#xff0c;用…

python自动化工具哪个好用_10款好用的自动化测试工具推荐

当我们功能测试干的时间比较久了,或者想要学习更多的技术,提升自己的时候,基本上第一时间就会想到的是自动化测试。而在自动化测试领域&#xff0c;自动化工具的核心地位毋庸置疑&#xff0c;下面为大家推荐10款常见常用的自动化测试工具&#xff1a;1、SeleniumWEB自动化测试S…

android 输入法文本选择功能,Android的文本和输入---创建输入法(一)

输入法编辑器(IME)是让用户输入文本的控件。Android提供了一个可扩展的的输入法的框架&#xff0c;它允许应用程序给用户提供另外的输入法&#xff0c;如软键盘或语音输入。这些输入法一旦安装&#xff0c;用户就可以从系统的设置中选择他们想要使用的IME&#xff0c;并且这个设…

python基础list_python基础操作---list

1 #coding:utf-82 list1 [physics, chemistry, 1997, 2000];3 list2 [1, 2, 3, 4, 5 ];4 list3 ["a", "b", "c", "d"];56 #切片功能跟str一样7 print "list1[0]: ", list1[0]8 print "list2[1:5]: ", list2[1:…

华为mate40RS能升级鸿蒙,mate40Pro和40RS能用上鸿蒙系统吗

[分享交流]mate40Pro和40RS能用上鸿蒙系统吗8886电梯直达huafen210861086新学乍练发表于 2020-12-18 12:30:08来自&#xff1a;HUAWEI Mate 40 Pro最新回复 2020-12-19 09:50:21如题好多人都说不能用上鸿蒙系统林泽徐独步江湖发表于 2020-12-18 12:30:52来自&#xff1a;HUAWEI…

在JShell中尝试Java9 HTTP客户端和Process API

这篇文章继续了My My Java 9 Features博客文章中对Java9功能的探索。 在这里&#xff0c;我们用在Java9 HTTP / 2客户端和进程API试验JShell HTTP / 2客户端 HTTP / 2客户端是Java9中的孵化器项目。 这意味着该API尚未最终确定&#xff0c;因此在将来的版本中仍有一定的更改范…

python怎么读取pdf文件_Python解析并读取PDF文件内容的方法

本文实例讲述了Python解析并读取PDF文件内容的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一、问题描述利用python&#xff0c;去读取pdf文本内容。二、效果三、运行环境python2.7四、需要安装的库pip install pdfminer五、实现源代码代码1(win64)# codingutf…

android记事本添加图片功能,安卓手机上有什么便签app既可以写日记又可以添加照片?...

原标题&#xff1a;安卓手机上有什么便签app既可以写日记又可以添加照片&#xff1f;当前&#xff0c;有很多人一直保持着写日记的习惯&#xff0c;因为这样可以及时记录自己的成长轨迹&#xff0c;使得自己可以追寻到时光的记忆&#xff0c;但是我们记录日记的工具&#xff0c…

python每行输出14个数_python – 计算pandas中每行的一些值的列数

需要更改isnull到notnull&#xff1a;#if first columns is not index, set itdata data.set_index(Site code)data[Count] data.notnull().sum(axis1)data data.set_index(Site code)data[Count] data.count(axis1)print (data)Col1 Col2 Col3 CountSite codeA5252 24.0 5…

Java命令行界面(第20部分):JSAP

JSAP &#xff08; Java Simple Argument Parser &#xff09;2.1是本系列文章的第二十篇&#xff0c;重点是处理Java的命令行参数。 JSAP页面描述了该库存在的原因&#xff1a;“我在Internet上找到了几个解析器&#xff0c;所有解析器都处理了开关&#xff0c;但是在解析返回…

小米平板4android软件兼容吗,小米平板4有NFC功能吗 小米平板4支持NFC吗

小米平板4有NFC吗&#xff1f;小米平板4终于在诸多期待之下发布了&#xff0c;总的来说&#xff0c;小米平板4是一款性价比非常高的产品。所以没有带来太多惊喜的地方&#xff0c;但整体表现还是不错的。可以说是目前最便宜的骁龙660智能产品&#xff0c;性能中端。加上小米MIU…