`
ray_yui
  • 浏览: 221226 次
  • 性别: 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文件,也可以将这些文件中的...

    spring与dbunit集成测试

    2. **引入DBUnit依赖**:在项目的`pom.xml`或`build.gradle`文件中添加DBUnit的依赖,这样就可以在测试类中使用DBUnit的功能。 3. **设置数据源**:在Spring配置文件中定义一个数据源,用于连接测试数据库。确保该...

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

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

Global site tag (gtag.js) - Google Analytics