`
yugouai
  • 浏览: 498477 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DBUnit与H2内存数据库结合(单元测试)

    博客分类:
  • java
 
阅读更多

       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报告。

        

分享到:
评论

相关推荐

    数据库操作的单元测试

    传统的单元测试通常不涉及外部资源,但当测试的对象直接与数据库交互时(例如DAO层),就需要确保数据库处于一个已知且可预测的状态。DBunit允许开发者在测试前将数据库的状态设定为一个特定的状态,并在测试结束后...

    DBUnit 进行单元测试

    在实际开发中,DBUnit还支持自定义操作、复杂查询结果验证等功能,可大大提高数据库测试的效率和准确性。结合持续集成工具如Jenkins,DBUnit能确保数据库层的代码质量,为整个项目的稳定性提供保障。因此,对于任何...

    使用dbunit测试数据库

    在使用 DbUnit 进行数据库测试时,首先需要准备测试环境。在这个例子中,我们创建了一个名为 "student" 的测试数据库,该数据库是在 MySql 中建立的。接着,在一个名为 "DBUnitSample" 的 Java 工程中,导入了 ...

    dbunit-2.2.3-prj.rar_DbUnit 2.2_dbunit_单元测试

    5. 集成其他测试框架:DbUnit 可以与JUnit、TestNG等主流的Java测试框架结合使用,为数据库测试带来便利。 在 `dbunit-2.2.3-prj.rar` 这个压缩包中,可能包含以下内容: - `www.pudn.com.txt`:这可能是一个说明...

    主题:在Spring中结合Dbunit对Dao进行集成单元测试

    在Spring框架中,进行Dao层的集成单元测试时,常常会结合Dbunit工具来实现数据库相关的测试。Dbunit是一款强大的Java库,它扩展了JUnit,为数据库提供了结构化数据的导入和导出,使得测试更加方便和可靠。下面将详细...

    对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    Dbunit是一个基于Java的数据库单元测试工具,它可以帮助开发者快速地编写数据库单元测试代码。Dbunit支持多种数据库管理系统,如MySQL、Oracle、DB2等。 四、Dbunit配置文件 在使用dbunit之前,需要在pom.xml文件...

    数据库单元测试

    有了DBUnit,一切都变了,DBUnit的目的就是在每个单元测试运行之前将数据库初始化成一个预定义的状态,以保证单元测试时的断言不会因为数据库状态发生了变化而失败,同时可以解决前一个单元测试失败导致对数据库的...

    dbunit单元测试

    DBUnit 是一个强大的开源工具,专门用于数据库的单元测试,它是JUnit框架的一个扩展,使得开发者在进行测试时能够更有效地管理和控制数据库的状态。这个工具的主要目的是确保测试的隔离性和可重复性,使得每次测试都...

    数据库单元测试总结~~单元测试

    5. **自动化**:利用自动化测试框架,如JUnit、NUnit或dbt(数据库测试)等,可以大大提高测试效率。 6. **持续改进**:随着代码的更新,单元测试也需要相应调整,确保新的功能和修改得到充分测试。 ### 数据库单元...

    使用DbUnit测试数据库.pdf

    DbUnit 是一个专门用于数据库测试的Java库,它扩展了JUnit框架,使得对数据库依赖的代码进行单元测试变得更加便捷和可控。在进行数据库测试时,DbUnit 能够帮助我们管理和控制测试数据库的状态,确保每次测试都能在...

    单元测试JUnit4和DbUnit

    总的来说,单元测试是保证软件质量的关键环节,而JUnit4和DbUnit的结合使用,使得对数据库驱动的应用程序进行单元测试变得更加便捷和可靠。通过深入学习和实践,开发者能够更有效地找出代码中的问题,提高代码的稳定...

    spring+dbunit测试访问数据库代码

    描述中的博文链接虽然没有具体内容,但通常会包含详细的步骤或示例代码,说明如何在Spring项目中设置和使用DBUnit进行数据库测试。 以下是基于给定的文件名可能涵盖的知识点: 1. **DBUnitDataLoaderImpl.java**:...

    基于DbUnit的单元测试框架设计

    DbUnit是一款开源的数据库功能测试框架,使用它可以对数据库的基本操作进行白盒单元测试,对输入输出进行校验,从而保证数据的有效性。DbUnit使用XML文件提供测试数据,为测试人员增加了测试难度,降低了单元测试效率。...

    Junit+dbunit单元测试jar包

    `Junit` 和 `dbunit` 是两个非常重要的工具,它们分别针对Java应用程序的单元测试和数据库测试提供支持。让我们详细了解一下这两个库以及如何将它们结合使用。 `Junit` 是一个流行的开源Java单元测试框架,由Ernst ...

    用DbUnit进行SqlMap单元测试

    通过这样的方式,DbUnit 和 SqlMap 结合使用,可以有效地对数据库操作进行单元测试,保证代码质量,并且简化了测试过程。测试的覆盖率和可靠性都会得到显著提升,这对于大型项目来说尤其重要,因为它有助于发现潜在...

    通向架构师的道路(第二十五天)SSH的单元测试与dbunit的整合.docx

    DbUnit是一个基于JUnit的数据库测试框架,它可以帮助我们测试数据库相关的代码。使用DbUnit,我们可以模拟数据库数据,并测试数据库相关的代码。例如,我们可以使用DbUnit来测试DAO层的代码,确保其能够正确地读取和...

    Dbunit数据库连接下载

    总的来说,Dbunit是一个强大的数据库测试框架,它简化了在Java项目中对数据库的操作,尤其是在测试环境中。通过与Flash的结合,还能实现前后端的深度交互,增强应用的数据库管理能力。正确理解和使用Dbunit,可以极...

Global site tag (gtag.js) - Google Analytics