Arquillian测试框架快速上手教程 (一) - 环境搭建、容器适配、单元测试

本文主要是介绍Arquillian测试框架快速上手教程 (一) - 环境搭建、容器适配、单元测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本系列教程共五篇,分别是:

一、 环境搭建、容器适配、单元测试

二、JBoss Forge、ShrinkWrap快速指南

三、使用 Arquillian 进行Java持久化测试

四、使用Arquillian + Drone + Selenium + Graphene 进行Web自动化测试

五、使用 Arquillian 在云端进行测试

其中,Web容器以JBoss-as-7.1.1为例,工程以maven目录结构为准。


本文所涉及到的内容有:

1. Arquillian

2. Maven

3. JUnit

4. Seam Framework

5. ShrinkWrap

6. JBoss Forge


Arquillian简介

Arquillian是一个基于JUnit,由JBoss开发的新型测试框架,其主要目的是简化Java项目集成测试和功能测试的编写,让它们能像单元测试一样简单。Arquillian能真正在Web容器中运行测试,它主要通过三种方式与容器进行交互:
1.  嵌入式(embedded)。Arquillian和Web容器在同一个JVM中运行。
2. 受管理的(managed)。由Arquillian决定何时启动、关闭Web容器以便向容器中部署、运行测试。
3. 远程的(remote)。开发者事先启动Web容器,Arquillian连接该容器并将测试部署到容器中运行。

一个最简单的单元测试


创建maven工程

这里我们使用JBoss Forge来帮助我们快速创建maven标准目录和基本的pom.xml文件。
首先启动Forge:
forge

新建项目 arquillian-demo,指定包名为cn.demo:
new-project --named arquillian-demo --topLevelPackage cn.demo

这里就用这2条命令,我们将会手动编辑pom文件来添加arquillian的相关依赖。关于Forge的详细安装、使用方法,参见我另一篇文章: Debian-7.1下JBoss Forge + Arquillian测试环境搭建

为了方便编辑,我们将该项目导入至eclipse中:
在eclipse菜单栏中选择 File --> Import,在弹出的对话框中选择 "Existing Maven Project"。这样导入的好处是Eclipse会自动分析pom.xml文件,自动根据依赖设置classpath,写错了也能第一时间得到错误提示。

添加Arquillian相关依赖

打开pom.xml,我们能看到Forge已经为我们自动生成了以下内容:
<modelVersion>4.0.0</modelVersion><groupId>cn.demo</groupId><artifactId>arquillian-demo</artifactId><version>1.0.0-SNAPSHOT</version><repositories><repository><id>JBOSS_NEXUS</id><url>http://repository.jboss.org/nexus/content/groups/public</url></repository></repositories><build><finalName>arquillian-demo</finalName><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.6</source><target>1.6</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>

我们需要添加 dependency 和 dependencyManagement节点,修改完成后内容如下:
<modelVersion>4.0.0</modelVersion><groupId>cn.demo</groupId><artifactId>arquillian-demo</artifactId><version>1.0.0-SNAPSHOT</version><repositories><repository><id>JBOSS_NEXUS</id><url>http://repository.jboss.org/nexus/content/groups/public</url></repository></repositories><build><finalName>arquillian-demo</finalName><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.6</source><target>1.6</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build><!-- newly add starts --><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.1</version><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.junit</groupId><artifactId>arquillian-junit-container</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.1.3.Final</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><!-- newly add ends -->

保存后,eclipse会自动从远程仓库中下载相关jar包,稍等即可。

编写Bean和测试类

我们首先编写一个Hello类,内容如下:
package cn.demo;public class Hello {public String sayHello(String name) {return "hello," + name;}
}

该类的功能非常简单,传入一个名字,然后输出 hello + 名字。下面我们为这个类写单元测试。
新建HelloTest类,代码如下:
package cn.demo;import javax.inject.Inject;import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;@RunWith(Arquillian.class)
public class HelloTest {@Injectprivate Hello helloBean; // 注入一个Hello对象@Deploymentpublic static JavaArchive createDeployment() {return ShrinkWrap.create(JavaArchive.class).addClass(Hello.class).addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");}@Testpublic void isHelloValid() {Assert.assertNotNull(helloBean); // 判断注入是否成功Assert.assertEquals("hello,Neo", helloBean.sayHello("Neo")); // 判断返回值是否正确}
}

