return new FlatXmlDataSet(new File("test/conf/seed.xml"));
}
private IDatabaseConnection getConnection() throws
ClassNotFoundException, SQLException {
Class.forName("org.hsqldb.jdbcDriver");
final Connection jdbcConnection =
DriverManager.getConnection("jdbc:hsqldb:hsql://127.0.0.1",
"sa", "");
return new DatabaseConnection(jdbcConnection);
}
}
加入了 DbUnit,测试用例真的是可重复的了。在 handleSetUpOperation() 方法中,每当运行一个测试用例时,DbUnit 对数据执行一个 CLEAN_INSERT。此操作本质上将一个数据库的数据清空并插入一个新的数据集,从而删除任何之前创建的小部件。
再一次探讨什么是 DbUnit?
DbUnit 是一个 JUnit 扩展,用于在运行测试时将数据库放入一个已知状态中。开发人员使用 XML 种子文件将特定数据插入到测试用例所依赖的数据库中。因而,DbUnit 便利了依赖于一个或多个数据库的测试用例的可重复性。
但那并不意味着已经结束了对测试用例可重复性这一话题的探讨。事实上,一切才刚刚开始。
重复系统测试
我喜欢将 清单 1 和 清单 2 中定义的测试用例称为系统测试。因为系统测试运行安装完整的应用程序,如 Web 应用程序,它们通常包含一个 servlet 容器和一个相关联的数据库。这些测试的目的在于校验那些设计为端对端操作的外部接口(如 Web 应用程序中的 Web 页面)。
弹性优先级
作为总体规则,应在任何可能的时候避免测试用例继承。许多 JUnit 扩展框架都提供特定的可继承测试用例,以便利于测试一个特定的架构。然而由于 Java™ 平台的单一继承范例,使得从框架中继承类的测试用例饱受缺乏弹性之苦。通常,这些相同的 JUnit 扩展框架提供了代理 API,这使得联合各种不具有严格继承结构的框架变得十分简单。
由于设计它们的目的是为了测试功能完整的应用程序,因而系统测试趋向于增加运行次数而不是减少设置测试的总时间。例如,清单 1 和 清单 2 中展示的逻辑测试在运行前 需要下列步骤:
创建一个 war 文件,该文件包含所有相关 Web 内容,如 JSP 文件、servlet、第三方的 jar 文件、图像等。
将此 war 文件部署到目标 Web 容器中。(如果该容器尚未启动,启动该容器。)
启动任何相关的数据库。(如果需要更新数据库模式,在启动前进行更新。)
现在,对于一个微不足道的小测试要做大量的辅助性工作!如果证明这个过程是耗时的,那么您认为这个测试会间隔多长时间运行一次呢?面对要使系统测试在逻辑上可重复(在一个连续的集成环境中)这一需求,这个步骤列表的确令人望而生畏。
介绍 Cargo
好消息是可以在之前的列表中使所有主要设置步骤自动化。事实上,如果恰好从事过 Java Web 开发,可能已经用 Ant、Maven 或其他构建工具使步骤 1 自动化了。
步骤 2 却是一个有趣的障碍。自动化一个 Web 容器还是需要一定技巧的。例如,一些容器具有定制的 Ant 任务,这些任务方便了其自动部署及运行,但这些任务是特定于容器的。而且,这些任务还有一些假设,如容器的安装位置,还有更重要的是,容器已被安装。
Cargo 是一个致力于以通用方式自动化容器管理的创新型开源项目,因而用于将 WAR 文件部署到 JBoss 的相同的 API 也能够启动及停止 Jetty。Cargo 也能自动下载并安装一个容器。可以以不同的方式利用 Cargo 的 API,从 Java 代码到 Ant 任务,再到 Maven 目标。
运用一个如 Cargo 这样的工具,应对了在编写合乎逻辑可重复的测试用例中遇到的主要问题之一。另外,还可以构造一个构建用于驾驭 Cargo 的功能以 自动地完成下列任务:
下载一个所期望的容器。
安装该容器。
启动该容器。
将一个选定的 WAR 或 EAR 文件部署到该容器中。
很简单,是吧?接下来,您还能够用 Cargo 停止一个选定的容器。
“谈谈” Cargo
在深入 Cargo 前,最好先了解一下 Cargo 的基础知识。也就是说,由于 Cargo 与容器及容器管理相关,所以要理解了容器及容器管理的有关概念。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/