DbUnit 简介和使用 (puts your database into a known state)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

DbUnit 简介

1.       引言

在写持久层测试用例的时候,由于我们的测试是要依赖于外部的数据库,数据库里面的数据影响我们测试,往往是要在数据库中去查询得到数据表数据的状态,然后才能在 TestCase 里面写断言。数据表的状态又是可变的,所以经常要在此来回切换。可能产生如下场景:

1)          要测试 findAll 方法,这个时候我们要去数据库里去先写个 count(*) 之后,才能写 assertEquals(result.size(),size)

2)          要测试 updateMember(), 要先去数据库里查一条数据,并记下之前的状态,然后才能写 upadate TestCase

3)          要测试 insert ,要先去数据库要先看下某主键是否已经被使用。

4)          要测试 delete ,要先去数据库里面去查找是否某条数据存在。

如果说我们在跑某一个测试用例的时候,总是已经知道了数据表里面当前的数据状态,那么就省了这种频繁的来回切换。 DbUnit 就是为了这个而产生。

2.       dbunit 基本原理

DbUnit is a JUnit extension (also usable with Ant) targeted at database-driven projects that, among other things, puts your database into a known state between test runs. This is an excellent way to avoid the myriad of problems that can occur when one test case corrupts the database and causes subsequent tests to fail or exacerbate the damage.(Dbunit Junit 的一个扩张。用于基于数据的项目。在测试时,使你的数据库处于一种已知的状态。是一种避免因为某些测试用例失败导致相关的测试失败而产生的大量的问题。 )

Dbunit 基本原理就是在跑测试用例运行之前对数据表做用户定义的操作,清空不想要的数据,插入用户自定义的数据,使得该数据表处于用户知道的一种状态。而用户自定义的数据使用项目里的一个 xml 文件来表示。 Xml 文件里面的数据代表了当前的数据状态,用户可以通过 xml 文件了解当前数据表的状态。同时在测试用例跑完之后,用户可以定义使得数据表处于一种用户想要的状态。一个测试用例的运行过程如下:

 

dbunit

1 :测试用例运行过程。

一般的一个测试用例结构如下:

关于 getSetUpOperation getTearDownOperation 的个解释:

DatabaseOperation.CLEAN_INSERT :先清空数据表里的数据,再插入 getDataSet 返回的数据到数据表中。是 getSetUpOperation 的默认状态 ( 这个操作会使得数据库始终处于只有几条固定数据的状态,也是我们最常用的一种方式 )

DatabaseOperation.NONE: 不做任何事情。

还有 DatabaseOperation.UPDATE DatabaseOperation.INSERT DatabaseOperation.REFRESH DatabaseOperation.DELETE DatabaseOperation.DELETE_ALL DatabaseOperation.TRUNCATE CompositeOperation TransactionOperation IdentityInsertOperation 等几个状态,具体参考官网: http://dbunit.sourceforge.net/components.html#cleanInsert

 

3.       例子

假设有这样一张表:

 

我们要对 IMemberDao 的实现类做如下三个方法的测试:

         public List<Member> listAllMember(); //list all Members.

         public Member findMemberById(long id); //find a Member by Id.

public boolean insertMember(Member member); //insert a member record.

假设我们要使数据表 member 处于如下状态:有三条用户自定义的记录,我们可以写一个 MemberSet.xml:

<?xml version='1.0' encoding='UTF-8'?>

<dataset>

         <member id="1" memberid="ant" name="sky" pass="123"

         email="abing37@126.com" gender="male" birthday="1985-06-21" />

         <member id="2" memberid="ant" name="abing" pass="123"

                   email="abing37@126.com" gender="male" birthday="1985-06-21" />

         <member id="3" memberid="ant" name="yblin" pass="123"

                   email="abing37@126.com" gender="male" birthday="1985-06-21" />

</dataset>

 

我们的测试用例可以这样写:

通过以上的测试用例,我们只需要关注工程里的 MemberSet.xml 文件就可以完全了解数据库当前的状态了。