代码说明:
一个Arquillian测试必须有三部分内容,分别是:
1. @RunWith(Arquillian.class)注解。
2. 一个公有的、静态的、标注了@Deployment注解并返回一个Test Archive(稍后说明)的方法。
3. 至少有一个方法标有@Test注解。

@RunWith(Arquillian.class)注解的功能是通知 JUnit 让 Arquillian 接过控制权,做为测试的控制器(Test Controller)。那@Deployment是做什么用的呢?前面说过,Arquillian可以将测试直接部署到JBoss中运行,那怎么部署,部署哪些内容,就由这个标有@Deployment注解的方法来决定。Arquillian使用 ShrinkWrap API 来创建jar包、向jar包中添加资源(比如一个类),然后 ShrinWrap 会根据我们定义好的jar包生成一个真正的jar文件,最后由Arquillian把这个jar包部署到JBoss中去。本例中,首先调用ShrinkWrap类的静态方法 create(),传递 JavaArchive.class 以指定我们要创建的是jar类型的文件,然后调用 addClass() 方法向jar文件中添加类,调用 addAsManifectResource() 方法向jar中添加一个空的 beans.xml,最后将结果返回。关于ShrinkWarp的详细使用方法,参见官方的 快速指南。


添加容器适配器(Container Adapter)

Container Adapter是沟通 Arquillian 和 Web容器的桥梁,Arquillian 通过不同的 Container Adapter 来判断到底在哪种Web容器上运行测试,并通过它来控制容器。只要一个Web容器有其对应的Container Adapter,那么这个容器说可以运行 Arquillian测试。我们以remote方式的 JBoss-As-7.1.1(即开发者需事先启动JBoss,Arquillian会自动连接这个JBoss以运行测试)为例:
首先向pom.xml中添加profiles节点,内容如下:

<profiles><profile><id>arq-jbossas-remote</id><dependencies><dependency><groupId>org.jboss.spec</groupId><artifactId>jboss-javaee-6.0</artifactId><version>1.0.0.Final</version><type>pom</type><scope>provided</scope></dependency><dependency><groupId>org.jboss.as</groupId><artifactId>jboss-as-arquillian-container-remote</artifactId><version>7.1.1.Final</version><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.protocol</groupId><artifactId>arquillian-protocol-servlet</artifactId><scope>test</scope></dependency></dependencies></profile></profiles>

这里用profile的一大好处是,我们可以灵活的切换不同的Web服务器。比如,我们想在JBoss上跑测试,就执行
mvn test -Parq-jbossas-remote

如果我们想在GlassFish上运行测试,就可以定义一个名为 arq-glassfish-remote的profile,然后执行:
mvn test -Parq-glassfish-remote


运行测试

切换到工程根目录下,执行
mvn clean install -Dmaven.test.skip=true

注: -Dmaven.test.skip=true 的意思是让maven在执行clean install指令时不要进行测试。

mvn test -Parq-jbossas-remote

输出结果如下,则测试成功。(别忘了要事先启动JBoss!)



以managed方式运行测试

前面说过Arquillian可以以managed 的方式与JBoss进行交互,特点是我们不必事先启动JBoss,而在运行测试时,Arquillian会自动启动JBoss,并在完成测试后自动关闭JBoss。下面举例说明如何操作。 
首先,新建一个profile节点,内容如下:

<profile><id>arquillian-jbossas-managed</id><dependencies><dependency><groupId>org.jboss.spec</groupId><artifactId>jboss-javaee-6.0</artifactId><version>1.0.0.Final</version><type>pom</type><scope>provided</scope></dependency><dependency><groupId>org.jboss.as</groupId><artifactId>jboss-as-arquillian-container-managed</artifactId> <!-- 注意这里换成了managed而不是remote --><version>7.1.1.Final</version><scope>test</scope></dependency><dependency><groupId>org.jboss.arquillian.protocol</groupId><artifactId>arquillian-protocol-servlet</artifactId><scope>test</scope></dependency></dependencies></profile>

然后,为了让Arquillian “知道” 我们的JBoss放在哪, 我们需要在 main/src/resource 目录下创建一个名为 arquillian.xml的文件,通过这个文件我们可以设置 arquillian 的很多属性,类似于 web.xml 的功能。
arquillian.xml内容如下:

