Welcome

首页 / 软件开发 / 数据结构与算法 / 用DbUnit和Anthill控制测试环境

用DbUnit和Anthill控制测试环境2011-01-23 IBM Philippe Girolami极限编程方法的兴起将测试驱动开发和持续集成带入了主流 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="aabbcc"/>
<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. 清单 1 中数据的表定义

OPE_OPERATOR
IDINT
CODEVARCHAR
ENCODED_STRINGVARCHAR

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