[JUNIT]通过测试分类实现敏捷构建(2)

文章作者 100test 发表时间 2007:03:14 16:34:42
来源 100Test.Com百考试题网


2. 组件测试
组件测试验证多个相互作用的对象,但它突破了隔离的概念。由于组件测试处理一个架构的多个层次,所以它们经常用于处理数据库、文件系统、网络元素等。同样,提前编写组件测试有点难,所以将其包含至一个真正的测试优先/测试驱动的场景中是很大的挑战。
编写组件测试要花更长的时间,因为它们比单元测试所涉及的东西要多。另一方面,由于其宽广的范围,它们实现了比单元测试更广的代码覆盖率。当然它们也要花更多时间运行,所以同时运行很多的组件测试会显著地 增加总的测试时间。
许多框架有助于测试大型架构组件。DbUnit 是这类框架的一个典型例子。DbUnit 能够很好地处理在测试状态间建立一个数据库这样的复杂性,因而它会使编写依赖于数据库的测试变得较为简单。
当构建的测试延长时,通常都预示着包含了一个大型的组件测试套件。由于这些测试比真正的单元测试运行时间长,因而不能一直运行它们。相应地,在 CI 环境中这些测试可以至少 每小时运行一次。在签入任何代码前,也应该总在一个本地开发人员机器上运行这些测试。
验收测试
验收测试 和功能测试类似,不同之处在于,理想情况下,验收测试是由客户或最终用户编写的。正如功能测试一样,验收测试也像最终用户测试那样进行。Selenium(参见 参考资料)是一个备受瞩目的验收框架,它使用浏览器测试 Web 应用程序。Selenium 在构建过程中可以是自动运行的,就像 JUnit 测试一样。但 Selenium 是一个新平台:它不使用 JUnit,在使用方式上也不相似。

3. 系统测试
系统测试端到端地 验证一个软件应用程序。因而,它们引入了一个更高级别的架构复杂度:整个应用程序必需为要进行的系统测试而运行。如果是一个 Web 应用程序,您就需要访问数据库以及 Web 服务器、容器和任何与运行系统测试相关的配置。其遵循这样的原则,即大多数系统测试都在软件生命周期的较后周期中编写。
编写系统测试是个挑战,也需要大量的时间来实际地执行。而另一方面,就架构性代码覆盖率来讲,系统测试是一件极为划算的事情。
系统测试和功能测试很相似。所不同的是,它们并不仿效用户,而是模拟出 一个用户。与在组件测试中一样,现在创建了大量的框架来为这些测试提供方便。例如,jWebUnit 通过模拟一个浏览器来测试 Web 应用程序。
用 jWebUnit 还是 Selenium 呢?
jWebUnit 是为系统测试设计的一个 JUnit 扩展框架;因而它需要您来编写测试。Selenium 在验收测试和功能测试方面表现卓越,不同于 jWebUnit,它使非程序员也能够编写测试。理想情况下,团队可以同时 使用两种工具来验证应用程序的功能。

实现测试分类
所以,您的单元测试套件就是名副其实的包括单元测试、组件测试和系统测试的套件。不仅如此,在检查了这些测试后,您现在知道构建花了三个小时的原因是:绝大部分时间都被组件测试所占用。下一个问题是,如何用 JUnit 实现测试分类?
有几种方式可选,但这里我们只关注于其中两种最简单的方式:
根据所需种类创建定制的 JUnit 套件文件。
为每种测试类型创建定制目录。
用 TestNG 进行测试分类
用 TestNG 实现测试分类相当简单。用 TestNG 的 group 注释按照种类在逻辑上划分测试,这与将适当的 group 注释应用到所需测试中一样简单。这样一来,运行一个特定类型实际上就是将一个相应的组名称传递给一个测试运行程序,如 Ant。

创建定制套件
可以使用 JUnit 的 TestSuite 类(属于 Test 类型)来定义许多互相归属的测试。首先,创建一个 TestSuite 实例,并为其添加相应的测试类或测试方法。然后,可以通过定义一个叫做 suite() 的 public static 方法,在 TestSuite 实例中指定 JUnit。包含的所有测试随后将在单个运行中执行。因而,可以通过创建单元 TestSuite、组件 TestSuite 和系统 TestSuite 来实现测试分类。
例如,清单 1 中显示的类创建了一个 TestSuite,其持有 suite() 方法中所有的组件测试。请注意此类并不是非常特定于 JUnit 的。它既没有扩展 TestCase,也没有定义任何测试用例。但它会反射性地找到 suite() 方法并运行由它返回的所有测试。

清单 1. 用于组件测试的 TestSuite
package test.org.acme.widget.import junit.framework.Test.import junit.framework.TestSuite.import test.org.acme.widget.*.public class ComponentTestSuite { public static void main(String[] args) { junit.textui.TestRunner.run(ComponentTestSuite.suite()). } public static Test suite(){ TestSuite suite = new TestSuite(). suite.addTestSuite(DefaultSpringWidgetDAOImplTest.class). suite.addTestSuite(WidgetDAOImplLoadTest.class). ... suite.addTestSuite(WidgetReportTest.class). return suite. }}

相关文章


设计模式:Java设计模式之计数代理模式
如何在内部类中返回外部类对象
[JUNIT]通过测试分类实现敏捷构建(2)
感受JDO2.0查询语言的特点
[JUNIT]通过测试分类实现敏捷构建(3)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