<arquillian xmlns="http://jboss.org/schema/arquillian"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jboss.org/schema/arquillianhttp://jboss.org/schema/arquillian/arquillian_1_0.xsd"><container qualifier="jbossas-managed" default="true"><configuration><property name="jbossHome">你的JBoss安装目录</property></configuration></container>
</arquillian>


切换到项目根目录下,运行
mvn test -Parquillian-jbossas-managed

从控制台输出可以看到,到 test 阶段时,Arquillian 会启动JBoss :


然后部署并运行测试,最后undeploy并关闭JBoss:



在我们的ftc的seam项目中如何使用Arquillian?

事实上,seam-2.3已经在pom文件自动加入Arquillian的相关依赖了。我们可以直接在 ftc-test 模块中写测试类,然后执行
mvn test -P你起的profile名

即可进行测试。但seam-2.3中默认使用TestNG而不是JUnit,所以还需要对pom文件进行修改。直接把ftc聚合模块的pom.xml改成下面的内容即可:
4.0.0cnftc1.0-SNAPSHOTpomrailway safety monitorrailway safety monitorhttp://dz.sdut.edu.cn/redmineftc-ejbftc-webftc-earftc-testsJBoss repositoryhttp://repository.jboss.org/nexus/content/groups/public/phantomjsftcslow12.01.6.17.1.1.Final0.5.8.2012071112201.6.2*firefoxproxyhttp://localhost:8080http://localhost:818014444localhost030000false${project.build.directory}/ftest-logs${project.build.directory}/ftest-output300truesrc/test/resources-ftestlocalhost/${project.build.finalName}/${env.JBOSS_HOME}/server/all${env.JBOSS_HOME}default${env.CATALINA_HOME}falseUTF-81.61.6${maven.compiler.target}${maven.compiler.source}postgresqlpostgresql9.1-901-1.jdbc44.111.1.2.Finalorg.jboss.arquillian arquillian-bom 1.1.2.Final pom import org.jboss.arquillian.extension arquillian-drone-bom 1.2.3.Final pom import org.jboss.arquillian.selenium selenium-bom 2.39.0 pom import cn.ftc ftc-ejb ${project.version} ejb cn.ftc ftc-web ${project.version} war cn.ftc ftc-ear ${project.version} org.jboss.seam bom 2.3.0.Final pom import commons-logging commons-logging 1.1.1 provided commons-collections commons-collections 3.2 provided com.google.guava guava ${guava.version} org.slf4j slf4j-log4j12 ${slf4j.version} ${jdbc.groupId} ${jdbc.artifactId} ${jdbc.version} test javax.enterprisecdi-apiprovidedorg.jboss.spec.javax.annotationjboss-annotations-api_1.1_specprovidedjunitjunittestorg.jboss.arquillian.junitarquillian-junit-containertestorg.jboss.arquillian.graphenegraphene-webdriver2.0.1.Finalpomtestarquillian-demomaven-compiler-plugin 3.1 1.6 1.6 UTF-8 maven-ear-plugin 2.7 org.codehaus.mojo build-helper-maven-plugin 1.7 maven-resources-plugin 2.5 org.jboss.as.plugins jboss-as-maven-plugin 7.3.Final deploy maven-ejb-plugin 2.3 3.0 maven-war-plugin 2.1.1 true false ${project.build.finalName} firefoxfirefox chromechrome arq-jboss-as-remoteorg.jboss.as jboss-as-arquillian-container-remote 7.1.1.Final test org.jboss.arquillian.protocol arquillian-protocol-servlet test arq-jboss_as_managed_7.xmaven-surefire-plugin 2.14.1 JBOSS_AS_MANAGED_7.X org.jboss.as jboss-as-arquillian-container-managed 7.1.1.Final 

然后将ftc-test 模块中的pom.xml 文件修改为以下内容:
4.0.0ftccn1.0-SNAPSHOTcn.ftcftc-testsftc Integration Tests Module (EE6)cn.ftcftc-ejbejbtestorg.slf4jslf4j-log4j12testorg.hibernate.javax.persistencehibernate-jpa-2.0-apiorg.jboss.spec.javax.facesjboss-jsf-api_2.1_specsrc/test/resources 


以上修改在后续的功能测试中会用到。

这篇关于Arquillian测试框架快速上手教程 (一) - 环境搭建、容器适配、单元测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922263

相关文章

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker