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

本文介绍如何使用Ant和Cactus进行数据库集成测试。包括构建Ant脚本、编译Cactus测试、运行Cactus测试等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.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>


  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自动运行。这就为持续集成铺平了道路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值