`

DbUnit 的 DBTestCase 的用法(针对扁平XML)

阅读更多

1.dbunit从名字上可以看出,是对有关数据库操作的测试。官网:www.dbunit.org从官网下载dbunit相关的jar包,dbunit还依赖于http://www.slf4j.org所以也需要下载slf4j,使用它的slf4j-api-1.7.7.jar和slf4j-simple-1.7.7.jar。 


dbunit的原理是:它会把数据库表里的数据和一个xml文件里表示的数据关联起来。也就是说 数据库表里的数据可以导出到一个对应的xml里,同时也可以将一个xml里的数据导入到数据库表里。是相互转换的。 
                 数据库表里的数据<===>xml文件 

可以做个测试如下: 

package com.test.dbunit;

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;

public class TestApp {
	
	public static void main(String[] args) throws Exception{
		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection(
				"jdbc:mysql://localhost/dbunit", "root", "");
		
		IDatabaseConnection connection = new DatabaseConnection(conn);
		QueryDataSet dataSet = new QueryDataSet(connection);
		//将整个person表里的数据导出到 xml文件里
		dataSet.addTable("person");
		//将users表里符合条件的数据导出到xml文件里
		dataSet.addTable("users","select * from users where id < 4");
		//导出到dbunit.xml文件里
		FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml"));
	}

}

 如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet 

public static void main(String[] args) throws Exception{
		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection(
				"jdbc:mysql://localhost/dbunit", "root", "");
		
		IDatabaseConnection connection = new DatabaseConnection(conn);
		//如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet
		IDataSet dataSet = connection.createDataSet();
		//导出到dbunit.xml文件里
		FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit1.xml"));
		//也可以用FlatDtdDataSet导出一个对应的dtd文件
		FlatDtdDataSet.write(dataSet,new FileOutputStream("dbunit1.dtd"));
	}

 生成的dbunit.xml内容如下: 

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <student Id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
  <student Id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
  <users id="1" username="zhangsan" password="123"/>
  <users id="2" username="lisi" password="456"/>
  <users id="3" username="wangwu" password="789"/>
</dataset>

 2.用dbunit做测试,需要继承DBTestCase,并需要重写protected IDataSet getDataSet() throws Exception 

package com.chenjo.expa;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.dbunit.Assertion;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.SortedTable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
public class SimpleTest extends DBTestCase {
	private File file = null;
	public SimpleTest()
	{
//		super();
		System.setProperty(
				PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
				"com.mysql.jdbc.Driver");
		System.setProperty(
				PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
				"jdbc:mysql://localhost/test");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
				"root");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
				"root");
	}
	
	/**
	 * 给定数据集
	 */
	@Override
	protected IDataSet getDataSet() throws Exception {
		System.out.println("init...");
		return new FlatXmlDataSet(new FileInputStream("dbunit.xml"));
	}
	
	public void test1() throws Exception{
		IDataSet dbDataSet = getConnection().createDataSet();
		ITable dbTable = dbDataSet.getTable("users");
		
		IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit.xml"));
		ITable xmlTable = xmlDataSet.getTable("users");
		
		Assertion.assertEquals(xmlTable, dbTable);
	}
	/**
	 * 表结构和dbunit1.xml结构不一致
	 */
	public void test2() throws Exception{
		IDataSet dbDataSet = getConnection().createDataSet();
		ITable dbTable = dbDataSet.getTable("users");
		
		IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit1.xml"));
		ITable xmlTable = xmlDataSet.getTable("users");
		//第一种写法
//		dbTable = DefaultColumnFilter.includedColumnsTable(dbTable,xmlTable.getTableMetaData().getColumns());
		//第二种写法
		dbTable = DefaultColumnFilter.includedColumnsTable(dbTable,xmlDataSet.getTableMetaData("users").getColumns());
		
		Assertion.assertEquals(xmlTable, dbTable);
	}
	/**
	 * 只比较username
	 */
	public void test3() throws Exception{
		IDataSet dbDataSet = getConnection().createDataSet();
		ITable dbTable = dbDataSet.getTable("users");
		
		IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit1.xml"));
		ITable xmlTable = xmlDataSet.getTable("users");
		
		dbTable = DefaultColumnFilter.excludedColumnsTable(dbTable, new String[]{"id","password"});
		xmlTable = DefaultColumnFilter.excludedColumnsTable(dbTable, new String[]{"password"});
		
		Assertion.assertEquals(xmlTable, dbTable);
	}
	/**
	 * 表里数据和dbunit2.xml里的数据的顺序不一致
	 */
	public void test4() throws Exception{
		IDataSet dbDataSet = getConnection().createDataSet();
		ITable dbTable = dbDataSet.getTable("users");
		
		IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit2.xml"));
		ITable xmlTable = xmlDataSet.getTable("users");
		
		SortedTable dbSortedTable = new SortedTable(dbTable,new String[]{"id"});
		//按数据库里表结构字段类型来进行排序,如果是int则按int排序,不是依照字符串的形式排序
		dbSortedTable.setUseComparable(true);
		
		SortedTable xmlSortedTable = new SortedTable(xmlTable,new String[]{"id"});
		//按数据库里表结构字段类型来进行排序,如果是int则按int排序,不是依照字符串的形式排序
		xmlSortedTable.setUseComparable(true);
		
		Assertion.assertEquals(xmlSortedTable, dbSortedTable);
	}
	
	/**
	 * 对Users表插入一条记录做测试
	 * @throws Exception
	 */
	public void test5() throws Exception{
		UsersDAO db = new UsersDAO();

		User user = new User();
		user.setId(9);
		user.setUsername("hello");
		user.setPassword("world");

		db.save(user);

		IDataSet dataSet = getConnection().createDataSet();
		ITable actualTable = dataSet.getTable("users");

		IDataSet dataSet2 = new FlatXmlDataSet(new File("expected.xml"));
		ITable expectedTable = dataSet2.getTable("users");

		Assertion.assertEquals(expectedTable, actualTable);
	}
	
	/**
	 * 在把xml里的数据导入到db里之前,需要对数据库里的表的数据做的操作。
	 */
	protected DatabaseOperation getSetUpOperation() throws Exception
    {
		
		// 连接DB 
		Connection conn=getMySqlConnection();
		// 获得DB 连接
		IDatabaseConnection connection = 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("dbunit.xml"));
		System.out.println("setup...");
		DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
        return DatabaseOperation.NONE;
    }
	/**
	 * 测试执行完以后,需要对数据库里的表里的数据做的操作
	 */
    protected DatabaseOperation getTearDownOperation() throws Exception
    {
    	Connection conn=getMySqlConnection();
    	IDatabaseConnection connection =new DatabaseConnection(conn);
		IDataSet dataSet = new FlatXmlDataSet(file);
		DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
    	System.out.println("teardown...");
        return DatabaseOperation.NONE;
    }

	Connection getMySqlConnection() {
		// 驱动程序名
		String driver = "com.mysql.jdbc.Driver";

		// URL指向要访问的数据库名test
		String url = "jdbc:mysql://127.0.0.1:3306/test";

		// MySQL配置时的用户名
		String user = "root";

		// MySQL配置时的密码
		String password = "root";

		Connection conn = null;
		// 加载驱动程序
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return conn;

	}
}

 其中expected.xml内容为: 

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <person/>
  <users id="1" username="zhangsan" password="123"/>
  <users id="2" username="lisi" password="456"/>
  <users id="3" username="wangwu" password="789"/>
  <users id="9" username="hello" password="world"/>
</dataset>

 

补充说明:

数据库test的编码格式: utf-8

expected.xml:  以 UTF-8 无BOM格式编码 (Notepadd++)

分享到:
评论

相关推荐

    DBUNIT使用

    DbUnit 的主要用途是准备数据库和验证数据库,它可以在执行每个测试方法前用已知内容设置表,并在执行每个测试方法后更方便地验证表的内容。 DbUnit 的使用可以分为两个部分:设置 DbUnit 和使用 DbUnit 进行测试。...

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

    DbUnit提供了一些实现来处理不同格式的数据集,如 `FlatXmlDataSet`,它可以读写扁平化的XML数据集,其中每个XML元素对应一个表行,元素名称对应表名,XML属性对应列名。另一个实现是 `DatabaseDataSetAdapter`,它...

    dbunit-2.4.9 源码

    API 文档(http://www.dbunit.org/apidocs/index.html)是 DBUnit 使用的关键资源,其中详细列出了所有类、接口和方法,包括: - `IDatabaseConnection` 接口:表示与数据库的连接,提供创建 Dataset 和执行 SQL ...

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

    我们可以看到 student_mysql.sql(可能是 SQL 导出的数据库备份),以及几种不同类型的 XML 文件(student_nonflat.xml、student_exp.xml、student_flat.xml、student_pre.xml),这些都是 DBUnit 可能使用的数据源...

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

    5. 断言:展示如何使用 DBUnit 提供的断言方法来验证测试结果。 6. 自定义配置:介绍如何通过 `DatabaseConfig` 修改 DBUnit 的默认行为。 7. 处理复杂数据类型:说明如何处理 BLOB、CLOB 和自定义数据类型。 8. ...

    dbunit帮助文档(HTML版)

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

    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使用必需Jar包

    1. **准备数据**:使用 DBUnit 导入 XML 文件或 Excel 表格中的测试数据到数据库。 2. **执行测试**:在测试方法中,调用 DBUnit 的 API 运行测试,比如使用 `IDatabaseConnection` 和 `IDataSet` 接口。 3. **验证...

    DBUnit使用文档

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

    Dbunit数据库连接下载

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

    dbunit使用实例

    这个例子展示了如何在测试类中设置数据库连接,加载预期数据,然后在测试方法中使用 `CLEAN_INSERT` 操作清理并插入数据,最后验证数据库中的数据是否与预期相符。 ### 常见问题 1. **数据集格式错误**: 确保数据...

    dbunit测试demo

    6. **执行测试**:在测试方法中,使用 `DatabaseTester` 或 `DBUnitHelper` 类来运行 DBUnit 的操作,如 `assertTableCounts()` 或 `assertDataEquals()`,来验证数据库状态。 7. **异常处理**:在测试过程中,如果...

    Spring Boot 与DBunit 配合使用方法

    DBUnit 还提供了一种方便的方法来导出数据库中的数据到 XML 文件。例如,我们可以创建一个方法来导出 `user` 表的所有数据: ```java @Test public void exportDatabaseToXml() throws DataSetException, ...

    dbunit2.2

    DBUnit 是一个开源的Java库,它扩展了JUnit框架,为数据库相关的单元测试提供了一种结构化的方法。在“dbunit2.2”这个压缩包中,包含了DBUnit 2.2版本的所有必要文件,使得开发者能够有效地进行数据库的单元测试。 ...

    DbUnit入门实战

    DbUnit 入门实战 DbUnit 是一个专门针对数据库... DbUnit 的设计理念和使用方法可以帮助开发人员更好地进行数据库测试,提高测试的效率和质量。同时,DbUnit 也可以与其他测试框架集成,提供更加全面的测试解决方案。

    dbunit开发文档

    这篇开发文档将深入探讨 DBUnit 的核心概念、用法以及如何将其集成到你的开发流程中。 一、DBUnit 基本概念 1. 数据集(Dataset):数据集是 DBUnit 的核心,它定义了数据库的预期状态。数据集可以是 XML、CSV 或 ...

    DBUnit 进行单元测试

    使用DBUnit,我们可以创建一个数据集(通常为XML或CSV格式),该数据集包含用于初始化数据库的记录。在测试开始前,这些数据会被加载到数据库中,形成一个已知的起点。测试执行完毕后,还可以选择将数据库恢复到初始...

    dbunit入门实例

    1. **数据导入导出**:DbUnit 可以将 CSV、XML 或 Excel 文件中的数据导入到数据库表中,也可以将数据库中的数据导出为这些格式的文件。 2. **数据清理**:测试前,DbUnit 可以清空指定的表,确保每次测试都在一个...

Global site tag (gtag.js) - Google Analytics