`
MyNameSky
  • 浏览: 28966 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论
阅读更多
DBUnit入门2008-12-18 21:32相信做过单元测试的人都会对JUnit非常的熟悉了,今天要介绍的DbUnit(http://dbunit.sourceforge.net/)则是专 门针对数据库测试的对JUnit的一个扩展,它可以将测试对象数据库置于一个测试轮回之间的状态。鉴于目前国内介绍DbUnit的系统教程比较少见,本文 将分从理论和实例两个方面带你领略DbUnit的精彩世界。

DbUnit设计理念
熟悉单元测试的开发人员都知道,在对数据库进行单元测试时候,通常采用的方案有运用模拟对象(mock objects)和stubs两种。通过隔离关联的数据库访问类,比如JDBC的相关操作类,来达到对数据库操作的模拟测试。然而某些特殊的系统,比如利 用了EJB的CMP(container-managed persistence)的系统,数据库的访问对象是在最底层而且很隐蔽的,那么这两种解决方案对这些系统就显得力不从心了。

DBUnit的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后,读入备份数据库,回溯到测试前的状态;
而且又因为DBUnit是对JUnit的一种扩展,开发人员可以通过创建测试用例代码,在这些测试用例的生命周期内来对数据库的操作结果进行比较。

DbUnit测试基本概念和流程
基于DbUnit 的测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据。
可以将数据库模式的全部内容表示为单个IDataSet 实例。这些表本身由Itable 实例来表示。
IDataSet 的实现有很多,每一个都对应一个不同的数据源或加载机制。最常用的几种 IDataSet实现为:
FlatXmlDataSet:数据的简单平面文件 XML 表示
QueryDataSet:用 SQL 查询获得的数据
DatabaseDataSet:数据库表本身内容的一种表示
XlsDataSet :数据的excel表示

一般而言,使用DbUnit进行单元测试的流程如下:
1 根据业务,做好测试用的准备数据和预想结果数据,通常准备成xml格式文件。
2 在setUp()方法里边备份数据库中的关联表。
3 在setUp()方法里边读入准备数据。
4 对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。
5 在tearDown()方法里边,把数据库还原到测试前状态。

DbUnit开发实例
下面通过一个实例来说明DbUnit的实际运用。

实例准备
比如有一个学生表[student],结构如下:


--------------------------------------------------------------------------------
id char(4) pk 学号
name char(50) 姓名
sex char(1) 性别
birthday date 出生日期

--------------------------------------------------------------------------------
准备数据如下:

--------------------------------------------------------------------------------
id name sex birthday
0001 翁仔 m 1979-12-31
0002 王翠花 f 1982-08-09
--------------------------------------------------------------------------------
测试对象类为StudentOpe.java,里边有2个方法:
findStudent(String id) :根据主键id找记录
addStudent(Student student) :添加一条记录

在测试addStudent方法时候,我们准备添加如下一条数据

--------------------------------------------------------------------------------
id name sex birthday
0088 王耳朵 m 1982-01-01

--------------------------------------------------------------------------------
那么在执行该方法后,数据库的student表里的数据是这样的:

--------------------------------------------------------------------------------
id name sex birthday
0001 翁仔 m 1979-12-31
0002 王翠花 f 1982-08-09
0088 王耳朵 m 1982-01-01

--------------------------------------------------------------------------------

然后我们说明如何对这2个方法进行单元测试。

实例展开
1 把准备数据和预想数据转换成xml文件
student_pre.xml


--------------------------------------------------------------------------------
<?xml version='1.0' encoding="gb2312"?>
<dataset>
<student id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
<student id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
</dataset>

--------------------------------------------------------------------------------

student_exp.xml

--------------------------------------------------------------------------------
<?xml version='1.0' encoding="gb2312"?>
<dataset>
<student id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
<student id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
<student id="0088" name="王耳朵" sex="m" birthday="1982-01-01"/>
</dataset>

--------------------------------------------------------------------------------

2 实装setUp方法,详细见代码注释。


--------------------------------------------------------------------------------
protected void setUp() {
IDatabaseConnection connection =null;
try{
super.setUp();
//本例使用postgresql数据库
Class.forName("org.postgresql.Driver");
//连接DB
Connection conn=DriverManager.getConnection("jdbc:postgresql:testdb.test","postgres","postgres");
//获得DB连接
connection =new DatabaseConnection(conn);

//对数据库中的操作对象表student进行备份
QueryDataSet backupDataSet = new QueryDataSet(connection);
backupDataSet.addTable("student");
file=File.createTempFile("student_back",".xml");//备份文件
FlatXmlDataSet.write(backupDataSet,new FileOutputStream(file));

//准备数据的读入
IDataSet dataSet = new FlatXmlDataSet( new FileInputStream("student_pre.xml"));
DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);

}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(connection!=null) connection.close();
}catch(SQLException e){}
}
}

--------------------------------------------------------------------------------
3 实装测试方法,详细见代码注释。

*检索类方法,可以利用assertEquals()方法,拿表的字段进行比较。

--------------------------------------------------------------------------------
// findStudent
public void testFindStudent() throws Exception{
//执行findStudent方法
StudentOpe studentOpe=new StudentOpe();
Student result = studentOpe.findStudent("0001");

//预想结果和实际结果的比较
assertEquals("翁仔",result.getName());
assertEquals("m",result.getSex());
assertEquals("1979-12-31",result.getBirthDay());
}

--------------------------------------------------------------------------------

*更新,添加,删除等方法,可以利用Assertion.assertEquals()方法,拿表的整体来比较。

--------------------------------------------------------------------------------
public void testAddStudent() throws Exception{
//执行addStudent方法
StudentOpe studentOpe=new StudentOpe();
//被追加的记录
Student newStudent = new Student("0088","王耳朵","m","1982-01-01");
//执行追加方法
Student result = studentOpe.addStudent(newStudent);

//预想结果和实际结果的比较
IDatabaseConnection connection=null;

try{

//预期结果取得
IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream("student_exp.xml"));
ITable expectedTable = expectedDataSet.getTable("student");

//实际结果取得
Connection conn=getConnection();
connection =new DatabaseConnection(conn);

IDataSet databaseDataSet = connection.createDataSet();
ITable actualTable = databaseDataSet.getTable("student");

//比较
Assertion.assertEquals(expectedTable, actualTable);

}finally{
if(connection!=null) connection.close();
}
}

--------------------------------------------------------------------------------

*如果在整体比较表的时候,有个别字段不需要比较,可以用DefaultColumnFilter.excludedColumnsTable()方法,
将指定字段给排除在比较范围之外。比如上例中不需要比较birthday这个字段的话,那么可以如下代码所示进行处理:

--------------------------------------------------------------------------------
ITable filteredExpectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"birthday"});
ITable filteredActualTable = DefaultColumnFilter.excludedColumnsTable(actualTable,new String[]{"birthday"});
Assertion.assertEquals(filteredExpectedTable, filteredActualTable);

--------------------------------------------------------------------------------

4 在tearDown()方法里边,把数据库还原到测试前状态

--------------------------------------------------------------------------------
protected void tearDown() throws Exception{

IDatabaseConnection connection =null;
try{
super.tearDown();
Connection conn=getConnection();
connection =new DatabaseConnection(conn);

IDataSet dataSet = new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);

}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(connection!=null) connection.close();
}catch(SQLException e){}
}

}

--------------------------------------------------------------------------------

最后
无疑,使用DbUnit能够极大的提高数据库测试的效率,希望通过本文能够让您掌握这一数据库测试的利器
(转自:http://www.blogjava.net/liuzheng/articles/190128.html)
分享到:
评论

相关推荐

    dbunit-2.4.7所有jar以及dbunit入门教程

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架(如 JUnit)的一个扩展。在数据库驱动的项目中,DBUnit 可以帮助开发者确保数据库状态的一致性,使得测试更加可靠。DBUnit 2.4.7 版本包含了...

    dbunit-2.4.9 源码

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供了数据驱动测试的解决方案。在版本 2.4.9 中,DBUnit 提供了一系列的功能,帮助开发者在进行单元测试时能够管理和操作数据库的...

    Dbunit数据库连接下载

    Dbunit 是一个强大的Java库,专门用于数据库的测试和数据管理。它被广泛应用于软件开发过程中,特别是对于那些依赖于数据库的应用程序,因为Dbunit能够帮助开发者有效地管理和控制数据库的状态,确保测试的一致性...

    dbunit帮助文档(HTML版)

    DBUnit是一款开源的Java库,专门用于数据库测试,它遵循TestNG或JUnit测试框架。这个HTML版的帮助文档是从官方站点`http://www.dbunit.org/apidocs/index.html`获取的,包含了DBUnit的所有核心功能和用法的详细说明...

    dbunit使用必需Jar包

    DBUnit 是一个开源的 Java 工具,它与JUnit结合使用,用于数据库的测试驱动开发(TDD)。在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,DBUnit 提供了这样的功能,它允许开发者导入和导出数据库...

    DBUNIT使用

    DBUNIT 使用 DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库...

    通过DBUNIT做批量对比测试

    DBUNIT 是一个开源的 Java 库,专门用于数据库测试,它提供了一种结构化的方法来设置和验证数据库的状态。在软件开发中,测试是保证代码质量和功能正确性的重要环节,而 DBUNIT 尤其适用于对数据库操作进行测试,...

    DBUnit 进行单元测试

    DBUnit 是一个强大的Java库,专门用于数据库的单元测试。它与JUnit和其他测试框架结合使用,可以帮助开发者在数据库层面上确保代码的正确性。DBUnit 提供了一种结构化的方式来导入和导出数据库数据,使得测试环境...

    介绍dbunit的使用和原理,核心组件介绍

    DbUnit 是一个针对数据库驱动项目的JUnit扩展,同时也可用于Ant构建工具。它的主要功能是能够将数据库数据导出到XML数据集,并从XML数据集中导入,从而支持数据库的测试和数据管理。DbUnit还允许你验证数据库中的...

    Junit+dbunit单元测试jar包

    `Junit` 和 `dbunit` 是两个非常重要的工具,它们分别针对Java应用程序的单元测试和数据库测试提供支持。让我们详细了解一下这两个库以及如何将它们结合使用。 `Junit` 是一个流行的开源Java单元测试框架,由Ernst ...

    DBUnit最佳实践之数据备份与恢复

    这篇“DBUnit最佳实践之数据备份与恢复”博文中,作者分享了如何有效地利用DBUnit进行数据备份和恢复,这对于开发和测试环境中的数据管理至关重要。 首先,我们需要了解DBUnit的基本概念。DBUnit是一个JUnit扩展,...

    junit4.10+dbunit2.4.7+httpunit+junitperf的jar包

    Junit4.10、DbUnit2.4.7、HttpUnit和JunitPerf是Java测试领域中常用的四个库,它们各自为不同的测试场景提供了强大的支持。下面将详细介绍这些库的功能和使用方法。 1. Junit4.10: Junit是Java编程语言中最著名的...

    DBUnit最佳实践之使用ant命令

    DBUnit 是一个 Java 开发者常用的数据库测试工具,它与JUnit等测试框架配合,能够帮助开发者在测试过程中管理和填充数据库,确保数据的一致性和准确性。本文将深入探讨如何结合Ant构建自动化测试流程,利用DBUnit...

    单元测试JUnit4和DbUnit

    DbUnit则是一个专门用于数据库单元测试的工具,它允许开发者在测试前后对数据库的状态进行操作,如填充测试数据、清理数据等,以保证每次测试都在一致的环境中进行。 首先,了解JUnit4的基础知识至关重要。JUnit4...

    如何使用DBUnit做数据备份恢复

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它提供了一种方式来管理和操作数据库的数据,包括数据的导入导出、备份和恢复。在本文中,我们将深入探讨如何利用 DBUnit 进行数据库的备份与恢复。 首先,我们...

    spring与dbunit集成测试

    在软件开发中,Spring框架是Java企业级应用的主流选择,而DBUnit则是一个用于数据库测试的工具。本文将深入探讨如何将Spring与DBUnit整合,以实现高效、可靠的数据库集成测试。 首先,理解Spring的核心功能是至关...

    主题:在Spring中结合Dbunit对Dao进行集成单元测试

    在Spring框架中,进行Dao层的集成单元测试时,常常会结合Dbunit工具来实现数据库相关的测试。Dbunit是一款强大的Java库,它扩展了JUnit,为数据库提供了结构化数据的导入和导出,使得测试更加方便和可靠。下面将详细...

    dbunit测试demo

    DBUnit 是一个 Java 编程语言的开源工具,专门用于数据库的单元测试。它与JUnit 结合使用,提供了一种结构化的方法来设置和验证数据库的状态,确保代码的正确性。在进行数据库驱动的应用程序开发时,DBUnit 可以帮助...

    dbunit开发文档

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架(如 JUnit)的一个扩展。在数据库驱动的项目中,DBUnit 提供了一种结构化的方法来设置和验证数据库状态,从而确保测试的一致性和可靠性。这...

Global site tag (gtag.js) - Google Analytics