Swing 是一个强大的 GUI 工具包;它可扩展、可配置且跨平台。不过 Swing 的灵活性既是它的主要优势也是它的重大弱点。Swing 可以不同的方式构建同一 UI。例如,您可以使用插页、空白边框或填充符在 GUI 组件之间置入间隔。鉴 于 Swing 选项太多,了解现有 GUI 如同编写新 GUI 一样令人畏惧,且将其视 觉外观与底层代码对应起来也并非易事。(试着在阅读几个使用 GridBagLayout 的代码行时想象一下 GUI。)
不管您是在维护未曾写过的 Swing GUI 还是集成第三方 GUI 组件到您的应 用程序中,理解代码的一种合理方法是编写测试。在编写测试的同时您也就熟悉 了未知代码的内部构造。这样做会同时产生另一个有价值的结果,即您最终会有 一个测试套件,它有助于在维护代码时预防回归的引入。对于第三方 GUI 组件 ,测试套件有助于查明新版本的库是否引入了任何行为变化。
一开始最好先编写功能测试,以了解 GUI 如何响应用户输入。为 GUI 编写 测试比为非可视化代码编写测试更复杂,因为:
理论上,测试必须是自动化的,但是 GUI 则是供人类 — 而非计算机程序 — 使用的。
传统的单元测试涉及到隔离类的测试,不适合 GUI 组件。在 GUI 术语中, 一个 “单元” 涉及多个 GUI 组件的协作,因此它本身包含不止一个类。
GUI 响应用户生成的事件。要测试 GUI,你需要一种可以模拟用户输入的方 法,一直等到生成的事件散播给所有侦听者,然后检查结果,就像 GUI 响应用 户一样。编写模拟用户与 GUI 交互的代码会很繁琐且易出错。
更改 GUI 的布局不应影响强健的功能测试。
另外一个问题就是您必须事先熟知要测试的 GUI 的结构和行为,否则您不知 道自动化测试应使用哪些组件,且哪些内容需要验证。总而言之,要编写 GUI 测试,您必须知道:
GUI 中用于测试的组件
如何在测试中惟一标识这样的组件
特定用例中组件的预期状态(或属性)
使用可视化设计工具(比如 NetBeans Matisse)您可以弄清 GUI 的结构。 不过这种工具仅显示 GUI 的设计时信息,这会与您在运行时看到的不一样。例 如,有些组件可能会根据用户输入而显示为可见或不可见。
传统的调试程序在执行特定用例时不能帮助您了解 GUI 的状态。当调试程序 停在 Swing 代码中置入的断点时,GUI 绘图中断,使得 GUI 看起来像一个空白 方框。理想情况下,当 您使用调试程序进行单步调试时您希望看到 GUI 运作的 方式。
幸运的是,两个开源工具 — Swing Explorer 和 FEST-Swing — 可以帮助 您快速了解现有 Swing 代码。本文向您介绍这些工具,向您展示如何结合使用 它们检查应用程序的 GUI 结构,测试其功能,并识别潜在问题。
要探究的应用程序
对于文章的大部分示例,我将使用一种名为 HTMLDocumentEditor 的免费功 能性 HTML 编辑器,将其作为要测试的应用程序。如果您想自己完成示例,可以 下载 应用程序和样例测试代码。图 1 显示了运行中的 HTMLDocumentEditor:
图 1. HTML 编辑器