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足够相似以进行测试。
因此,为了不仅帮助其他想要开始使用Pax Exam进行集成测试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 Exam反应器之一]来做到这一点:
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();}};}
然后在测试中,当您指定要使用的反应堆策略时,请使用我们的自定义策略:
@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