1.dbunit从名字上可以看出,是对有关数据库操作的测试。官网:
www.dbunit.org从官网下载dbunit相关的jar包,dbunit还依赖于
http://www.slf4j.org和commons-logging.jar,所以也需要下载slf4j,使用它的slf4j-api-1.5.3.jar和slf4j-jcl-1.5.3.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>
<person/>
<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.test.dbunit;
import java.io.File;
import java.io.FileInputStream;
import org.dbunit.Assertion;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
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 {
public SimpleTest()
{
// super();
System.setProperty(
PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
"com.mysql.jdbc.Driver");
System.setProperty(
PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
"jdbc:mysql://localhost/dbunit");
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
"root");
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
"");
}
/**
* 给定数据集
*/
@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{
UsersDB db = new UsersDB();
Users users = new Users();
users.setId(9);
users.setUsername("hello");
users.setPassword("world");
db.save(users);
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
{
System.out.println("setup...");
return DatabaseOperation.CLEAN_INSERT;
}
/**
* 测试执行完以后,需要对数据库里的表里的数据做的操作
*/
protected DatabaseOperation getTearDownOperation() throws Exception
{
System.out.println("teardown...");
return DatabaseOperation.DELETE_ALL;
}
}
其中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>
dbunit做测试唯一不好的地方就是要大量使用xml文件。
分享到:
相关推荐
DBUNIT 使用 DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库...
DBUnit 是一个开源的 Java 工具,它与JUnit结合使用,用于数据库的测试驱动开发(TDD)。在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,DBUnit 提供了这样的功能,它允许开发者导入和导出数据库...
4. **数据库连接(Database Connection)**: 在使用 DBUnit 之前,需要配置一个数据库连接。这可以通过 JDBC URL、用户名和密码实现。 ### 使用 DBUnit 的步骤 1. **初始化**: 首先,你需要创建一个 `...
DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供...通过分析其源码和参考 API 文档,开发者不仅可以掌握如何使用 DBUnit,还能学习到数据库操作、测试策略和设计模式等相关知识。
DBUnit 是一个 Java 开发工具,专门用于数据库的测试,它与单元测试框架如 JUnit 配合使用,确保在测试前后数据库的状态正确无误。DBUnit 的核心思想是在执行测试之前清空并填充测试数据,然后在测试完成后恢复原始...
标题“dbunit测试demo”表明这是一个关于如何使用 DBUnit 进行测试的实例。描述中提到的链接指向了一篇博客文章,这可能包含了一个具体的 DBUnit 测试用例的详细步骤和解释。尽管我们无法直接访问该链接,但我们可以...
在给出的链接中,博主Virgoooos分享了一个具体的DBUnit使用案例,可能涉及了如何创建和使用数据集,以及如何将DBUnit集成到JUnit测试中的具体步骤和示例代码。阅读该博客可以深入理解DBUnit的实际应用。 在实际开发...
1. **设计模式**:DbUnit使用了工厂模式来创建不同类型的DataSet,以及策略模式来处理各种数据类型和比较逻辑。这使得代码结构清晰,易于扩展。 2. **核心类**:如`TableOperations`用于操作数据库表,`...
在本文中,我们看到一个使用 DbUnit 进行 SqlMap(iBATIS 的一部分,用于映射 SQL 查询到 Java 代码)DAO 单元测试的例子。SqlMap 是一个流行的 ORM(Object-Relational Mapping)框架,用于处理 SQL 数据库与 Java ...
**以下是一个简单的Dbunit使用案例:** 1. **构建测试环境:** - 创建测试所需的表结构。 - 准备用于初始化数据库状态的数据集文件。 2. **编写测试代码:** - 使用Dbunit的API进行数据库连接配置。 - 加载...
在使用 DBUnit 进行测试时,首先需要引入 dbunit-2.4.7.jar 和其他必要的依赖库,如 JDBC 驱动。接下来,创建一个 `IDatabaseConnection` 实例,该实例代表与数据库的连接。然后,可以使用 `DatabaseConfig` 来配置 ...
doc 文件夹可能包含了Dbunit的API文档或者其他技术文档,这些文档对于理解和使用Dbunit非常有帮助,它们详细解释了各个类和方法的功能,以及如何在项目中正确使用。 总的来说,Dbunit是一个强大的数据库测试框架,...
标签中的 "源码" 和 "工具" 指示了这个话题不仅涉及实际操作,还可能包括编写自定义代码来集成 DBUnit 到项目中,以及使用 DBUnit 这个工具进行数据库管理。 综上所述,DBUnit 是一个强大的数据库测试工具,通过 ...
DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。
以下是一个简单的Ant构建文件(build.xml)片段,展示了如何使用DBUnit进行数据初始化: ```xml <project name="DBUnit-Ant-Example" default="run-dbunit"> <taskdef name="dbunit" classname="org.dbunit.ant....
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 进行数据库测试时,首先需要准备测试环境。在这个例子中,我们创建了一个名为 "student" 的测试数据库,该数据库是在 MySql 中建立的。接着,在一个名为 "DBUnitSample" 的 Java 工程中,导入了 ...