aix pax_通过Pax考试对JBoss Fuse 6.x进行集成测试,第一部分

aix pax

JBoss Fuse是一个功能强大的分布式集成平台,具有内置功能,可用于针对集成的微服务部署进行集中式配置管理,服务发现,版本控制,API网关,负载平衡,故障转移等。 JBoss Fuse 6.x构建在Fabric8 1.x开源项目之上。 当在JBoss Fuse之上构建集成微服务时,该博客是有关集成测试的两部分系列的第一部分。 鲍勃

老实说,这些天,当人们问到他们正在编写的软件/服务的测试策略的细节时,我感到非常惊喜。 我认为每个人都同意测试很重要,但实际上没有人这样做。 我与使用JBoss Fuse编写其集成服务的客户进行了大量合作,经常被问到如何最好地测试这些服务。

JBoss Fuse使用Apache Camel作为其路由和中介引擎,您最终使用Camel编写了大部分集成逻辑。 为了测试骆驼路线,我强烈建议使用骆驼随附的内置测试框架 。 此外,我不仅建议您使用内置的测试套件,还强烈建议您使用它来构建大部分测试。 能够在容器外部运行骆驼及其相关测试是与其他集成解决方案非常重要的区别,测试应该充分利用这一事实。

但是,如果您拥有良好的骆驼路线测试覆盖率,而现在又想进一步采取行动,该怎么办? 您想将路由/应用程序部署到JBoss Fuse容器中,并验证一切是否正确接线,是否正确包含了OSGI导入/导出/元数据,附加到HTTP服务的服务等。这些都是要部署到的合法原因。一个容器,但是手动执行此操作容易出错且速度很慢。 那么有什么选项可以自动执行此操作?

我已经遇到了几种不同的方法来做到这一点:使用Arquillian ,它是最初为JBoss Application Server / Wilfly / EAP开发的与容器无关的集成测试框架。 有一些很好的模块可以集成测试OSGI部署 。 但是,一旦您尝试进行更多的“黑盒”集成测试,Arquillian目前还不够强大,无法进行JBoss Fuse测试。 为此,我建议使用Pax Exam项目。 Pax Exam已经存在了很长一段时间,并且已经被用来测试ServiceMix / Karaf的各种派生类,这些派生类与JBoss Fuse足够相似以进行测试。

因此,为了不仅帮助其他想要入门的人进行集成测试JBoss Fuse 6.x,我整理了入门入门书……而且更自私地……以便于记下这些笔记,以便我可以回到他们身边; 因为我已经做了足够多次了,却忘记了是时候写下来了。

Itests

我通常会在要称为子项目itests的子模块中构建自动集成测试以及要测试的项目。 您可以随意进行相同的操作,也可以将集成测试放在单独的项目中。 在本指南中,我将集成测试构建到Rider Auto OSGI示例项目中,该项目改编自Claus Ibsen和Jon Anstey的著作Camel in Action 。 随意浏览该项目,以了解模块的功能。

首先,我强烈建议您浏览Pax考试文档,然后将头戳到名为FuseTestSupport的文件中。 在其中,您将看到贡献OSGI容器@Configuration的方法:

// note, for this to work, you must download and put fuse in the location// specified by the maven coordinates herepublic static final String GROUP_ID = "org.jboss.fuse";public static final String ARTIFACT_ID = "jboss-fuse-minimal";public static final String VERSION = "6.1.0.redhat-379";    public static Option[] container() {return new Option[]{karafDistributionConfiguration().frameworkUrl(maven().groupId(GROUP_ID).artifactId(ARTIFACT_ID).version(VERSION).type("zip")).karafVersion("2.3.0").useDeployFolder(false).name("JBoss Fuse").unpackDirectory(new File("target/paxexam/unpack")),configureConsole().ignoreLocalConsole(),editConfigurationFilePut("etc/config.properties", "karaf.startup.message", "Loading Fabric from: ${karaf.home}"),editConfigurationFilePut("etc/org.ops4j.pax.web.cfg", "org.osgi.service.http.port", HTTP_PORT),editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiRegistryPort", RMI_REG_PORT),editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiServerPort", RMI_SERVER_PORT),editConfigurationFilePut("etc/users.properties", "admin", "admin,admin"),// this is the key... we can install features, bundles, etc. using these pax-exam optionsfeatures(maven().groupId("org.fusesource.examples").artifactId("rider-auto-common").versionAsInProject().classifier("features").type("xml"),"rider-auto-osgi"),logLevel(LogLevelOption.LogLevel.INFO),// enable this if you want to keep the exploded directories of fuse after the tests are run
//                keepRuntimeFolder(),};};

请注意,我们使用的是JBoss Fuse的实际发行版,而不是某些hacked-0together版本。 为此,您需要访问JBoss.org 网站 ,下载Fuse,然后将其安装到与上述代码片段中指定的坐标相对应的maven存储库中,如下所示:

~/.m2/repository/org/jboss/fuse/jboss-fuse-minimal/6.1.0.redhat-379/<put distro here>

现在,当测试运行时,它将找到Fuse disto。

您还可以查看配置选项,包括编辑一些现成的配置选项,添加功能,更改日志级别等。您可以查看KarafDistributionOption文档或CoreOptions ,其中详细介绍了所有可用选项。

这部分相当简单。 这是在该配置之上构建的简单测试的示例:

@Inject@Filter("(camel.context.name=rider-auto-backend)")protected CamelContext camelContext;@Testpublic void testBootstrap() {assertNotNull(camelContext);ActiveMQComponent component = camelContext.getComponent("activemq", ActiveMQComponent.class);assertNotNull(component);String brokerUrl = ((ActiveMQConfiguration)component.getConfiguration()).getBrokerURL();// make sure configuration was set up correctlyassertEquals("tcp://localhost:61616", brokerUrl);// further validate that all of the camel contexts were installed correctlyString contextList = executeCommand("camel:context-list");assertTrue(contextList.contains("rider-auto-backend"));assertTrue(contextList.contains("rider-auto-file-poller"));assertTrue(contextList.contains("rider-auto-normalizer"));}

该测试实际上已注入到容器中(有关更多信息,请参见pax考试文档),并且可以访问容器的内部(例如,依赖项注入)并根据部署的内部运行一些断言。

黑匣子测试

能够以完全访问您的部署和容器运行时的方式来运行自动化集成测试非常好。 您可以进行复杂的测试,以确保所有内容都正确部署,以您认为的方式应用了配置以及可以检索到所有期望的服务。 但是另一种类型的测试非常有用:能够部署集成服务并远程(在容器外部)行使功能,而无需了解太多细节。 因此,例如,与集成服务公开的接口(例如JMS,文件系统,REST / SOAP端点等)进行交互。您可以使用标准库来访问这些接口。 但是,对于这种类型的测试,如何将保险丝容器暴露为黑匣子? 答案是Pax Exam允许您在“服务器”模式下运行容器 。 不幸的是,它作为API公开,可用于编排“服务器”模式容器。 但是,如果您是maven用户,则更好的方法是附加到集成测试生命周期,并让maven启动和关闭服务器。

幸运的是,Pax Exam 项目还包括一个maven插件,可以插入到maven生命周期集成测试阶段。

例如,将其包含在pom.xml中 :

<plugin><groupId>org.ops4j.pax.exam</groupId><artifactId>exam-maven-plugin</artifactId><version>${pax.exam.version}</version><configuration><configClass>org.jboss.fuse.example.server.ServerConfiguration</configClass></configuration><executions><execution><goals><goal>start-container</goal><goal>stop-container</goal></goals></execution></executions></plugin>

请查看整个pom.xml ,其中显示了如何将它们分解为Maven配置文件并附加到Maven故障安全插件以进行集成测试。

配套服务

到目前为止,Pax Exam为使用JBoss Fuse运行我们的自动化集成测试做了大量工作。 但是,如果我们想将附加服务附加到容器的引导程序,该怎么办? 也许我们想在容器启动之前启动ActiveMQ的实例(因为也许我们有需要附加到外部ActiveMQ的服务……然后我们可以使用队列/ DLQ中的消息结果来断言行为,等等) ,并确保在测试结束时将其拆除。 您可以[扩展不同的Pax ExamReact器之一]来做到这一点:

public class ActiveMQPerClass extends PerClass {protected BrokerService brokerService = null;@Overridepublic StagedExamReactor create(List<TestContainer> containers, List<TestProbeBuilder> mProbes) {return new EagerSingleStagedReactor(containers, mProbes){@Overridepublic void beforeClass() {bootStrapActiveMQ();super.beforeClass();}@Overridepublic void afterClass() {teardownActiveMQ();super.afterClass();}};}

然后在测试中,当您指定要使用的React堆策略时,请使用我们的自定义策略:

@RunWith(PaxExam.class)
@ExamReactorStrategy(ActiveMQPerClass.class)
public class BootstrapIT extends FuseTestSupport {@Inject@Filter("(camel.context.name=rider-auto-backend)")protected CamelContext camelContext;@Testpublic void testBootstrap() {.....

熔丝面料

这篇文章涵盖了针对独立版本的Fuse编写集成测试。 许多相同的机制也将用于针对Fuse Fabric / Fabric8部署创建集成测试。 这将在本文的第二部分中介绍。 敬请关注! 也可以在Twitter @christianposta上关注我,了解有关Fuse / Fabric8 / Microservices / DevOps等的推文,以及有关新博客文章的更新!

翻译自: https://www.javacodegeeks.com/2015/04/integration-testing-jboss-fuse-6-x-with-pax-exam-part-i.html

aix pax

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

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

相关文章

android王者调不了界面,王者荣耀登录界面怎么改?登录界面更改教程[多图]

王者荣耀登录界面怎么改&#xff1f;许多玩家都想更改自己登陆的界面&#xff0c;但是都不清楚&#xff0c;下面就让安卓乐园小编为大家带来&#xff0c;登录界面更改教程。王者荣耀登录界面怎么改&#xff1f;1、安卓手机打开文件管理&#xff0c;找到根目录下Android/data/co…

y空间兑换代码_Python爬虫实战:QQ空间全自动点赞工具

QQ空间自动点赞前景提要目标确定分析介绍登陆获取cookie寻找XML寻找可变参数获取第一个空间动态寻找点赞所需的URL寻找可变参数功能提升到秒赞全部代码最后还是希望你们能给我点一波小小的关注。奉上自己诚挚的爱心私信小编01即可获取大量Python学习资料前景提要因为我周围的小…

学点 STL C++ 无序容器和元组

点击蓝字关注我们无序容器我们已经熟知了传统 C 中的有序容器 std::map/std::set&#xff0c;这些元素内部通过红黑树进行实现&#xff0c; 插入和搜索的平均复杂度均为 O(log(size))。在插入元素时候&#xff0c;会根据 < 操作符比较元素大小并判断元素是否相同&#xff0c…

html中的文档格式及举例,跟我一起从零开始学习WebAssembly(三)、最简单的例子hello world(使用自定义HTML模板)...

文章目录创建C代码片创建我们的自定义HTML模板文件编译运行实例有时我们想要使用我们自定义HTML模板。让我们来看看我们如何做到这一点。创建C代码片首先&#xff0c;创建一个名为hello2的目录。其次&#xff0c;在该目录下创建一个名为hello2.c文件。并将以下C代码保存在文件中…

设计模式适配器模式_21世纪的设计模式:适配器模式

设计模式适配器模式这是我的演讲的第三部分&#xff0c;“ 21世纪的设计模式” 。 适配器模式桥接世界。 在一个世界中&#xff0c;我们有一个概念的界面。 在另一个世界&#xff0c;我们有不同的界面。 这两个接口有不同的用途&#xff0c;但有时我们需要进行转移。 在编写良…

excel单元格斜线_掌握这20个Excel技巧,小白轻松变大神

掌握一些Excel小技巧&#xff0c;可以让你的工作效率翻倍&#xff0c;原本半个小时才能搞定的&#xff0c;现在几秒就可以轻松搞定。1、调整单元格大小选中表格&#xff0c;将光标移到表格顶部边框处&#xff0c;等其变成双向箭头即可移动。2、快速插入空行选中行&#xff0c;按…

html鼠标滚动效果代码,JS+CSS实现大气清新的滑动菜单效果代码

本文实例讲述了JSCSS实现大气清新的滑动菜单效果代码。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这是一款比较大气清新的滑动导航菜单&#xff0c;CSS和JavaScript配合完成&#xff0c;鼠标放到一级菜单上&#xff0c;会滑出二级的菜单&#xff0c;兼容性也不错&a…

docker和java容器_使用Docker容器和Java EE进行持续交付

docker和java容器组织需要一种使应用程序交付快速&#xff0c;可预测和安全的方法&#xff0c;而诸如docker之类的容器所提供的敏捷性则可以帮助开发人员实现这一目标。 对于Java EE应用程序&#xff0c;这可以在容器中打包应用程序&#xff0c;应用程序服务器和其他依赖项&…

alientek ministm32液晶显示程序_佳显12864中文字库液晶专业生产液晶显示模块

GDRAM&#xff1a;(Graphic Display RAM)&#xff1a;图形显示RAM&#xff0c;这一块区域用于绘图&#xff0c;往里面写啥&#xff0c;屏幕就会显示啥&#xff0c;它与DDRAM的区别在于&#xff0c;往DDRAM中写的数据是字符的编码&#xff0c;字符的显示先是在CGROM中找到字模&a…

C++ 面试考点(一)

点击蓝字关注我们C 基础1、引用和指针的区别&#xff1f;初始化:引用在定义的时候必须进行初始化&#xff0c;并且不能够改变指针在定义的时候不一定要初始化&#xff0c;并且指向的空间可变访问逻辑不同:通过指针访问对象, 用户需要使用间接访问通过引用访问对象, 用户只需使用…

dojo还有人用吗_我的Dojo中有一个Mojo(如何编写Maven插件)

dojo还有人用吗我一直忙于在工作中使用Maven的腋窝。 对于很多开发人员&#xff0c;我会听到&#xff1a;“那又怎样。” 区别在于&#xff0c;我通常在无法直接访问Internet的环境中工作。 因此&#xff0c;当我说我经常使用Maven时&#xff0c;这意味着某些事情。 依赖地狱 …

html5 css3炫酷效果,28种纯CSS3炫酷loading加载动画特效

这是一组效果非常炫酷的纯CSS3 Loading加载动画特效。这组loading动画共有27种不同的效果。每一种loading动画都是通过CSS3的keyframes帧动画来完成的&#xff0c;每一个加载动画都构思新颖&#xff0c;效果非常的酷。安装可以通过bower来按钮这个loading动画特效&#xff1a;b…

中点和中值滤波的区别_频谱仪和EMI测试接收机什么区别?安泰维修中心分享

测试人员在选择使用射频仪器的时候都在纠结选择频谱仪还是测试接收机又或者信号分析仪。下面由安泰频谱分析仪维修中心分享频谱仪和EMI测试接收机什么区别&#xff1f;测量接收机是什么&#xff1f;频谱仪和信号分析仪什么区别&#xff1f;信号源分析仪是什么&#xff1f;一、频…

C++ 面试必问:深入理解虚函数表

点击蓝字关注我们深入理解C 虚函数表C中的虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。Derive d; Base1 *b1 &d; Base2 *b2 &d; Base3 *b3 &…

html 图片剪裁压缩,HTML5 canvas实现图片拉伸、压缩与裁剪

前言&#xff1a;我们在网页中经常会用到图片展示&#xff0c;通常情况下会给一个固定的宽高来显示这个图片&#xff0c;然而从服务器端上传的图片大小是不确定的&#xff0c;如果直接按默认填充这个框有时候就会特别丑orz。作为一个完(wai)美(mao)主(xie)义(hui)者&#xff0c…

switch日文键盘打中文_12月有哪些Switch游戏值得期待?

文章转自A9vg&#xff0c;作者setsuka_duki 经历了11月的游戏浪潮后&#xff0c;一年中最后一个月份也悄然而至&#xff0c;相比较“战火连天”的11月&#xff0c;在12月发售的重量级游戏并不算太多&#xff0c;这边为大家整理12月哪些值得一玩的Switch游戏。 《Tools Up!》(分…

基于 C++11 的线程池 threadpool , 简洁且可以带任意多的参数

点击蓝字关注我们咳咳。C11 加入了线程库&#xff0c;从此告别了标准库不支持并发的历史。然而 c 对于多线程的支持还是比较低级&#xff0c;稍微高级一点的用法都需要自己去实现&#xff0c;譬如线程池、信号量等。线程池(thread pool)这个东西&#xff0c;在面试上多次被问到…

c# 字典排序_Python零基础入门之列表与字典

本篇内容需结合源码&#xff0c;获取方法看末尾数据结构数据结构就是指从计算机存储、组织数据的结构列表(List) 元组(Tuple)字典(Dictionary)集合(Set)列表(List)列表中的数据按顺序排列列表有正序与倒序两种索引列表可存储任意类型数据&#xff0c;且允许重复创建列表变量名 …

jaxb xsd生成xml_使用JAXB和Jackson从XSD生成JSON模式

jaxb xsd生成xml在本文中&#xff0c;我演示了一种从XML Schema &#xff08;XSD&#xff09;生成JSON Schema的 方法 。 在概述从XML Schema创建JSON Schema的方法的同时&#xff0c;本文还演示了JAXB实现的使用&#xff08;与JDK 9捆绑在一起的xjc版本2.2.12-b150331.1824 [b…

C语言中结构体struct的用法

点击蓝字关注我们定义结构体变量下面举一个例子来说明怎样定义结构体变量。struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; }person;这个例子定义了一个结构名为string的结构体变量person。还可以省略变量名…