DBUnit是JUnit的一个扩展,对于数据库驱动的项目而言(基本上所有的Web项目都是数据库驱动的),对于服务层的单元测试非常麻烦,因为 不能保证每次测试时数据库都是同一个状态,所以开发者不敢写断言(assertEquals())。我个人也是因为这个原因所以对驱动测试开发总是敬而远 之。
有了DBUnit,一切都变了,DBUnit的目的就是在每个单元测试运行之前将数据库初始化成一个预定义的状态,以保证单元测试时的断言不会因为 数据库状态发生了变化而失败,同时可以解决前一个单元测试失败导致对数据库的操作未按照测试用例执行而影响后一个单元测试的问题。
为了提高单元测试效率和简化单元测试工作,下面介绍DBUnit与H2内存数据库结合作为单元测试,首先安装H2,详细请查看http://www.h2database.com/html/main.html
下面详细贴一下代码说明:
Maven依赖(当然可以依赖mysql)
<dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.4.6</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.171</version> </dependency>
Maven插件
<!-- maven sql 插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>sql-maven-plugin</artifactId> <version>1.3</version> <!-- <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> </dependencies> <configuration> <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://127.0.0.1:3306/dbunitdemo</url> <username>root</username> <password>123</password> <srcFiles> <srcFile>src/main/sql/dbunitdemo.sql</srcFile> </srcFiles> </configuration> --> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.171</version> </dependency> </dependencies> <configuration> <driver>org.h2.Driver</driver> <url>jdbc:h2:~/dbunitdemo</url> <username>sa</username> <password></password> <srcFiles> <srcFile>src/main/sql/dbunitdemo.sql</srcFile> </srcFiles> </configuration> </plugin>
编写Dao层,与平时编写Dao一样
public interface IUserDao { public Long save(User user) throws Exception; public User get(Long id) throws Exception; public void delete(Long id) throws Exception; public List<User> list() throws Exception; }
编写测试类
import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.List; import org.dbunit.DatabaseTestCase; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.ext.h2.H2Connection; import org.dbunit.ext.mysql.MySqlConnection; import com.duowan.dbunitdemo.entity.User; public class UserDaoTest extends DatabaseTestCase { private IUserDao userDao; @Override protected void setUp() throws Exception { userDao = new UserDaoImpl(); } @Override protected void tearDown() throws Exception { userDao = null; } protected IDatabaseConnection getConnection() throws Exception { Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:~/dbunitdemo", "sa", ""); return new H2Connection(conn, "dbunitdemo"); } protected IDataSet getDataSet() throws Exception { InputStream is = getClass().getResourceAsStream("/dbunitdemo-seed.xml"); System.out.println(is == null); return new FlatXmlDataSet(is); } public void testGet() throws Exception{ User user = userDao.get(1L); assertNotNull(user); assertEquals("admin1", user.getUsername()); assertEquals("123", user.getPassword()); assertEquals("Administrator1", user.getName()); User nullUser = userDao.get(0L); assertNull(nullUser); } public void testDelete() throws Exception{ User user = userDao.get(1L); assertNotNull(user); userDao.delete(1L); User nullUser = userDao.get(1L); assertNull(nullUser); } public void testList() throws Exception{ List<User> users = userDao.list(); assertNotNull(users); assertEquals(4, users.size()); } public void testSave() throws Exception{ User user = new User(); user.setName("testAdministrator"); user.setPassword("testPassword"); user.setUsername("testAdmin"); Long id = userDao.save(user); assertNotNull(id); User dbUser =userDao.get(id); assertNotNull(dbUser); assertEquals("testAdmin", dbUser.getUsername()); assertEquals("testPassword", dbUser.getPassword()); assertEquals("testAdministrator", dbUser.getName()); } }
测试类说明:
//返回测试用的数据库连接对象 protected IDatabaseConnection getConnection() throws Exception { } //返回测试用XML数据集对象 protected IDataSet getDataSet() throws Exception { }
jdbc连接方式格式为H2格式,H2会自动创建Database不用手工创建,但是表需要显式创建。这里是用用maven插件创建,工程以附件形上传。
基本原理就已经讲解完了,附件为例子程序,实现了一个领域模型类(User),一个Dao接口(IUserDao),定义了list\save \get\delete四个基本方法,一个用JDBC实现的Dao接口实现类(UserDaoImpl),建立一个UserDaoTest对JBDC版本 的Dao实现类进行测试。
另外这个工程使用maven进行build,如果对maven还是不很了解,请查考《Maven权威指南》
下载工程后,在项目根目录下执行mvn sql:execute,将使用Maven Sql插件导入src/main/sql/dbunitdemo.sql中的数据库脚本到数据库中。
然后可以直接运行mvn test进行单元测试,测试报告会在命令行输出,同时在target\surefire-reports下也会生成DBUnit报告。
相关推荐
2. 数据库单元测试测试流程介绍 1 2.1. 数据库单元测试的原因 1 2.2. 测试关注点 1 2.3. 测试流程 1 3. 数据库单元测试最佳实践 2 3.1. 数据库单元测试最佳实践 2 3.1.1. 从“易测试的”应用程序体系结构开始。 2 ...
有了DBUnit,一切都变了,DBUnit的目的就是在每个单元测试运行之前将数据库初始化成一个预定义的状态,以保证单元测试时的断言不会因为数据库状态发生了变化而失败,同时可以解决前一个单元测试失败导致对数据库的...
一个很好的DBUnit的例子 博文链接:https://virgoooos.iteye.com/blog/186859
DbUnit是一款开源的数据库功能测试框架,使用它可以对数据库的基本操作进行白盒单元测试,对输入输出进行校验,从而保证数据的有效性。DbUnit使用XML文件提供测试数据,为测试人员增加了测试难度,降低了单元测试效率。...
1。利用MySql数据库建立一个测试的数据库student: 2.建立新的java工程,例如DBUnitSample, 将DbUnit jar文件和MySql数据库驱动文件导入到工程中: 3.编写连接MySql数据库的类以及用于测试的类
采用 Java 编写的数据库系统单元测试程序。
dbunit2.2完全包 数据库单元测试
用于数据库测试的一个工具,具有很强的灵活性。也是自己在网上找的,分享一下
unitils整合dbunit利用excel进行单元测试 包含mock以及整合spring进行测试
单元测试入门学习,和dbunit结合开发
使用DbUnit测试数据库.pdf
Junit,dbunit单元测试jar包
专门针对数据库测试的对JUnit 的一个扩展,它可以将测试对象数据库置于一个测试轮回之间的状态。
NULL 博文链接:https://xiangxingchina.iteye.com/blog/1752521
DBUnit:PHPUnit的数据库测试库
用DbUnit进行SqlMap单元测试 摘自:http://www.uml.org.cn/Test/200811278.asp
下面小编就为大家带来一篇对dbunit进行mybatis DAO层Excel单元测试(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