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

来源:互联网 发布:潮阳 电商美工培训 编辑:程序博客网 时间:2024/06/16 03:46

5.用Ant运行Cactus测试

一步步的建立Ant文件

(图片备用链接)

image

  1. 建立数据库结构框图
  2. 建立web应用程序的war
  3. 编译Cactus测试
  4. 运行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.1database = ${cactus.home.jboss3x}/server/default/data/hypersonic/defaulthsqldb.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.jarcollections.jar = ${lib.dir}/commons-collections/jars/commons-collections-2.1.jarservlet.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>


  1. 你需要为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测试

  1.   你已经几乎可以用来自Cactus/Ant集成模块的Ant任务cactus来执行测试了,但是,你还需要一个被Cactus化的war传递给cactus任务。Ant任务的cactifywar可以为你处理这件事情。你需要在编译文件中定义它们
  2. 添加所有的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.数据库整体单元测试策略

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

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

8.小结

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

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

       对于集成单元测试,我们学习了强大的Cactus/DbUnit组合。这不仅从容器内部进行测试,而且从Ant自动运行。这就为持续集成铺平了道路。

原创粉丝点击