您的位置:首页 > 数据库

JUnit学习笔记20---对数据库应用程序进行单元测试4

2013-04-16 11:23 519 查看
5.用Ant运行Cactus测试

一步步的建立Ant文件

(图片备用链接)





建立数据库结构框图
建立web应用程序的war
编译Cactus测试
运行Cactus测试

1.建立数据库结构框图

Ant的SQL任务使得这步变得很简单,因为它可以执行任意的SQL命令,该对象从data.xml文件中读出sql,并依托由${database}属性定义的Hypersonic SQL数据库执行它。

<?xml version="1.0"?>

<project name="Database" default="test" basedir=".">

<property file="build.properties"/>
<property name="conf.dir" location="conf"/>

<target name="compile">
<mkdir dir="target/classes"/>
<javac destdir="target/classes" srcdir="src/java">
<classpath>
<pathelement location="${beanutils.jar}"/>
<pathelement location="${servlet.jar}"/>
</classpath>
</javac>
</target>

<target name="createdb">
<sql driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:${database}"
userid="sa"
password="">
<fileset dir="${conf.dir}">
<include name="data.sql" />
</fileset>
<classpath>
<pathelement location="${hsqldb.jar}"/>
</classpath>
</sql>
</target>


为了建立起数据库,还要在build.properties中定义两个Ant的属性:

cactus.home.jboss3x = C:/Apps/jboss-3.2.1

database = ${cactus.home.jboss3x}/server/default/data/hypersonic/default
hsqldb.jar = ${cactus.home.jboss3x}/server/default/lib/hsqldb.jar


创建web应用程序的war

这是一个web应用程序,所以你需要建立一个war来配置应用程序的target。你不需要在war中包含任何与Cactus相关的东西,因为你将使用Ant/Cactus的集成工具来使用这些war。

要创建该war,首先要编译两个源文件。因此创建两个target:compile和war

<target name="compile">
<mkdir dir="target/classes"/>
<javac destdir="target/classes" srcdir="src/java">
<classpath>
<pathelement location="${beanutils.jar}"/>
<pathelement location="${servlet.jar}"/>
</classpath>
</javac>
</target>

<target name="war" depends="compile">
<war destfile="target/database.war"
webxml="src/webapp/WEB-INF/web.xml">
<classes dir="target/classes"/>
<lib file="${beanutils.jar}"/>
<lib file="${collections.jar}"/>
</war>
</target>


为了将他们建立起来,还需要在build.properties中建立三个Ant属性:

lib.dir = ../repository


beanutils.jar = ${lib.dir}/commons-beanutils/jars/commons-beanutils-1.6.1.jar
collections.jar = ${lib.dir}/commons-collections/jars/commons-collections-2.1.jar
servlet.jar = ${lib.dir}/servletapi/jars/servletapi-2.3.jar


编译Cactus测试

在你运行Cactus测试之前,需要添加一个如下所示的target以编译这些测试:

<target name="compile.cactustest">
<mkdir dir="target/cactus-test-classes"/>
<javac destdir="target/cactus-test-classes"
srcdir="src/test-cactus">
<classpath>
<pathelement location="target/classes"/>
<pathelement location="${beanutils.jar}"/>
<pathelement location="${dbunit.jar}"/>
<pathelement location="${cactus.jar}"/>
</classpath>
</javac>
<copy todir="target/cactus-test-classes">
<fileset dir="src/test-cactus">
<include name="**/*.xml"/>
</fileset>
</copy>
</target>


你需要为DbUnit和Cactus添加一些jar来编译类路径。在build.properties文件中写入:

cactus.jar = ${lib.dir}/cactus/jars/cactus-13-1.5-beta1.jar
dbunit.jar = ${lib.dir}/dbunit/jars/dbunit-1.5.5.jar


2. 以java资源的形式加载data.xml

运行Cactus测试

你已经几乎可以用来自Cactus/Ant集成模块的Ant任务cactus来执行测试了,但是,你还需要一个被Cactus化的war传递给cactus任务。Ant任务的cactifywar可以为你处理这件事情。你需要在编译文件中定义它们
添加所有的Cactus jar到taskdef路径中去,该类路径将被cactifywar和cactus使用。Cactifywar任务将Cactus jar放到cactified war中去,cactus任务将Cactus jar放到测试执行路径中去。

<target name="test" depends="war,compile.cactustest">

<taskdef resource="cactus.tasks">
<classpath>
<pathelement location="${cactus.ant.jar}"/>
<pathelement location="${cactus.jar}"/>
<pathelement location="${logging.jar}"/>
<pathelement location="${aspectjrt.jar}"/>
<pathelement location="${httpclient.jar}"/>
</classpath>
</taskdef>

<cactifywar srcfile="target/database.war"
destfile="target/test.war">
<classes dir="target/cactus-test-classes"/>
<lib file="${dbunit.jar}"/>
<lib file="${exml.jar}"/>
</cactifywar>

<cactus warfile="target/test.war" fork="yes" printsummary="yes"
haltonerror="true" haltonfailure="true">
<containerset>
<jboss3x dir="${cactus.home.jboss3x}"
output="target/jbossresult.txt"/>
</containerset>
<formatter type="brief" usefile="false"/>
<batchtest>
<fileset dir="src/test-cactus">
<include name="**/TestJdbcDataAccessManagerIC.java"/>
</fileset>
</batchtest>
<classpath>
<pathelement location="target/classes"/>
<pathelement location="target/cactus-test-classes"/>
<pathelement location="${dbunit.jar}"/>
</classpath>
</cactus>

</target>


Cactus任务是junit Ant任务的扩展。因此所有的junit任务可用的属性cactus任务也可以直接使用。你需要告诉cactus任务你想要什么样的容器来运行测试,这个例子中,我们使用了JBoss3.2.1,因此为jboss3x元素。Cactus任务支持许多其它容器。

这个例子仅需众多Cactus/Ant集成测试模块可用功能中的一部分。如果想了解更多内容,请访问(http://jakarta.apache.org/cactus

执行Cacus测试

……

6.改进构建性能

本例中只有一个单元测试,进行的时间是很短暂的,但是当我们的测试非常多的时间的时候,那么,这种测试的时间是非常可观的,为了提高效率,我们可以从下面的几点着手:

分解出只读数据 数据库中有些数据是不会在程序运行过程中修改的,创建一个类,在TestSetup类中预置它们
按功能将测试分组 将测试组合起来可以共享资源,减少开销
使用驻留内存 例如Hypersonic SQL有一对运行着的测试非常理想的驻留内存模块

7.数据库整体单元测试策略

到此,我们已经知道了如何在数据库内进行测试了,选择一种方法:

mock objects/功能测试 为业务逻辑部分编写一个mock风格的单元测试,同样为数据库访问层写一个mock风格的单元测试。
cautus 集成/功能单元测试
应用持续的集成 在项目开始的时候就使用Ant工具

8.小结

在本章中,我们介绍了3种简单的单元测试形式,他们可以测试调用实际数据库的访问代码:隔离开数据库测试商业代码的业务逻辑单元测试(business logic unit test),隔离开数据库测试数据库访问代码的单元测试(data access unit test),以及集成单元测试(integration unit tests)。

业务逻辑测试及数据访问单元测试作为普通的JUnit测试在mock objects的帮助下很容易运行。

对于集成单元测试,我们学习了强大的Cactus/DbUnit组合。这不仅从容器内部进行测试,而且从Ant自动运行。这就为持续集成铺平了道路。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: