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

50 篇文章 0 订阅
50 篇文章 11 订阅

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

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

二、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 {
	@Inject
	private Hello helloBean; // 注入一个Hello对象
	
	@Deployment
	public static JavaArchive createDeployment() {
		return ShrinkWrap.create(JavaArchive.class).addClass(Hello.class)
				.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
	}

	@Test
	public 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/arquillian
        http://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.0
     
     

	
     
     
      
      cn
     
     
	
     
     
      
      ftc
     
     
	
     
     
      
      1.0-SNAPSHOT
     
     
	
     
     
      
      pom
     
     
	
     
     
      
      railway safety monitor
     
     
	
     
     
      
      railway safety monitor
     
     
	
     
     
      
      http://dz.sdut.edu.cn/redmine
     
     

	
     
     
		
      
      
       
       ftc-ejb
      
      
		
      
      
       
       ftc-web
      
      
		
      
      
       
       ftc-ear
      
      
		
      
      
       
       ftc-tests
      
      
	
     
     
	
     
     
		
      
      
			
       
       
        
        JBoss repository
       
       
			
       
       
        
        http://repository.jboss.org/nexus/content/groups/public/
       
       
		
      
      
	
     
     
	
     
     
		
      
      
       
       phantomjs
      
      

		
      
      
		
      
      
       
       ftc
      
      
		
      
      
		
      
      
       
       slow
      
      
		
      
      
       
       12.0
      
      
		
      
      
       
       1.6.1
      
      
		
      
      
       
       7.1.1.Final
      
      
		
      
      
       
       0.5.8.201207111220
      
      

		
      
      
		
      
      
       
       1.6.2
      
      
		
      
      
		
      
      
       
       *firefoxproxy
      
      
		
      
      
       
       http://localhost:8080
      
      
		
      
      
       
       http://localhost:8180
      
      
		
      
      
       
       14444
      
      
		
      
      
       
       localhost
      
      
		
      
      
       
       0
      
      
		
      
      
       
       30000
      
      
		
      
      
       
       false
      
      
		
      
      
       
       ${project.build.directory}/ftest-logs
      
      
		
      
      
       
       ${project.build.directory}/ftest-output
      
      
		
      
      
       
       300
      
      
		
      
      
       
       true
      
      
		
      
      
       
       src/test/resources-ftest
      
      
		
      
      
       
       localhost
      
      
		
      
      
       
       /${project.build.finalName}/
      
      
		
      
      
       
       ${env.JBOSS_HOME}/server/all
      
      
		
      
      
       
       ${env.JBOSS_HOME}
      
      
		
      
      
       
       default
      
      
		
      
      
       
       ${env.CATALINA_HOME}
      
      
		
      
      
       
       false
      
      

		
      
      
		
      
      
		
      
      

		
      
      
		
      
      
       
       UTF-8
      
      

		
      
      
		
      
      
       
       1.6
      
      
		
      
      
       
       1.6
      
      

		
      
      
		
      
      
       
       ${maven.compiler.target}
      
      
		
      
      
       
       ${maven.compiler.source}
      
      

		
      
      
		
      
      
       
       postgresql
      
      
		
      
      
       
       postgresql
      
      
		
      
      
       
       9.1-901-1.jdbc4
      
      

		
      
      
       
       4.11
      
      
		
      
      
       
       1.1.2.Final
      
      


	
     
     


	
     
     


		
      
      

			
       
       
			
       
       
				
        
        
          org.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.enterprise
       
       
			
       
       
        
        cdi-api
       
       
			
       
       
        
        provided
       
       
		
      
      
		
      
      
			
       
       
        
        org.jboss.spec.javax.annotation
       
       
			
       
       
        
        jboss-annotations-api_1.1_spec
       
       
			
       
       
        
        provided
       
       
		
      
      
		
      
      
			
       
       
        
        junit
       
       
			
       
       
        
        junit
       
       
			
       
       
        
        test
       
       
		
      
      
		
      
      
			
       
       
        
        org.jboss.arquillian.junit
       
       
			
       
       
        
        arquillian-junit-container
       
       
			
       
       
        
        test
       
       
		
      
      

		
      
      
			
       
       
        
        org.jboss.arquillian.graphene
       
       
			
       
       
        
        graphene-webdriver
       
       
			
       
       
        
        2.0.1.Final
       
       
			
       
       
        
        pom
       
       
			
       
       
        
        test
       
       
		
      
      

	
     
     

	
     
     
		
      
      
       
       arquillian-demo
      
      
		
      
      
			
       
       
				
        
        
          maven-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} 
           
          
        
			
       
       
		
      
      

	
     
     
	
     
     
		
      
      
			
       
       
        
        firefox
       
       
			
       
       
				
        
        
          firefox 
        
			
       
       
		
      
      
		
      
      
			
       
       
        
        chrome
       
       
			
       
       
				
        
        
          chrome 
        
			
       
       
		
      
      
		
      
      
			
       
       
        
        arq-jboss-as-remote
       
       
			
       
       
				
        
         
         
           org.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.x
       
       
			
       
       
				
        
         
          
          
            maven-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.0
     
     
	
     
     
		
      
      
       
       ftc
      
      
		
      
      
       
       cn
      
      
		
      
      
       
       1.0-SNAPSHOT
      
      
	
     
     

	
     
     
      
      cn.ftc
     
     
	
     
     
      
      ftc-tests
     
     
	
     
     
      
      ftc Integration Tests Module (EE6)
     
     


	
     
     
		
      
      
			
       
       
        
        cn.ftc
       
       
			
       
       
        
        ftc-ejb
       
       
			
       
       
        
        ejb
       
       
			
       
       
        
        test
       
       
		
      
      


		
      
      
		
      
      
			
       
       
        
        org.slf4j
       
       
			
       
       
        
        slf4j-log4j12
       
       
			
       
       
        
        test
       
       
		
      
      
		
      
      
			
       
       
        
        org.hibernate.javax.persistence
       
       
			
       
       
        
        hibernate-jpa-2.0-api
       
       
		
      
      
		
      
      
			
       
       
        
        org.jboss.spec.javax.faces
       
       
			
       
       
        
        jboss-jsf-api_2.1_spec
       
       
		
      
      


		
      
      



	
     
     

	
     
     
		
      
      
			
       
       
				
        
        
          src/test/resources 
        
			
       
       
		
      
      
	
     
     



    
    


以上修改在后续的功能测试中会用到。
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值