DBUNIT使用

上传人:206****923 文档编号:41650587 上传时间:2018-05-30 格式:DOC 页数:35 大小:506.50KB
返回 下载 相关 举报
DBUNIT使用_第1页
第1页 / 共35页
DBUNIT使用_第2页
第2页 / 共35页
DBUNIT使用_第3页
第3页 / 共35页
DBUNIT使用_第4页
第4页 / 共35页
DBUNIT使用_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《DBUNIT使用》由会员分享,可在线阅读,更多相关《DBUNIT使用(35页珍藏版)》请在金锄头文库上搜索。

1、用用 DbUnit 进行数据库集成测试进行数据库集成测试1 引言引言JUnit 家族为 Java 应用程序的单元测试提供了基本框架,除 JUnit 之外,还有许多用于专门测试领域的其他工具和框架,本章将介绍用于数据库集成测试的重要工具 DbUnit(注 1)。这里将数据库测试描述为“集成测试”,以便与普通“单元测试”相区分,集成测试涉及用户自身代码之外的架构,在数据库集成测试的情况下,额外的架构是真实数据库。DbUnit 通常称为“JUnit 扩展”,它提供了 TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。例如,可以从 A

2、nt 中调用 DbUnit 执行某些任务。本章将说明 DbUnit 的主要用途,并提供一些典型用法的简单示例,然后还将继续介绍一些其他相关主题。2 概述概述DbUnit 的用途的用途DbUnit 有两种主要用途:准备数据库准备数据库DbUnit 可以在执行每个测试方法前用已知内容设置表。验证数据库验证数据库DbUnit 可以在执行每个测试方法后更方便地验证表的内容。如果不使用 DbUnit,用户还有一些其他选择,不过这些选择有些难以使用。用户可以手工编写 JDBC 调用来准备和验证数据库,但这通常很难编写,并且需要做大量工作;另外,如果在主应用程序中使用对象关系映射(ORM),有人会建议通过它

3、来用测试数据填充数据库,以及从数据库中读取数据值进行验证,这相当于用自己的数据访问层来测试自己的数据访问层,它可能不是个好主意。ORM技术涉及相当多的技巧,例如缓存,用户最好不要使用它,以免测试失败。与此相对照,DbUnit 提供了一种相对简单灵活的方式来准备和验证数据库,这种方式独立于被测代码。设置设置 DbUnit要使用 DbUnit,首先需要从 http:/ 上下载 JAR 文件,将此 JAR 文件放在集成开发环境或构建脚本的类路径中,http:/ JDBC 驱动程序,除此之外,对于基本的 DbUnit 应用不需要其他依赖项。用户还应该阅读 http:/ 上的在线文档。接下来要决定调用

4、DbUnit 的方式。对于大多数测试场景,用户将在自己的测试类中直接或间接调用 DbUnit,后面将要看到,也可以从 Ant 中使用 DbUnit 来执行某些任务。用用 DbUnit 运行测试运行测试在用 DbUnit 进行数据库测试时是在对真实数据库进行测试,用户在运行测试时需要连接到真实数据库。由于 DbUnit 和被测代码将在此数据库中插入和修改数据,因此每个开发人员都需要或多或少地拥有对数据库或者至少是其中的模式(schema)的独占访问权限,否则,如果不同的开发人员同时运行测试,他们可能相互冲突。理想的设置是,每个开发人员在自己的计算机上安装数据库软件,现在的计算机功能足够强大,可以

5、用很小的开销来运行几乎任何数据库软件。用户不必在自己的计算机上拥有完整的生产数据库副本,在数据量相对小的情况下,DbUnit 测试工作得最好,它们通常测试系统功能是否正确,而不是测试系统性能。有人建议将轻量级的嵌入式数据库(如 HSQLDB 或 Apache Derby)用于运行集成测试,这样做的好处是,不需要在自己的计算机上安装特殊数据库软件,另外,使用嵌入式数据库运行测试的速度通常比真实数据库更快,因为可以在内存中运行大多数测试,并且一般开销更小。然而,对于重要的应用程序,这通常是误导。应用程序往往包含数据库特有的代码或使用数据库特有的功能,除非在运行测试时使用相同的数据库,否则,无法对这

6、些代码和功能进行正确测试。另外,即使是使用 ORM 层,如 Hibernate 或 JPA,这似乎使代码独立于数据库,但 ORM 生成的实际 SQL 代码也可能因数据库不同而异,JDBC 驱动程序无疑也不一样。因此,嵌入式数据库与生产数据库之间存在着显著的功能差异,要使测试尽可能有用和有效,应该努力使数据库环境相同。当然,如果生产系统本身使用嵌入式数据库会更好。JUNIT 下载地址:下载地址:http:/ DatabaseTestCase 或 IDatabaseTester 需要访问实际数据库时,它通过 IDatabaseConnection 接口进行访问。IDatabaseConnectio

7、n 本质上是一个 JDBC Connection 的包装程序或适配器,可以通过 DatabaseConfig 类来定制 IDatabaseConnection,DatabaseConfig 是一组“名称/值”形式的功能和属性,图 14-2 给出了这些类。IDataSetDbUnit 将用于测试的实际数据表示为 IDataSet,它是一组表中的数据的抽象表示。图 14-2:IDatabaseConnection 和 DatabaseConfigDbUnit 提供了 IDataSet 接口的几个具体实现,可以使用它们从不同数据源获取数据集以及为它们提供额外功能。图 14-3 中给出了部分实现,例如

