DbUnit设计理念:
熟悉单元测试的开发人员都知道,在对数据库进行单元测试时候,通常采用的方案有运用模拟对象(mock objects)。通过隔离关联的数据库访问类,比如JDBC的相关操作类,来达到对数据库操作的模拟测试。但是如果真正要测试访问数据结果正确性那么就显得力不从心了。
DBUnit的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据。
DBUnit是对JUnit的一种扩展,开发人员可以通过创建测试用例代码,在这些测试用例的生命周期内来对数据库的操作结果进行比较。
DBUnit通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态,从而使得测试自动化、可重复和相对独立。
使用spring的AbstractTransactionalDataSourceSpringContextTests。在每个testcase开始之前,会自动开启一个事务,然后在结束的时候进行事务回滚。这样就可以隔绝几个测试用例之间的相互干扰。这很重要,才能够实现测试的自动化
DbUnit测试基本概念和流程
基于DbUnit 的测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据。
可以将数据库模式的全部内容表示为单个IDataSet 实例。这些表本身由Itable 实例来表示。
IDataSet 的实现有很多,每一个都对应一个不同的数据源或加载机制。最常用的几种 IDataSet实现为:
FlatXmlDataSet:数据的简单平面文件 XML 表示
QueryDataSet:用 SQL 查询获得的数据
DatabaseDataSet:数据库表本身内容的一种表示
XlsDataSet :数据的excel表示
在每个testcase开始之前以及结束之后,执行的数据库操作为以下:
DatabaseOperation.NONE:什么也不做。
一般而言,使用DbUnit进行单元测试的流程如下:
1 根据业务,做好测试用的准备数据和预想结果数据,通常准备成xml格式文件。
2 在setUp()方法里边备份数据库中的关联表。
3 在setUp()方法里边读入准备数据。
4 对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。
。
问题如下:
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<T a="1" b="1" />
<T a="2" b="2" c="2"/>
</dataset>
以上为用来测试的数据,但是执行测试读取数据时,如果表T数据首行未初始化'c'这个字段的话那么表T所有'c'字段数据均为NULL,为了解决该问题,查了下dbunit 的API,发现里面给了明确解决方案,但代码有些问题,稍微改改,很快解决,供大家分享。版本:2.4.8
不多说,上代码:
private IDataSet[] getDataSets(String[] files) throws DataSetException, IOException {
if (files == null)
return null;
IDataSet[] datasets = new IDataSet[files.length];
PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
for (int i = 0; i < files.length; i++) {
Resource[] resources = resourceResolver.getResources(files[i]);
for (Resource resource : resources) {
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setColumnSensing(true);
ReplacementDataSet ds = new ReplacementDataSet(builder.build(resource.getInputStream()));
ds.addReplacementObject("[NULL]", null);
ds.addReplacementObject("[null]", null);
datasets[i] = ds;
}
}
return datasets;
}
这个方法专用来返回IDataSet[] ,相信大家知道该方法的作用了,修改之处主要在建立FlatXmlDataSetBuilder 对象上,然后为其setColumnSensing(true);然后执行其build方法,哦了!
跑测试吧。
分享到:
相关推荐
导出过程中,DBUnit将根据预定义的格式(如Flat XML或Ibatis XML)将表数据转换为文本文件。备份数据文件可以存储在版本控制系统中,便于跟踪历史变化和回滚到特定版本。 恢复过程则涉及将之前备份的数据重新导入到...
描述中提到通过异常和源码分析来解决问题,这表明开发者可能遇到了具体的异常错误,比如"String or identifier too long"或"MBCS data truncated",并且查看了DBUnit或相关驱动(如jtds.jar,这是一个流行的Sybase和...
在提供的文件列表中,我们可以看到 student_mysql.sql(可能是 SQL 导出的数据库备份),以及几种不同类型的 XML 文件(student_nonflat.xml、student_exp.xml、student_flat.xml、student_pre.xml),这些都是 ...
DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供了数据驱动测试的解决方案。在版本 2.4.9 中,DBUnit 提供了一系列的功能,帮助开发者在进行单元测试时能够管理和操作数据库的...
1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的数据导入到数据库,这在数据迁移或备份时非常有用。 2. **数据比较**:DBUnit提供了断言机制,可以比较数据库的实际状态...
DBUNIT 提供了一种高效的方式来进行这种比较,它允许测试人员定义数据集(通常以 CSV 或 XML 格式),并将这些数据加载到数据库中,然后在测试完成后进行验证,确认数据库的实际状态与预期相符。 以下是使用 DBUNIT...
数据集是 DBUnit 的基础,它通常是一个 XML 文件或者 CSV 文件,描述了测试用例中的预期数据库状态。这些文件包含了表的行和列,模拟了数据库中的数据。操作模式则定义了如何将数据集加载到数据库,比如 `CLEAN_...
2. **操作模式**:DBUnit 提供了三种操作模式:CLEAN_INSERT(清空表后再插入新的数据)、UPDATE(更新已有数据)和OVERWRITE(覆盖原有数据)。这些模式可以根据不同的测试需求来选择。 3. **数据集**:在DBUnit中...
1. **数据集格式错误**: 确保数据集文件的格式正确,字段顺序与数据库表结构一致。 2. **数据库权限问题**: 检查测试账号是否有足够的权限执行插入、更新和删除操作。 3. **类型不匹配**: 如果遇到类型映射问题,...
3. 设置数据表:在测试类中,使用DBUnit的`IDataOperation`接口,如`IDataSet`和`ITable`,来操作数据。 4. 执行操作:在测试方法中,使用`DatabaseOperation`类的静态方法,如`CLEAN_INSERT`或`OVERWRITE`,来加载...
DBUnit通过引入数据集(Dataset)的概念,解决了这个问题。数据集是XML或CSV格式的文件,包含了数据库表的预定义状态,可以在测试开始前加载到数据库中,测试结束后再清理掉,这样就保证了每个测试用例都在一个干净...
7. **异常处理**:在测试过程中,如果数据不匹配或者数据库操作失败,DBUnit 将抛出异常,如 `ComparisonFailure` 或 `DatabaseUnitException`,帮助定位问题。 8. **自定义类型处理器**:DBUnit 默认支持基本数据...
DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。
src 文件夹通常包含源代码,尽管在这个压缩包中没有详细列出其内容,但在实际的Dbunit项目中,src文件夹下会有Java源代码、测试代码以及相关的配置文件。 doc 文件夹可能包含了Dbunit的API文档或者其他技术文档,...
在本讨论中,我们将深入理解如何利用DbUnit的DBTestCase类进行针对扁平XML格式的数据操作。DBTestCase是DbUnit提供的一个基类,用于构建基于数据库的单元测试。 首先,让我们了解扁平XML(Flat XML)格式。这种格式...
在Ant任务中调用相应的DBUnit方法,如`<operation type="CLEAN_INSERT">`执行清空表并插入新数据的操作。还可以配置数据验证规则,确保数据导入后的状态符合预期。 四、实战示例 以下是一个简单的Ant构建文件...
2. 模式(Schema):DBUnit 允许你在数据集之前指定数据库模式,这有助于处理不同数据库之间的差异,比如列的顺序、类型等。 3. 操作(Operation):操作是指对数据库执行的具体动作,如 `INSERT`、`UPDATE`、`...
2. 在 setUp() 方法里边备份数据库中的关联表。 3. 在 setUp() 方法里边读入准备数据。 4. 对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。 5. 在 tearDown() 方法里边...
- 数据以 XML 形式存储,通常包含表结构和数据,便于 DBUnit 处理。 - 示例 XML 文件显示了 `<?xml version='1.0' encoding='UTF-8'?>` 的声明,表明它是 UTF-8 编码。 - 数据行由 `<row>` 标签表示,列数据作为...