`
ray_yui
  • 浏览: 220238 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DBUnit使用

阅读更多

前言:本文章需要JUnit单元测试框架的基础知识,若读者还不具备,请阅读笔者的JUnit文章:http://ray-yui.iteye.com/blog/1914106


UnitTest系列文章:
      使用JUnit开发单元测试:http://ray-yui.iteye.com/blog/1914106
      使用EasyMock扩展Junithttp://ray-yui.iteye.com/blog/1916170
      使用Cactus测试Servlethttp://ray-yui.iteye.com/blog/1917515
      使用Spring TestContext测试Spring应用http://ray-yui.iteye.com/blog/1921424
      使用Cobertura生成测试覆盖率报告http://ray-yui.iteye.com/blog/1921958

什么是DBUnit?
      DBUnit是一个基于JUnit扩展的数据库测试框架。它能帮助我们更方便快捷的进行数据库测试.

为什么要使用DBUnit?
      在我们使用JUnit单元测试框架编写单元测试的时候,少不免要对数据库进行操作,但请试想一下,当我要编写一个获取用户的单元测试时,数据库是不存在该记录的,那么我要测试获取用户时就需要往数据库添加一条用户记录,但当获取用户的单元测试完成并成功后,此测试并没有清理现场(删除插入数据库的记录),那样当我们再有单元测试需要插入记录时,就会造成ID冲突的情况,少量的单元测试还可以避免此种情况,但当单元测试的数据庞大时,就会出现各种各样的问题,而DBUnit可以帮助我们解决这类型的问题

DBUnit为我们做了什么?
      DBUnit的设计理念是在测试之前,先对数据库进行备份,然后对数据库进行清空再插入我们为其准备的测试数据,最后在测试完毕后重新恢复数据库从而避免了JUnit对数据现场的破坏.

DBUnit使用:
      1.首先为Maven增加DBUnit的依赖,还需要slf4j的依赖

<dependency>
	<groupId>org.dbunit</groupId>
	<artifactId>dbunit</artifactId>
	<version>2.4.9</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>1.7.5</version>
	<scope>compile</scope>
</dependency>



      在Maven管理的项目src/test/resource/下创建default-data.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset>

	<!-- 注意,此处的user代表表名(database table name) -->
	<user id="1" username="123" password="456"/>
	<user id="2" username="123" password="456"/>
	<user id="3" username="123" password="456"/>
	<user id="4" username="123" password="456"/>
	<user id="5" username="123" password="456"/>
</dataset>



      以下代码为提取后的BaseTest

package com.accentrix.ray;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;

import javax.sql.DataSource;

import org.dbunit.database.DatabaseDataSourceConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.xml.sax.InputSource;

public class BaseTest {
	public static IDatabaseConnection connection;
	public static DataSource dataSource;
	private File temp;

	@BeforeClass
	public static void init() throws Exception {

		// 通过DataSource获取DataBaseSourceConnection
		connection = new DatabaseDataSourceConnection(dataSource);
	}

	@AfterClass
	public static void destroy() throws Exception {
		if (connection != null) {
			connection.close();
		}
	}

	protected IDataSet getDataSet(String name) throws DataSetException {
		// 通过类加载器获取default-data.xml文件的内容
		InputStream is = this.getClass().getClassLoader()
				.getResourceAsStream(name + ".xml");

		// IDataSet就类似是一个数据的容器,把default-data.xml内容
		// 转换成了DBUnit可识别的数据返回出去
		return new FlatXmlDataSet(new FlatXmlProducer(new InputSource(is)));
	}

	protected void backupAll() throws Exception {
		// createDataSet代表从数据库中获取到DataSet,此时DataSet为数据库的内容
		IDataSet ds = connection.createDataSet();

		// 创建临时文件
		temp = File.createTempFile("temp", "xml");

		// 将数据库内容的DataSet写入临时文件当中
		FlatXmlDataSet.write(ds, new FileWriter(temp), "UTF-8");
	}

	protected void backupCustom(String... tableName) throws Exception {
		// 此种形式能保存某几张表的的数据,而不需要全部备份
		QueryDataSet qds = new QueryDataSet(connection);
		for (String str : tableName) {
			qds.addTable(str);
		}
		temp = File.createTempFile("temp", "xml");
		FlatXmlDataSet.write(qds, new FileWriter(temp), "UTF-8");
	}

	protected void recover() throws Exception {

		// 获取数据库内容的临时文件生成DataSet
		IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(
				new FileInputStream(temp))));

		// 使用DatabaseOperation的枚举方法先清空数据库内容再还原数据库
		DatabaseOperation.CLEAN_INSERT.execute(connection, ds);
	}
}


      以下为单元测试类

package com.accentrix.ray;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.dbunit.dataset.IDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Test;

public class TestUser extends BaseTest {

	@Test
	public void testGetUser() throws Exception {
		// 首先获取到default-data.xml文件中的内容
		IDataSet ds = getDataSet("default-data.xml");

		// 调用backupAll方法保存数据库表
		backupAll();

		// 将default-data.xml中的内容替换成数据库的内容
		DatabaseOperation.CLEAN_INSERT.execute(connection, ds);

		// 进行单元测试逻辑的判断
		User user = userService.get(1);

		assertNotNull(user);
		assertEquals(user.getId(), new Integer(1));
		assertEquals(user.getPassword(), "456");
		assertEquals(user.getUsername(), "123");

		// 最后进行数据库的恢复
		// 当然我们也可以将backupAll和recover放在@Before和@After当中
		recover();
	}

}


总结:
      使用了DBUnit后可以实现了对数据库的隔离,成功弥补了JUnit单元测试不清理数据现场的缺憾,实际上DBUnit只是简单的在单元测试前把数据库的数据进行了备份然后插入xml中配置好的数据,在测试结束后再用备份好的原数据库数据填充回数据库.但当面对复杂的表关系和大数据量的时候,每次进行测试都进行数据的备份,也是一个很大的负担,而且把全部的测试数据都编写在xml当中也是很大的工作量
1
0
分享到:
评论

相关推荐

    DBUNIT使用

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

    dbunit使用必需Jar包

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

    dbunit使用实例

    4. **数据库连接(Database Connection)**: 在使用 DBUnit 之前,需要配置一个数据库连接。这可以通过 JDBC URL、用户名和密码实现。 ### 使用 DBUnit 的步骤 1. **初始化**: 首先,你需要创建一个 `...

    dbunit-2.4.9 源码

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供...通过分析其源码和参考 API 文档,开发者不仅可以掌握如何使用 DBUnit,还能学习到数据库操作、测试策略和设计模式等相关知识。

    DBUnit使用文档

    DBUnit 是一个 Java 开发工具,专门用于数据库的测试,它与单元测试框架如 JUnit 配合使用,确保在测试前后数据库的状态正确无误。DBUnit 的核心思想是在执行测试之前清空并填充测试数据,然后在测试完成后恢复原始...

    dbunit测试demo

    标题“dbunit测试demo”表明这是一个关于如何使用 DBUnit 进行测试的实例。描述中提到的链接指向了一篇博客文章,这可能包含了一个具体的 DBUnit 测试用例的详细步骤和解释。尽管我们无法直接访问该链接,但我们可以...

    DBUnit 进行单元测试

    在给出的链接中,博主Virgoooos分享了一个具体的DBUnit使用案例,可能涉及了如何创建和使用数据集,以及如何将DBUnit集成到JUnit测试中的具体步骤和示例代码。阅读该博客可以深入理解DBUnit的实际应用。 在实际开发...

    dbunit-2.4.7

    1. **设计模式**:DbUnit使用了工厂模式来创建不同类型的DataSet,以及策略模式来处理各种数据类型和比较逻辑。这使得代码结构清晰,易于扩展。 2. **核心类**:如`TableOperations`用于操作数据库表,`...

    用DbUnit进行SqlMap单元测试

    在本文中,我们看到一个使用 DbUnit 进行 SqlMap(iBATIS 的一部分,用于映射 SQL 查询到 Java 代码)DAO 单元测试的例子。SqlMap 是一个流行的 ORM(Object-Relational Mapping)框架,用于处理 SQL 数据库与 Java ...

    [应用开发及迁移][客户端编程开发框架]Dbunit指南.pdf

    **以下是一个简单的Dbunit使用案例:** 1. **构建测试环境:** - 创建测试所需的表结构。 - 准备用于初始化数据库状态的数据集文件。 2. **编写测试代码:** - 使用Dbunit的API进行数据库连接配置。 - 加载...

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

    在使用 DBUnit 进行测试时,首先需要引入 dbunit-2.4.7.jar 和其他必要的依赖库,如 JDBC 驱动。接下来,创建一个 `IDatabaseConnection` 实例,该实例代表与数据库的连接。然后,可以使用 `DatabaseConfig` 来配置 ...

    Dbunit数据库连接下载

    doc 文件夹可能包含了Dbunit的API文档或者其他技术文档,这些文档对于理解和使用Dbunit非常有帮助,它们详细解释了各个类和方法的功能,以及如何在项目中正确使用。 总的来说,Dbunit是一个强大的数据库测试框架,...

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

    标签中的 "源码" 和 "工具" 指示了这个话题不仅涉及实际操作,还可能包括编写自定义代码来集成 DBUnit 到项目中,以及使用 DBUnit 这个工具进行数据库管理。 综上所述,DBUnit 是一个强大的数据库测试工具,通过 ...

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

    DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。

    DBUnit最佳实践之使用ant命令

    以下是一个简单的Ant构建文件(build.xml)片段,展示了如何使用DBUnit进行数据初始化: ```xml &lt;project name="DBUnit-Ant-Example" default="run-dbunit"&gt; &lt;taskdef name="dbunit" classname="org.dbunit.ant....

    dbunit帮助文档(HTML版)

    DBUnit通过使用XML或Flat CSV格式的数据集来管理这些操作,使得数据库状态的管理变得标准化且可重复。 ### 主要功能 1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的...

    DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类

    DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类...

    使用dbunit测试数据库

    在使用 DbUnit 进行数据库测试时,首先需要准备测试环境。在这个例子中,我们创建了一个名为 "student" 的测试数据库,该数据库是在 MySql 中建立的。接着,在一个名为 "DBUnitSample" 的 Java 工程中,导入了 ...

Global site tag (gtag.js) - Google Analytics