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测试必须知道:
- GUI中要测试的组件
- 如何在测试中唯一标识此类组件
- 在特定用例中组件的预期状态(或属性)
您可以使用可视化设计工具(例如NetBeans Matisse)来弄清GUI的结构。 但是,这种类型的工具仅显示GUI的设计时信息,该信息可能与您在运行时看到的信息不同。 例如,响应于用户输入,可以使一些组件可见或不可见。
传统的调试器无法帮助您在执行特定用例时了解GUI的状态。 当调试器在放置在Swing代码中的断点处停止时,GUI绘制被中断,从而导致GUI看起来像空白方块。 理想情况下,您希望在使用调试器逐步查看GUI 时看到其行为。
幸运的是,当需要了解现有的Swing代码时,两个开源工具Swing Explorer和FEST-Swing可以帮助您快速上手。 本文向您介绍了这些工具,向您展示了如何结合使用它们来检查应用程序的GUI结构,测试其功能并确定潜在的问题。
探索的应用
对于本文的大多数示例,我将使用一个免费的,功能强大HTML编辑器HTMLDocumentEditor作为要测试的应用程序(请参阅参考资料 )。 如果您想亲自研究这些示例,则可以下载该应用程序和示例测试代码。 图1显示了运行中HTMLDocumentEditor:
图1. HTML编辑器

在编写GUI测试之前,您需要了解GUI的组成。 HTML编辑器非常简单,由一个文本区域和几个用于打开,保存和编辑HTML文档的菜单组成。
了解每个组件的具体类型也很重要。 这将帮助您了解GUI组件通过其API提供的哪些操作或属性,以供您在测试中使用。 对于HTML编辑器,您需要确定文本区域是JTextArea
, JTextPane
还是自定义GUI组件。 确定GUI组件类型的一种方法是检查源代码。 根据GUI的实现方式,这可能是一件容易的事或具有挑战性的任务。 HTMLDocumentEditor的源代码易读且易于理解,对其进行快速检查即可发现该文本区域为JTextPane
。 但是在您的职业生涯中的某个时候,您可能会遇到很难理解的书面GUI代码。 发生这种情况时,您可以花费大量时间来解密该代码,也可以找到一种工具来高效地为您执行此操作。
介绍Swing Explorer
Swing Explorer使您可以直观地检查Swing GUI的内部(请参阅参考资料 )。 其简单,直观的UI使得在GUI中发现所有组件,调查它们的绘制方式,在任何时间点检查其属性等变得很容易。
Swing Explorer作为独立应用程序以及Eclipse和NetBeans的插件分发。 推荐的使用方式是通过IDE插件。 在本文中,我将使用Eclipse插件(请参阅参考资料 )。
安装该插件之后,我使用Swing Explorer启动HTML编辑器主类,如图2所示: