`
cppmule
  • 浏览: 447185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

DBUnit入门

 
阅读更多

DBUnit入门

相信做过单元测试的人都会对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能够极大的提高数据库测试的效率,希望通过本文能够让您掌握这一数据库测试的利器
分享到:
评论

相关推荐

    dbunit入门实例

    **DbUnit 入门指南** DbUnit 是一个用于数据库测试的开源 Java 工具,它提供了数据驱动测试的框架,可以有效地管理和填充测试数据库。在软件开发中,尤其是在进行单元测试时,确保数据库状态的一致性至关重要。...

    DbUnit入门实战

    DbUnit 入门实战 DbUnit 是一个专门针对数据库测试的 JUnit 扩展,它可以将测试对象数据库置于一个测试轮回之间的状态。DbUnit 的设计理念是,在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,...

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

    入门教程可能涵盖以下内容: 1. 安装与依赖:介绍如何添加 DBUnit 和相关依赖到项目中。 2. 创建数据集:讲解如何编写 XML 数据集或 CSV 数据集。 3. 数据库连接:解释如何通过 JDBC 建立数据库连接并创建 `...

    dbunit使用实例

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架(如 JUnit)的一个扩展。在软件开发中,确保数据库状态的一致性和准确性是至关重要的,尤其是在进行集成测试时。DBUnit 提供了一种简单且...

    PHP / PHPUnit的DbUnit端口。-PHP开发

    PHPUnit下载入门我们分发了一个PHP存档(PHAR),其中包含使用PHPUnit所需的一切。 只需从此处下载它,使其可执行,然后将其放入$ PATH中,例如:➜&nbs此扩展不再维护用于数据库交互测试的DbUnit PHPUnit扩展。 ...

    spring-test-dbunit-example

    快速入门示例Spring DBUnit提供了Spring测试框架和DBUnit项目之间的集成。 在这个例子中,我们展示了如何使用Hypersonic内存数据库测试Hibernate JPA项目。依存关系该项目将使用Apache Maven构建。 这是完整的POM...

    junit和TestNG框架入门

    - **扩展性**:能够与第三方工具或框架(如Mockito、Dbunit等)良好配合,以支持模拟对象、断言和数据库操作等功能。 ##### 2. 测试框架的对比 - **JUnit**: JUnit是最早也是最广泛使用的Java单元测试框架之一,...

    Exam:Concordion BDD框架扩展

    在后台广泛使用的一组测试工具: dbunit, reset -assured,xml-unit,json-unit 入门 1)安装 玛文 &lt; groupId&gt;io.github.adven27 &lt; artifactId&gt;exam-ms &lt; version&gt;5.0.0 Gradle testCompile " io.github....

    Hibernate Quickly

    《Hibernate Quickly》是一本专注于Java领域中的Hibernate框架的入门书籍,由Patrick Peak和Nick Heudecker共同撰写。这本书旨在帮助读者快速掌握Hibernate的核心概念和技术,是Java教程类标签下的一个优秀资源。 #...

    Manning_Hibernate.Quickly

    为了确保代码的质量,本书还强调了单元测试的重要性,并介绍了如何使用JUnit和DBUnit进行单元测试,以及如何将测试集成到持续集成流程中。单元测试能够帮助开发者及时发现并修复代码中的错误,提高软件的稳定性和...

    springside

    SpringSide是一个基于Spring框架的开源项目,旨在为Java开发者提供一个快速入门Spring的实例。这个压缩包中的springside-3.1.3.1-src是该项目的源代码,是学习和研究Spring框架整合的经典示例。 1. **Spring框架**...

    appfuse-documentation-2.1.0官方文档

    它包含了诸如 Hibernate、ibatis、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、OSCache、JUnit 和 JSTL 等组件。这些工具和框架被精心集成到一起,以便为开发者提供一套完整的开发解决...

    Spring.3.x企业应用开发实战(完整版).part2

    第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao...

    Spring3.x企业应用开发实战(完整版) part1

    第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao...

    JUnit_in_Action,_2nd_Edition.pdf

    - **第1章:JUnit入门**:介绍如何快速上手JUnit,包括环境搭建、第一个测试案例等。 - **第2章:探索JUnit**:深入探讨JUnit的核心功能和高级特性。 - **第3章:软件测试原则**:讲解软件测试的基本原理,帮助...

Global site tag (gtag.js) - Google Analytics