单元测试DBUnit使用以及原理剖析 前面介绍了不少写单元测试的内容,比方说MockitoPowerMockito, JUnit 5,经常写单元测试的想必对这些框架都比较熟悉。 这篇博客主要介绍下数据库驱动测试框架–DbUnit(http://dbunit.sourceforge.net/), 主要从DbUnit的设计原理实际使用来展开,这里的使用我又分为三个部分: 基于spring-test-dbunit使用 基于dbunit本身api的使用dbunit的基础上整合了公司自己的jdbc框架完成的工具类 DBUnit 设计原理 看 阅读详情

相关推荐

DbUnit使用简介

前言:本篇博客是翻译博文,本人是一名初学者,而且并非专业人员,完全出于自我学习的兴趣,以及交流的目的,有任何疑问或者发现错误请及时提醒,万分感谢。

fanxiaobin 5461

Dbunit简介

一、是什么?         DBunit 是一种扩展于JUnit的数据库驱动测试框架,它使数据库测试过程之间处于一种已知状态,如果一个测试用例对数据库造成了破坏性影响,它可以帮助避免造成后面的测试失败或者给出错误结果。 二、怎么用?         基于DbUnit测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据。 可以将数据库模式的全部内容表示为单个IDat

刘玉杰 点滴之笔 1557

dbunit实现原理及最佳实践

使用dbunit写单元测试时,强烈建议先熟悉其底层的实现原理,否则可能导致测试数据库中的数据被清空的风险(尽管测试数据不如线上数据重要,但如果大量的测试数据被清空,导致测试环境不可用,数据恢复起来还是很头疼的!!)。参考博客1简单介绍了dbunit的实现原理: 第一步:事先把数据表里的数据以XML的格式导出来; 第二步:运行每一个测试之前先把当前数据表里的数据清空; 第三步:把XML里的数据再导进数据表; 第四步:数据表回到了单测前的状态。 由此可见,在单测的第二步中,会将数据表里的数据清空。如果你

Saintyyu的博客 2553

Springboot+DBunit单元测试数据库隔离测试

关于DBunit 百度百科:dbunit是一个基于junit扩展的数据库测试框架。 简言之,dbunit是为了在单元测试中,通过备份数据库、导入测试数据、回滚恢复数据库的手段,在不污染数据库的前提下完成一系列单元测试工作。 DBunit关键知识点 IDataSet接口:用于操作表集合 ITable接口:用于操作表数据集合 DatabaseOperation类:对表数据执行一系列操作,比如刷新、删除...

Oumuv的博客 4935

DbUnit实践:Spring Test Dbunit,H2数据库

概述        Dbunit是一个基于JUnit的数据库集成测试框架。DBUnit 的设计理念就是在测试之前,给对象数据库植入我们需要的准备数据,最后,在测试完毕后,回溯到测试前的状态;它使数据库测试过程之间处于一种已知状态,如果一个测试用例对数据库造成了破坏性影响,它可以帮助避免造成后面的测试失败或者给出错误结果。        Spring Test DbUnit提供了Spr

and1kaney的专栏 1万+

DBunit入门

<br /> 使用DBTestCase子类设置数据库<br />第1步:创建你的数据集文件<br /><br />你的测试需要一些数据来辅助。也就是说你必须创建一个数据集。在大多数情况下你会使用XML数据集。你可以手动从头创建一个flat XML数据集或从你的数据库中导出一些数据。第2步:扩展类的DBTestCase<br />现在您需要创建一个测试类。最简单的使用DBUnit的方法是是你的测试类继承DBTestCase。DBTestCase扩展了JUnit TestCase类。一个getDataSet()

BoBo的代码世界 3522

org.dbunit.database.AmbiguousTableNameException 终极解决方案

项目的单元测试用到了dbunit进行数据组装,最近遇到了org.dbunit.database.AmbiguousTableNameException: XXXX数据库表 问题,在网上查找了不少资料,最终还是通过同事的帮助(数据库工程师)一起把问题解决。网上通常的解决方案是对connection增加schema问题即可解决,原因是不同的schema可能会遇到相同的表名,导致抛出错误。 但是这个问题

lw0532的专栏 4757

dbunit-spring-testmaven-dbunit-plugin使用

dbunit是一个基于junit扩展的数据库测试框架。它提供了大量的类对与数据库相关的操作进行了抽象封装。可以很方便的对数据库进行操作。 官网:http://www.dbunit.org/ 基本介绍: IDataSet:数据集 每一个都对应一个不同的数据源或加载机制。最常用的几种 IDataSet 实现为:  FlatXmlDataSet :数据的简单平面文件 XML 表示

skyboy11yk的专栏 5303

org.dbunit.database.AmbiguousTableNameException异常

org.dbunit.database.AmbiguousTableNameException 在jeesite数据库初始化中,发现报上述异常: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7: run (default-cli) on project jeesite: An An

hongweigg的专栏 7138

数据库测试的新选择Database-Rider

本文重点安利Database-Rider这个基于DBUnit的新轮子,着急的读者可以直接拉到最底下去了解。想看笔者唠嗑的可以顺序往下看,了解DBUnit以及Utilities-DBUn...

敏于思 捷于行 1900

什么是dbunit以及为什么要使用

dbunit是一个基于junit扩展的数据库测试框架。它提供了大量的类对与数据库相关的操作进行了抽象封装,虽然在80%的情况,你只需使用它极少的api。它通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态,从而使得测试自动化、可重复相对独立。虽然不用dbunit也可以达到这种目的,但是我们必须为此付出代价(编写大量代码,测试及维护),既然有了这么优秀的开源框架,我们又何必再造轮子

张龙(风中叶)的专栏 4893

dbunit使用

1.dbunit从名字上可以看出,是对有关数据库操作的测试。官网:www.dbunit.org从官网下载dbunit相关的jar包,dbunit还依赖于http://www.slf4j.orgcommons-logging.jar,所以也需要下载slf4j,使用它的slf4j-api-1.5.3.jarslf4j-jcl-1.5.3.jar。 dbunit的原理是:它会把数据库表里的

luoyuchuan的专栏 934

dbunit测试dao_用于数据库测试DBUnit,Spring注释

dbunit测试dao 如果您曾经尝试用Java编写数据库测试,则可能会遇到DBUnitDBUnit允许您设置拆除数据库,以便它包含可针对其编写测试的一致行。 通常,您可以通过编写一个简单的XML文档来指定要DBUnit插入的行,例如: <?xml version="1.0" encoding="UTF-8"?> <dataset> <Person ...

最佳 Java 编程 291

DBUnit入门

相信做过单元测试的人都会对JUnit非常的熟悉了,今天要介绍的DbUnit(http://dbunit.sourceforge.net/)则是专 门针对数据库测试的对JUnit的一个扩展,它可以将测试对象数据库置于一个测试轮回之间的状态。鉴于目前国内介绍DbUnit的系统教程比较少见,本文 将分从理论实例两个方面带你领略DbUnit的精彩世界。 DbUnit设计理念 熟悉单元测试的开发人员都知...

weixin_33972649的博客 2111

dbunit使用方法

1.dbunit从名字上可以看出,是对有关数据库操作的测试。官网:www.dbunit.org从官网下载dbunit相关的jar包,dbunit还依赖于http://www.slf4j.orgcommons-logging.jar,所以也需要下载slf4j,使用它的slf4j-api-1.5.3.jarslf4j-jcl-1.5.3.jar。 dbunit的原理是:它会把数据库表里的数据

zhangyz_6719369的专栏 1887

使用DBUnit,SpringTestNG进行数据库单元测试

我真的很喜欢Spring,因此我倾向于充分利用它的功能。 但是,在其哲学的某些黑暗角落,我倾向于不同意其某些假设。 一种这样的假设是数据库测试的工作方式。 在本文中,我将解释如何配置您的项目,以使Spring TestDBUnit在多开发人员环境中协同工作。 语境 我的基本需求是能够测试一些复杂的查询:在进行集成测试之前,我必须验证那些查询是否可以为我提供正确的结果。 这些本质上...

dlz00001的博客 566

dbunit测试dao_使用DBUnit,SpringTestNG进行数据库单元测试

dbunit测试dao 我真的很喜欢Spring,因此我倾向于充分利用它的功能。 但是,在其哲学的某些黑暗角落,我倾向于不同意其某些假设。 一种这样的假设是数据库测试的工作方式。 在本文中,我将解释如何配置项目以使Spring TestDBUnit在多开发人员环境中协同工作。 语境 我的基本需求是能够测试一些复杂的查询:在进行集成测试之前,我必须验证这些查询是否可以得到正确的结果。...

dlz00001的博客 417
上一篇: JVM学习序列之一:Java Class文件结构分析
下一篇: Java反射之Method调用和Filed设置
abing37
博客等级 码龄21年 34粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值