8、,FlatXmlDataSet、CsvDataSet 和 XlsDataSet 是表示文件中数据的不同方式,后面将看到这些实现的例子,通过查看源代码,还可以找到其他实现形式。3DbUnit 的结构(的结构(1)开始使用 DbUnit 的最简单方式是扩展其提供的某个基类,不过,在后面的例子中将会看到,这不是必需的或并不总是可取的。首先介绍这些基类。与任何好的面向对象框架或程序库一样,DbUnit 包含了大量接口,大多数功能都由这些接口来规定。DbUnit 采用的约定是,接口以大写字母 I 打头。DbUnit 通常提供了接口的一些具体实现,典型情况下,将有一个抽象基类实现以及多个特定实体子类。Da

9、tabaseTestCaseDbUnit 中的主要基类是 DatabaseTestCase。在 DbUnit 2.2 之前,用户应扩展 Data-baseTestCase 来创建自己的测试类,从 DbUnit 2.2开始,应该扩展一个新的子类 DBTestCase。DBTestCase 的主要不同之处在于,它提供了一个委托给 IDatabase-Tester 接口的getConnection()方法,可以通过改写 newDatabaseTester()来提供或改写默认的 IDatabaseTester。IDatabaseTester 负责提供一些重要的测试功能:数据库连接。设置测试数据集。se

10、tup(设置)操作(通常是 CLEAN_INSERT)。teardown(清理)操作(通常是 none)。DbUnit 提供了一些标准 IDatabaseTester 实现,用户可以方便地使用和扩展这些实现,或者提供自己的实现。DatabaseTestCase 和 IDatabaseTester 的层次结构如图 14-1 所示。在后面的示例中,将会详细介绍这些类的工作情况,在说明相关例子时将参考这些图中的功能。3 DbUnit 的结构(的结构(2)ITable表用 ITable 接口表示,ITable 本质上是一组行和列,图 14-4 中给出了 ITable 及其部分实现。图 14-4:ITa

11、ble 及其部分实现ITableMetaData最后,DbUnit 使用 ITableMetaData 对象提供关于表的信息:表的名称和列的特征,图 14-5 给出了 ITableMetaData 及其部分实现。这些接口代表了 DbUnit 的核心功能,当然,DbUnit 包含的接口和类远不止这些,在后面的例子中,将会看到一些其他接口和类。要开始使用 DbUnit,并不需要理解所有这些类,某些类如 ITableMetaData 只会在自定义或扩展 DbUnit 时才会用到,通过后面的例子,将很好地理解这些类是如何相互配合以及如何在项目中使用它们。4 示例应用程序示例应用程序下面将通过一系列例子

12、来说明各种 DbUnit 功能,本书所附源代码中提供了这些示例的代码,同时还提供了设置和运行这些代码的 Ant 构建脚本。对于下面的例子将使用改编自 Spring 框架(注 2)的 PetClinic 应用程序的数据库模式,此应用程序是 Spring 框架提供的一个示例,它实现了经典的 Pet Store J2EE 演示程序。这里的大多数例子不依赖 Spring 框架我们只是将此数据库模式用作一个方便的示例应用程序。图 14-6 中给出了将要使用的 PetClinic 数据库模式,这里对原始版本略微进行了修改,在其中添加了一些列,以便在演示特定 DbUnit 功能时使用。此应用程序的 Spri

13、ng 版本提供了针对 HSQLDB 和 MySQL 数据库的实现,对于本书中的示例,将在 Oracle 上运行该模式(可以为 Windows或 GNU/Linux 免费下载 Oracle Express Edition) ,create_tables.sql 文件中提供了定义该模式的 Oracle SQL DDL。5 准备数据库(准备数据库(1)开始的示例将演示如何用 DbUnit 在测试前用已知的测试数据来准备数据库,这样做的标准方式是使用测试的 setUp()方法,或者,更准确地说,是 DatabaseTestCase 的 setUp()方法。基本想法是用户提供包含所需数据的 IDataS

14、et,DbUnit 加载数据。在开始的示例中将使用 FlatXmlDataSet 数据集,它可能是最常用的 IDataSet 实现,后面将给出一些其他数据集格式。验证对单行数据的查询最简单的数据库测试是对从数据库中检索单行数据的代码进行测试。考虑 owners 表的这个数据访问对象(DAO,Data Access Object)接口:1.public interface OwnerDao 2. Collection findOwners(String lastName); 3. Owner loadOwner(int id); 4. void storeOwner(Owner owner);

15、5. void deleteOwner(Owner owner); 6. 此 DAO 包括了一个 loadOwner()方法,该方法按 ID 检索单个 Owner,以下代码给出了它的一个简单 JDBC 实现:1.public class JdbcOwnerDao extends AbstractJdbcDaoimplements OwnerDao 2. / . 3. public Owner loadOwner(int id) 4. Connection conn = null; 5. PreparedStatement stmt = null; 6. PreparedStatement stmt2 = null; 7. ResultSet rs = null; 8. try 9. conn = getConnection(); 10. stmt = conn.prepareStatement( 11. “SELECT id, first_name, last_name, address, city, telephone “ 12. + “FROM

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号