您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > DBunit
用DbUnit和Anthill控制测试环境
作者:网络转载 发布时间:[ 2013/1/23 14:02:45 ] 推荐标签:

极限编程方法的兴起将测试驱动开发和持续集成带入了主流 Java 开发实践。如果没有采用正确的工具,在 Java 服务器端开发中使用这些技术很快会成为一场噩梦。在本文中,软件开发人员 Philippe Girolami 描述了如何处理持续集成,以及如何联合使用 DbUnit 和 JUnit,以便在每次测试之前通过设置数据库状态来端到端地控制测试环境。

软件开发中重要的一种做法是测试。通过推荐测试优先的开发和持续集成,极限编程(Extreme Programming,XP)将这一逻辑推到了极限,在这里测试是尽可能频繁地自动进行的。不过,大多数非 XP 开发都进行了某种形式的测试,也许称为非回归测试、黑箱测试、功能测试或者其他的名字。很多项目使用关系数据库存储数据,因而所有测试策略都需要考虑在每次测试过程中数据库中所发生的事情:如果测试使测试数据库处于不一致状态,那么后面的所有测试都可能失败!一种避免这种情况的方法是在每次测试之前将数据库状态设为一个已知的相关状态。在本文中,我将介绍我们的小组是如何结合 JUnit 使用 DbUnit 做到这一点的,以及如何用 Anthill 自动生成测试报告。尽管设置看起来很费功夫,但是实际上并不是这样,并且它已经证明自己是一个有用的工具。

表示数据库内容


DbUnit 扩展了 JUnit,它使数据库在测试之间处于一种已知状态,帮助避免造成后面的测试失败或者给出错误结果的问题,如果测试会破坏数据库会出现这些问题。它可以读取表的内容并用 FlatXmlDataSet 将它在存储为 XML,如清单 1 所示:
清单 1. FlatXmlDataSet 示例

<dataset>  <OPERATOR       ID='APC (Washington/Baltimore)'       CODE='ABC5APC'      ENCODED_STRING='aabbclearcase/" target="_blank" >cc'/>  <OPERATOR       ID='ASA Ritabell'      CODE='ABC6ASA R'      ENCODED_STRING='bbccdd'/>  <OPERATOR       ID='Advanced Info. Service PLC'       CODE='ABC1Adva'       ENCODED_STRING='ccddee'/>  <OPE_OPERATOR       ID='Aerial Communications Inc.'       CODE='ABC2Aeri'       ENCODED_STRING='ddeeff'/></dataset>                 


这个数据集表示名为 OPE_OPERATOR 的数据库表中的三列,如表 1 中后三行所描述的:

表 1.中数据的表定义

 

OPE_OPERATOR
ID INT
CODE VARCHAR
ENCODED_STRING VARCHAR

每个 XML 实体标识数据库中的一个表,而每个属性表示一列的值。

在自己的项目中设置 DbUnit

设置 DbUnit 很简单。有关项目文件下载的信息,请参阅 参考资料的内容。可以将所有三个 JAR 文件加到项目的编译目标中以进行测试。

如果是一个多 schema 环境,那么要将 DbUnit.qualified.table.names 属性设置为 true 。使用 Oracle 的开发团队通常是这种情况:每一个用户有自己的 schema。这可以使您免于在每个表名前面加上 schema 名称的前缀,并可以在团队中共享测试数据。

DbUnit 使您可以容易地执行 JDBC 查询并获取它们的值。使用 DbUnit JDBC 包装器而不是纯粹的 JDBC 有几个理由:

    可以用 SQL 查询创建一个 Dataset ,并使用 DbUnit 的 assertion(断言)方法(在后面描述)。

    可以用 SQL 查询创建一个 Dataset ,并将它保存为一个 FlatXmlDataSet 。可以在以后将它重新装载到数据库中。

    可以容易地从任何行中获取列的内容,无需进行迭代。

 首先检查行计数是否为 1,然后检查第一行(从 0 开始计)中, FK_OTHER_ID 列包含数字 1234。

使用 assert 方法检查数据库内容

DbUnit 有断言方法,可以用于比较表的两组数据或者表的两个表示。如果需要在运行一次测试而不是多次查询后检查表的确切内容,一般会用它们。

创建数据

根据数据库的大小、架构的稳定性如何以及开发的进展情况,可能要从头开始创建或者从生产数据库中拷贝测试数据。

如果导出一个完整的生产数据库,可能必须要删除过多的行--或者像在这里一样,用一个查询而不是直接用连接创建一个数据集。提取本身对于很大的表来说可能是个问题--我们的小组只能用查询提取某些表的一部分。从表中删除行也有些问题,主要涉及到浏览所有外键并保证数据的一致性的困难。

添加测试数据

添加测试数据有时可能乏味的。我们的经验是度过正确添加数据的初困难阶段后,可以达到这样一个层次,不仅添加数据变得容易了,而且对数据库结构的理解也有了极大提高。

即使使用 Enterprise JavaBeans (EJB) 技术隐藏数据库,这种第一手知识仍然非常有用。因为开发人员对数据库有了更好的理解,因而可以更快地检查其内容,从而使调试更容易了。这在重构代码和数据库时又会给予我们极大的帮助。

用 DbUnit 和 JUnit 创建基类

好的 JUnit 实践鼓励开发人员扩展基类 TestCase 以获得特化(specialization)行为。DbUnit 提供了自己的特化-- DatabaseTestCase ,通过它可以特化行为以满足自己的需要。

首先,创建一个名为 ProjectDatabaseTestCase 的基本测试用例,并向它添加实用工具方法,然后,重新定义 setUp() 和 teardown() ,以使它们能够创建和销毁通过 DbUnit 到数据库的连接。

上一页12下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd