Arquillian测试框架快速上手教程(三)- 使用 Arquillian 进行Java持久化测试

2024-04-21 05:32

本文主要是介绍Arquillian测试框架快速上手教程(三)- 使用 Arquillian 进行Java持久化测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

二、JBoss Forge、ShinkWrap快速指南

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

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

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

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


本文所涉及到的内容有:

1. JPA

2. Arquillian

3. Maven

4. JUnit

5. PostgreSql


添加JPA相关依赖

这里我们沿用上一篇文章的项目目录结构和配置。数据库使用PostgreSql-9.1,以Hibernate为JPA具体实现。打开 arquillian-demo 的pom.xml,在 dependencies 节点中添加以下内容:
<dependencies><!-- JPA --><dependency><groupId>org.hibernate.javax.persistence</groupId><artifactId>hibernate-jpa-2.0-api</artifactId><version>1.0.1.Final</version></dependency><!-- hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>4.0.1.Final</version></dependency><!-- log4j --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency><!-- JDBC Driver --><dependency><groupId>postgresql</groupId><artifactId>postgresql</artifactId><version>9.1-901.jdbc4</version></dependency></dependencies>


编写 Entity Bean 和测试 Bean

Entity Bean:

我们在 cn.demo 包下创建一个最简单的 Entity Bean:

package cn.demo;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;@Entity
public class Member {@Id @GeneratedValueprivate Integer id;private String username;public Member() {} // 提供空构造函数public Member(String name) {this.username = name;}@Overridepublic String toString() {return this.username;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}}

Test Bean:

Test Bean依然需要"三大件",即 @Deployment、@RunWith(Arquillian.class) 和 @Test。

@RunWith(Arquillian.class)
public class MemberTest {@Injectprivate UserTransaction ut;@PersistenceContext(unitName = "test")private EntityManager em;private static String[] members = {"Bruce", "Neo", "Kitty"};private static final String QUERY_SQL = "select m from Member m";@Deploymentpublic static WebArchive deploy() {WebArchive war = ShrinkWrap.create(WebArchive.class, "MemberTest.war").addPackage(Member.class.getPackage()) // 将 Member.class 和其所在的包一并添加进去.addAsResource("test-persistence.xml", "META-INF/persistence.xml") // 添加 persistent unit 配置文件.addAsWebInfResource("jboss-ds.xml") // 添加 DataSource 声明文件.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");// 调用war的toString(true)方法可以将打包后的目录结构输出到控制台System.out.println(war.toString(true));return war;}// ... ...


由于我们是在JBoss中运行测试,因此我们需要先向JBoss注册一个数据源,以声明数据的来源。向JBoss注册数据源有2种方式,一是编辑standalone.xml 文件,添加 data-srouce节点,另一种是在项目中创建 *-ds.xml文件,JBoss会在应用部署的时候自动读取这个文件,动态注册数据源。这里我们采用第二种方式。

在src/test/resources目录下新建 jboss-ds.xml ,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.jboss.org/ironjacamar/schemahttp://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd"><datasource enabled="true" jndi-name="jdbc/arquillian" <!-- 数据源的 JNDI 查找名称 -->pool-name="ArquillianEmbeddedH2Pool"><!-- jap-test 数据库必须事先创建 --><connection-url>jdbc:postgresql://localhost:5432/jpa-test</connection-url><!-- 该dirver必须在JBoss的standalone.xml中声明 --><driver>postgresql</driver><security><user-name>postgres</user-name><password>111111</password></security></datasource>
</datasources>

然后在同样的目录下新建 test-persistence.xml(使用ShrinkWarp部署时会将其动态更名为persistence.xml) 文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="test" transaction-type="JTA"><!-- 此处必须与 jboss-ds.xml文件中的jndi-name节点内容一致 --><jta-data-source>jdbc/arquillian</jta-data-source><properties><property name="hibernate.hbm2ddl.auto" value="create-drop" /><property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /><property name="hibernate.show_sql" value="true" /><property name="hibernate.format_sql" value="true" /></properties></persistence-unit>
</persistence>

说明:
1. 因为程序的运行环境为JBoss,所以 "transaction-type" 必须指定为 "JTA"。如果是非容器环境,该属性应为 " RESOURCE_LOCAL"(也是默认值)。
2. 如果使用PostgreSql,则 "hibernate.dialect" 属性必须指定为 "org.hibernate.dialect.PostgreSQLDialect", 否则运行时会报语法错误。
3. 如果 "hibernate.hbm2dll.auto" 属性为 "update",那么数据库中必须事先存在相应的表,否则会报错。


接下来编辑测试代码。程序逻辑很简单,先清除member表中的源有记录,然后插入新记录,最后从数据库中取出数据,验证结果。

@Test方法代码如下:
@Testpublic void test() throws Exception {ut.begin();System.out.println("正在查询 ...");List<Member> memberList = em.createQuery(QUERY_SQL).getResultList();ut.commit();Assert.assertTrue(validateData(memberList));}

在运行Test之前,我们需要先清除表中原有数据。这时候我们可以定义一个prepareTest()方法,并对其添加  @Before 注解。标有该注解的方法会在 @Test 方法之前执行。同样, JUnit还提供 @After 注解,标有 @After 的方法会在所有的 @Test 方法执行完后运行。

@Beforepublic void prepareTest() throws Exception {clearData(); // 清理表中原有数据insertData(); // 插入新记录}

然后是自定义的 clearData() 方法和 insertData()方法:
/*** 向Member表中插入3条记录* @throws Exception*/private void insertData() throws Exception {ut.begin();System.out.println("插入记录 ...");for(String name : members) {Member mem = new Member(name);em.persist(mem);;}ut.commit();}/*** 将member表中的原有数据清除。* @throws Exception*/private void clearData() throws Exception {ut.begin();System.out.println("清理旧数据 ...");em.createQuery("delete from Member").executeUpdate();ut.commit();}

最后是 validateData() 方法,其作用是验证取出的数据,看看是否与我们插入的数据相同。
/*** 判断List对象中是否包含了members数据中所有的元素。* @param list 数据库查询结果* @return 全部包含返回true, 反之为false*/private boolean validateData(List<Member> list) {Set<String> nameSet = new HashSet<String>();for(Member mem : list) {System.out.println("取出数据:" + mem.getUsername());nameSet.add(mem.getUsername());}return nameSet.containsAll(Arrays.asList(members));}


运行测试

到这里项目的目录结构应该如下图所示:


先启动JBoss7,然后切换到项目目录下,执行
mvn clean install -Dmaven.test.skip=true
mvn test -Parq-jbossas-remote

看到如下输出即测试成功。

这篇关于Arquillian测试框架快速上手教程(三)- 使用 Arquillian 进行Java持久化测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个