- 浏览: 3438756 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://www.cnblogs.com/kirinboy/archive/2012/06/06/integration-testing-with-dbunit.html
现在的DbUnit要求在测试时继承DBTestCase,而不是之前的DatabaseTestCase(前者继承自后者,而后者继承了junit的TestCase)。DatabaseTestCase包含两个抽象方法,getConnection()和getDataSet(),前者用来获取数据库连接,后者获取要测试的数据集。
数据集
DbUnit可以把所有表的记录存在一个数据集中:既可以是数据库中的表,也可以是文件中的数据。我们在此用FlatXmlDataSet来演示。
顺便提一句,DbUnit中还存在另一种格式的数据集XmlDataSet,它们的区别如下:
在FaltXmlDataSet对应的XML文件里,元素名称对应数据库表名,元素的属性(attribute)对应表的列。如:
要注意,如果数据库中某一条字段为null,在flat XML中将不会显示该attribute。另外,FlatXmlDataSet用XML文件中该表的第一行数据来制定表的结构。因此,如果数据库中某个字段所有记录都为null,或者恰巧第一条记录为null,那么得到的表结构与原数据库的表结构就不一致了,测试就会失败。FlatXmlDataSet中存在一个column sensing的概念,在从文件加载数据时,将该属性设置为true,就会根据第一行展现出来的表结构,自动将别的行的列补齐。
在XmlDataSet对应的XML文件里,用元素的子元素对应表的列。如:
null用空元素来表示。
将数据库导出到XML文件
我们可以手写XML来准备数据,也可以从数据库中导出现有的数据,用FlatXmlDataSet.write()静态方法即可,例如:
重写getDataSet
有了文件数据,我们就需要重写getDataSet(),让它加载文件中的数据并返回。
IDatabaseTester
DBTestCase重写了getConnection(),并把它设置为final,将获取connection的操作委托给IDatabaseTester,我们可以通过重写getDatabaseTester()方法来设置具体的IDatabaseTester。Dbunit中,IDatabaseTester的实现类一共有四个:
DefaultDatabaseTester
JdbcDatabaseTester
DataSourceDatabaseTester
JndiDatabaseTester
它们的用途不言自明。
DatabaseTestCase重写了TestCase里的setUp()和tearDown()方法。
可以看出它们的大体意图:为tester设置操作、数据集和监听器,然后执行相应的操作。获取数据集的是抽象方法,需要我们来实现。监听器主要负责在得到数据连接或setUp、tearDown结束后执行的操作,使用默认实现即可。我们主要来说说getSetUpOperation和getTearDownOperation返回的DatabaseOperation。
DatabaseOperation
DatabaseOperation定义了对数据库进行的操作,它是一个抽象类,通过静态字段提供了几种内置的实现:
NONE:不执行任何操作,是getTearDownOperation的默认返回值。
UPDATE:将数据集中的内容更新到数据库中。它假设数据库中已经有对应的记录,否则将失败。
INSERT:将数据集中的内容插入到数据库中。它假设数据库中没有对应的记录,否则将失败。
REFRESH:将数据集中的内容刷新到数据库中。如果数据库有对应的记录,则更新,没有则插入。
DELETE:删除数据库中与数据集对应的记录。
DELETE_ALL:删除表中所有的记录,如果没有对应的表,则不受影响。
TRUNCATE_TABLE:与DELETE_ALL类似,更轻量级,不能rollback。
CLEAN_INSERT:是一个组合操作,是DELETE_ALL和INSERT的组合。是getSetUpOeration的默认返回值。
由此我们可以总结出,在一个测试执行前后,DbUnit会为我们做哪些工作:
1.移除数据库中的所有记录(CLEAN_INSERT中的DELETE_ALL)。
2.将数据集中的数据加载到数据库中(CLEAN_INSERT中的INSERT)。
3.运行测试。
4.测试运行完毕后,不执行任何操作。
我们可以根据需要,在测试类中重写setUp和tearDown,以实现定制的需求。比如,数据库中已经有一些数据,我们不希望数据集中的数据对它们产生任何影响,这时可以先将数据库中的数据备份到内存中,等测试完成后再恢复到数据库中,代码如下:
测试前用CLEAN_INSERT,是用数据集覆盖数据库,测试后用CLEAN_INSERT,使用备份的数据库覆盖之前插入到数据库中的数据集。
完整的基类代码在这里https://gist.github.com/2880207。
好了,现在可以开始测试了。
现在的DbUnit要求在测试时继承DBTestCase,而不是之前的DatabaseTestCase(前者继承自后者,而后者继承了junit的TestCase)。DatabaseTestCase包含两个抽象方法,getConnection()和getDataSet(),前者用来获取数据库连接,后者获取要测试的数据集。
数据集
DbUnit可以把所有表的记录存在一个数据集中:既可以是数据库中的表,也可以是文件中的数据。我们在此用FlatXmlDataSet来演示。
顺便提一句,DbUnit中还存在另一种格式的数据集XmlDataSet,它们的区别如下:
在FaltXmlDataSet对应的XML文件里,元素名称对应数据库表名,元素的属性(attribute)对应表的列。如:
<dataset> <Person Name="Kirin" Age="31" Location="Beijing"/> <Person Name="Jade" Age="30"/> </dataset>
要注意,如果数据库中某一条字段为null,在flat XML中将不会显示该attribute。另外,FlatXmlDataSet用XML文件中该表的第一行数据来制定表的结构。因此,如果数据库中某个字段所有记录都为null,或者恰巧第一条记录为null,那么得到的表结构与原数据库的表结构就不一致了,测试就会失败。FlatXmlDataSet中存在一个column sensing的概念,在从文件加载数据时,将该属性设置为true,就会根据第一行展现出来的表结构,自动将别的行的列补齐。
在XmlDataSet对应的XML文件里,用元素的子元素对应表的列。如:
<dataset> <Person> <Name>Kirin</Name> <Age>31</Age> <Location>Beijing</Location> </Person> <Person> <Name>Jade</Name> <Age>30</Age> <Location/> </Person> </dataset>
null用空元素来表示。
将数据库导出到XML文件
我们可以手写XML来准备数据,也可以从数据库中导出现有的数据,用FlatXmlDataSet.write()静态方法即可,例如:
QueryDataSet dataSet = new QueryDataSet(connection); dataSet.addTable(TABLE_NAME, "select * from " + TABLE_NAME); dataSet.addTable(...); FlatXmlDataSet.write(dataSet, new FileOutputStream("data.xml"));
重写getDataSet
有了文件数据,我们就需要重写getDataSet(),让它加载文件中的数据并返回。
@Override protected IDataSet getDataSet() throws Exception { // set column sensing as true, so it can dynamically and columns with null value. return new FlatXmlDataSetBuilder() .setColumnSensing(true) .build(new FileInputStream("data.xml")); }
IDatabaseTester
DBTestCase重写了getConnection(),并把它设置为final,将获取connection的操作委托给IDatabaseTester,我们可以通过重写getDatabaseTester()方法来设置具体的IDatabaseTester。Dbunit中,IDatabaseTester的实现类一共有四个:
DefaultDatabaseTester
JdbcDatabaseTester
DataSourceDatabaseTester
JndiDatabaseTester
它们的用途不言自明。
DatabaseTestCase重写了TestCase里的setUp()和tearDown()方法。
protected void setUp() throws Exception { super.setUp(); final IDatabaseTester databaseTester = getDatabaseTester(); assertNotNull( "DatabaseTester is not set", databaseTester ); databaseTester.setSetUpOperation( getSetUpOperation() ); databaseTester.setDataSet( getDataSet() ); databaseTester.setOperationListener(getOperationListener()); databaseTester.onSetup(); } protected void tearDown() throws Exception { try { final IDatabaseTester databaseTester = getDatabaseTester(); assertNotNull( "DatabaseTester is not set", databaseTester ); databaseTester.setTearDownOperation( getTearDownOperation() ); databaseTester.setDataSet( getDataSet() ); databaseTester.setOperationListener(getOperationListener()); databaseTester.onTearDown(); } finally { tester = null; super.tearDown(); } }
可以看出它们的大体意图:为tester设置操作、数据集和监听器,然后执行相应的操作。获取数据集的是抽象方法,需要我们来实现。监听器主要负责在得到数据连接或setUp、tearDown结束后执行的操作,使用默认实现即可。我们主要来说说getSetUpOperation和getTearDownOperation返回的DatabaseOperation。
DatabaseOperation
DatabaseOperation定义了对数据库进行的操作,它是一个抽象类,通过静态字段提供了几种内置的实现:
NONE:不执行任何操作,是getTearDownOperation的默认返回值。
UPDATE:将数据集中的内容更新到数据库中。它假设数据库中已经有对应的记录,否则将失败。
INSERT:将数据集中的内容插入到数据库中。它假设数据库中没有对应的记录,否则将失败。
REFRESH:将数据集中的内容刷新到数据库中。如果数据库有对应的记录,则更新,没有则插入。
DELETE:删除数据库中与数据集对应的记录。
DELETE_ALL:删除表中所有的记录,如果没有对应的表,则不受影响。
TRUNCATE_TABLE:与DELETE_ALL类似,更轻量级,不能rollback。
CLEAN_INSERT:是一个组合操作,是DELETE_ALL和INSERT的组合。是getSetUpOeration的默认返回值。
由此我们可以总结出,在一个测试执行前后,DbUnit会为我们做哪些工作:
1.移除数据库中的所有记录(CLEAN_INSERT中的DELETE_ALL)。
2.将数据集中的数据加载到数据库中(CLEAN_INSERT中的INSERT)。
3.运行测试。
4.测试运行完毕后,不执行任何操作。
我们可以根据需要,在测试类中重写setUp和tearDown,以实现定制的需求。比如,数据库中已经有一些数据,我们不希望数据集中的数据对它们产生任何影响,这时可以先将数据库中的数据备份到内存中,等测试完成后再恢复到数据库中,代码如下:
private IDataSet dataSetBackup; private static final String[] TABLE_NAMES = new String[] { "..." }; @Override protected void setUp() throws Exception { dataSetBackup = new CachedDataSet(getConnection().createDataSet(TABLE_NAMES)); super.setUp(); } @Override protected void tearDown() throws Exception { try { final IDatabaseTester databaseTester = getDatabaseTester(); assertNotNull( "DatabaseTester is not set", databaseTester ); databaseTester.setTearDownOperation( getTearDownOperation() ); databaseTester.setDataSet( dataSetBackup ); // 这里不使用getDataSet(),而是使用备份的数据库中数据 databaseTester.setOperationListener(getOperationListener()); databaseTester.onTearDown(); } finally { tester = null; dataSetBackup = null; //super.tearDown(); // 这里不再调用基类的tearDown } } @Override protected DatabaseOperation getTearDownOperation() { return DatabaseOperation.CLEAN_INSERT; }
测试前用CLEAN_INSERT,是用数据集覆盖数据库,测试后用CLEAN_INSERT,使用备份的数据库覆盖之前插入到数据库中的数据集。
完整的基类代码在这里https://gist.github.com/2880207。
好了,现在可以开始测试了。
发表评论
-
FFmpeg常用基本命令
2016-07-15 11:52 0http://www.cnblogs.com/dwdxdy/p ... -
全局唯一ID设计方案
2016-06-28 09:42 1237在分布式系统中,经常需要使用全局唯一ID查找对应的数据。产生这 ... -
MYSQL中取当前周/月/季/年的第一天与最后一天
2016-06-27 17:34 3014http://my.oschina.net/zx0211/bl ... -
iF.SVNAdmin安装
2016-06-27 17:13 1430http://blog.linhere.com/archive ... -
按周,按月,按日,按小时分组统计数据
2016-06-27 17:07 3286http://my.oschina.net/mjRao/blo ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句区别
2016-06-27 16:27 1029http://my.oschina.net/MiniBu/bl ... -
CitusDB logo基于 PostgreSQL 的集群数据库 CitusDB
2016-06-20 11:43 1092http://www.oschina.net/p/citusd ... -
MYSQL级联查询,包括向上向下的级联
2016-05-31 11:47 2252http://my.oschina.net/u/178116/ ... -
阿里巴巴Druid数据源的配置与使用
2016-05-24 17:42 1555http://my.oschina.net/wjme/blog ... -
apache调优
2016-05-21 10:10 1148http://my.oschina.net/renqingsh ... -
MySQL全文索引
2016-05-11 17:21 1000MySQL全文索引Match Against与Like比较 h ... -
mysql中间件研究(Atlas,cobar,TDDL), 分库分表插件
2016-05-09 14:15 3467http://www.guokr.com/blog/47576 ... -
Druid使用起步—在javaWeb项目中配置监控
2016-05-06 11:41 3280Druid使用起步—在javaWeb项目中配置监控: http ... -
tomcat命令
2016-04-28 09:56 954./startup.sh : 启动tomcat ./shutd ... -
基于spring,Atomikos,mybatis的分布式动态数据源JTA实现
2016-04-27 16:37 1088原文;http://www.blogjava.net/zuxi ... -
Shiro 基于注解和标签实现的授权认证过程
2016-04-25 13:24 5958将 Shiro 作为应用的权限 ... -
Byteman 3.0.5 发布,Java 字节码注入工具
2016-04-23 10:29 1782Byteman 3.0.5 发布,Java 字 ... -
用Haproxy来做PostgreSQL的负载均衡
2016-04-22 09:48 1614http://my.oschina.net/Kenyon/bl ... -
安装Hadoop, Hbase, Phoenix
2016-04-22 09:22 1494http://my.oschina.net/jrrx/blog ... -
jenkins+ant+jmeter搭建持续集成的接口测试平台实例
2016-04-15 13:29 1582http://my.oschina.net/u/1425843 ...
相关推荐
通过以上步骤,你可以有效地利用Spring和DBUnit进行数据库集成测试,确保代码的质量和稳定性。不过,要注意的是,虽然DBUnit提供了强大的数据操作能力,但实际测试时应尽量减少对数据库的依赖,避免测试速度过慢。...
在给出的链接中,博主Virgoooos分享了一个具体的DBUnit使用案例,可能涉及了如何创建和使用数据集,以及如何将DBUnit集成到JUnit测试中的具体步骤和示例代码。阅读该博客可以深入理解DBUnit的实际应用。 在实际开发...
在数据库驱动的应用程序中,Dao层通常负责与数据库的交互,因此对Dao进行集成测试是非常必要的。 1. **配置Spring测试环境** 在Spring项目中,我们需要创建一个测试配置类,该类通常继承自`...
这使得开发人员能够方便地创建和维护测试用例的数据环境,无论是在单元测试还是集成测试中都非常有用。 在描述中提到的"flash能过控制java来运用数据库",这可能是指通过Java的Flex或Adobe AIR接口,使Flash应用...
标题中的“spring+dbunit测试访问数据库代码”指的是在Java开发中使用Spring框架与DBUnit进行集成,以实现对数据库的测试。DBUnit是用于数据库单元测试的工具,它可以加载和验证数据库的数据状态,确保测试的隔离性...
DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库,它可以在...
DBUnit 是一个 Java 平台...总之,DBUnit 是一个强大的工具,能够帮助开发者高效地进行数据库集成测试,确保应用程序的稳定性。正确理解和使用 DBUnit 可以大大提高测试的质量和效率,减少因数据库操作错误导致的问题。
在使用DBunit和HSQLDB进行数据库单元测试的过程中,可能会遇到各种各样的问题。及时查阅官方文档、社区论坛或寻求同事的帮助是解决问题的有效途径。 通过上述内容的详细阐述,我们可以看出数据库单元测试的重要性...
5. 集成其他测试框架:DbUnit 可以与JUnit、TestNG等主流的Java测试框架结合使用,为数据库测试带来便利。 在 `dbunit-2.2.3-prj.rar` 这个压缩包中,可能包含以下内容: - `www.pudn.com.txt`:这可能是一个说明...
* 集成测试:对数据库的多个组件进行测试,如数据库的接口测试。 * 系统测试:对整个数据库系统进行测试,以确保数据库的正确性和安全性。 * 功能测试:对数据库的功能进行测试,如数据的添加、删除、修改等操作。 ...
在进行数据库驱动的应用程序开发时,DBUnit 可以帮助开发者在每次测试之前清空并填充数据,然后在测试后检查数据是否符合预期,从而实现可靠的自动化测试。 标题“dbunit测试demo”表明这是一个关于如何使用 DBUnit...
标签中的 "源码" 和 "工具" 指示了这个话题不仅涉及实际操作,还可能包括编写自定义代码来集成 DBUnit 到项目中,以及使用 DBUnit 这个工具进行数据库管理。 综上所述,DBUnit 是一个强大的数据库测试工具,通过 ...
- 集成测试:验证多个模块或服务之间的交互,确保数据库交互没有问题。 - 回归测试:每次代码更新后,通过 DBUnit 自动运行测试,防止引入新的数据库相关错误。 总之,DBUnit 是一个强大的工具,能够简化数据库测试...
DBUnit在Java开发中的应用非常广泛,尤其是在企业级应用的集成测试中,它为数据库层的测试提供了强大的支持,确保了数据库相关的代码质量。了解和掌握DBUnit的使用,对于提高软件的测试覆盖率和稳定性具有重要意义。
在“dbunit-2.2”这个压缩包中,用户将找到DBUnit库的jar文件以及其他必要的文档和资源,用于在项目中集成和使用DBUnit 2.2进行数据库单元测试。通过这个工具,开发者可以确保数据库层的功能正确无误,提高代码质量...
这种测试方法是软件开发中的重要环节,它可以帮助开发者确保数据库逻辑的正确性,减少集成测试阶段的问题,提高代码质量。 ### 什么是单元测试? 单元测试是一种软件开发中的测试方法,其目标是对程序中的最小可...