2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 追求代码质量: 使用 TestNG-Abbot 实现自动化 GUI 测试

追求代码质量: 使用 TestNG-Abbot 实现自动化 GUI 测试

时间:2018-12-15 22:42:53

相关推荐

追求代码质量: 使用 TestNG-Abbot 实现自动化 GUI 测试

在本系列中,我已经介绍了一些关于 TestNG 的内容,这里将继续介绍 TestNG。基本上,TestNG 是 JUnit 的一个替代物。除了所有预期的功能外,它还增加了一些额外功能。正如我在其他文章中提到的一样,TestNG 特别适合于更高层次的测试,其中,它可以用来测试依赖关系并只返回失败了的测试 —— 简而言之,在测试 GUI 时,这类型测试非常方便。(参见 Resources 中有关 TestNG 的更多内容。)

它的起源就如此让人印象深刻,所以 TestNG-Abbot 成为测试工具中的神童就没什么好奇怪的了。同 Abbot 一样,TestNG-Abbot 使 GUI 组件能够进行编程隔离。同时,它使用了 TestNG 的断言,将 GUI 操作细节提取到了简单的 fixture 中,后者能够公开验证方法。如能正确使用,TestNG-Abbot 的直观的 fixture 类能够使 GUI 测试如同从小男孩手里偷一块糖一样简单。(当然,您不会想那么干的!)

直观的 fixture 类

TestNG-Abbot 的当前版本支持七种 fixture 类型,其中一种类型用于操作按钮、菜单标签以及文本项组件,如文本字段。此外,这些 fixture 类型根据名字在逻辑上链接到了测试中的代码(即 GUI 组件)。这使得 GUI 和其测试实现了松耦合,这样做至少有以下两个好处:

测试不会依赖于特定位置的 GUI 组件 —— 这样无需中断测试就可对其进行移动。可以在早期进行测试,并且不会受到开发期间布局和外观改变的影响。

虽然目前只支持七种 fixture 类型,很快就会支持其他 fixture 类型。更多的 fixture 类型只会增加 TestNG-Abbot 在编程验证 GUI 方面的高效性。

GUI 验证不再普通!

虽然 TestNG-Abbot 使得验证 GUI 的过程更加简单,这并不意味着这个过程很简单。必须使 GUI 测试区别于单元或组件测试。验证 GUI 中业务规则的过程变成了对用户场景进行验证;或者,换种说法,GUI 测试包括验证可见状态的改变。

比方说,如果按下了定单输入 GUI 上的保存按钮,业务规则会保证命令的内容被保存到数据库中。然而,在一个用户场景中,会保证成功的状态信息被插入了按钮下 —— 这正是使用 TestNG-Abbot 能够编写的测试。事实上,如果 GUI 设计良好的话,可以测试被保存到数据库中的命令内容而无需测试 GUI。接着您还可以同时并及早地编写这两个特别的测试。

Word Finder GUI

为了使您了解 TestNG-Abbot 工作原理,我创建了一个简单的 GUI,它执行一种功能 —— 在底层字典(也就是一个数据库)中查阅一个给定的单词并显示其释义。不管该应用程序实际的代码如何,测试该 GUI 用户场景包括三个步骤:

在文本框中输入一个单词。单击Find Word按钮。验证是否给出了该单词释义。

当然,也存在一些极端的例子,比如一个用户按下了 Find Word 按钮但没有输入单词,或者,用户输入了一个无效的单词。我将通过一些其他的测试案例说明如何处理这类场景。

了解 GUI

图 1 显示了已启动的 Word Finder GUI。记住该 GUI 之所以简单只有一个原因:它演示了 TestNG-Abbot 的三个 fixture 类以及一些要引导的测试用例!

图 1. Word Finder GUI

当使用 TestNG-Abbot 进行测试时,应该首先检查 GUI 的组件。Word Finder GUI 由图 2 所示的三个组件组成:

图 2. Word Finder GUI 的组件

如您所见,Word Finder GUI 由一个JTextField(用来输入要查询的单词)、一个JButton(使 GUI 从字典数据库中获取释义)和一个JEditorPane(显示释义)组成。

在良好的场景中,如果我输入pugnacious然后单击 Find Word 按钮,JEditorPane将显示 “Combative in nature; belligerent”,如图 3 所示:

图 3. 良好的场景 —— 工作良好!

使用 TestNG-Abbot 进行测试

要开始使用 TestNG-Abbot,需要创建一个常规的测试 fixture,它将使用 TestNG 的BeforeMethodAfterMethod注释为您的 GUI 创建一个实例。TestNG-Abbot 框架附带了一个方便的AbbotFixture对象,它简化了 GUI 组件的使用,实际上也引导了整个测试过程。要在测试 fixture 中使用该对象,需要在测试前将一个 GUI 实例传递给 fixture 对象的showWindow()方法,然后使用名为cleanUp()的方法对 fixture 进行清理。

在清单 1 中,我创建了一个 TestNG 测试(实际上并没有对其做任何测试),该测试在 fixture 中使用 TestNG-Abbot 的AbbotFixture对象来存放 Word Finder GUI 的实例。

清单 1. 使用 AbbotFixture 对象定义 WordFindGUITest

由于 Word Finder GUI 的用户可见的行为会影响 图 2 所示的三个组件,需要通过编程对其进行调整,以确保工作能正常进行。比如,验证 图 3 演示的良好的场景,需要执行下面三个步骤:

获得对JTextField的引用并向其添加一些文本。获得JButton的句柄并单击它。获得对JLabel组件的引用并检验是否显示了正确的释义。

检验良好的场景

使用 TestNG-Abbot,可以通过这三个方便的 fixture 类型执行上面所属的三个步骤:TextComponentFixture用于JTextFieldButtonFixture用于Find Word按钮;LabelFixture用来验证JLabel中特定的文本。

清单 2 显示了用于验证 图 3 中演示的内容是否可以正常工作的代码:

清单 2. 测试一个良好场景

注意 fixture 对象通过一个逻辑名称和特定的 GUI 组件连接在一起。例如,在 Word Finder GUI 中,通过编程将JButton对象与 “findWord” 名称联系起来。请注意在定义按钮时,我是如何通过调用组件的setName()方法做到这点的,如清单 3 所示:

清单 3. 定义 Find Word 按钮

同样要注意,在 清单 2 中,我是如何通过将 “findWord” 名称传递给 TestNG-Abbot 的ButtonFixture对象而获得对按钮的引用。“单击” 按钮(调用click方法)然后使用 TestNG-Abbot 的LabelFixture对象插入单词的释义,多么酷!不过不要就此满足。

测试意外场景

当然,如果我非常希望验证我的 Word Finder GUI,我必须确保在用户执行意外操作时 —— 程序能够正常工作,比如在输入单词之前按下 Find Word 按钮,或者情况更糟,比如他们输入了一个无效的单词。举例来说,如果用户没有向文本字段输入内容,GUI 应该显示特定的信息,如清单 4 所示:

图 4. 糟糕的极端例子

当然,使用 TestNG-Abbot 测试这种情况非常简单,不是吗?我所做的仅仅是将空值传送到TextComponentFixture中,按下按钮(通过对ButtonFixture使用click方法)并插入 “Please enter a valid word” 响应!

清单 4. 测试一个极端例子:如果有人没有输入单词就按下了按钮该怎么办?

如清单 4 所示,一旦理解了获得所需 GUI 组件的引用时,事情并不是很困难。最后一步是检验其他糟糕的极端例子 —— 输入了无效的单词。这个过程与 清单 1 和 清单 3 非常相似:仅仅是将所需的String传递到TextComponentFixture对象,单击,然后插入特定的文本。如清单 5 所示:

清单 5. 轻松验证另一个极端例子!

清单 5 很好地验证了图 5 演示的功能,难道您不这样认为吗?

图 5. 输入了无效单词

真不错!我们已经使用 TestNG-Abbot 轻而易举地验证了三种不同的用户场景。对于每种情况,我需要的只是被测试的组件的逻辑名称以及一系列步骤,以便创建场景。

继续测试 GUI

TestNG-Abbot 可能是测试工具中的新生儿,但它从其前辈那里继承了一些非常有用的特性。本文向您展示了如何使用 TestNG-Abbot 通过编程的方法将 GUI 组件隔离,然后使用 fixture 公开组件的验证方法。在这个过程中,您了解了对正常情况下的场景(所有事务都合乎逻辑)以及无法预见场景下(包括意外操作)进行测试是多么简单。总之,你只需要知道场景和组件在其中起到了作用。使用 TestNG-Abbot 方便的 fixture 对象可以很轻易地改变组件的行为。

参考资料

学习

您可以参阅本文在 developerWorks 全球站点上的 英文原文 。

“TestNG 使 Java 单元测试轻而易举”(Filippo Diotalevi,developerWorks, 年 1 月):TestNG 简介。

“追求代码质量:JUnit 4 与 TestNG 的对比”(Andrew Glover,developerWorks, 年 8 月):介绍了 TestNG 独有的三个高级测试特性。

“Getting Started with the Abbot Java GUI Test Framework”(Timothy Wall,Sourceforge):对 Abbot 进行了概述。

“Even easier GUI testing with TestNG-Abbot”(Alex Ruiz 的 Weblog, 年 2 月):Alex Ruiz(TestNG-Abbot 的开发者之一)简单介绍了该项目将包含的内容。

“追求代码质量:通过测试分类实现敏捷构建”(Andrew Glover,developerWorks, 年 10 月):介绍了确保端对端系统稳定性所需的三种测试类别。

“用 DbUnit 和 Anthill 控制测试环境”(Philippe Girolami,developerWorks, 年 4 月):学习如何处理连续集成以及如何结合使用 DbUnit 和 JUnit 来控制测试环境。

“深入探索 JUnit 4”(Andrew Glover,developerWorks, 年 2 月):该教程介绍了使用 JUnit 的新特性(通过注释启用),包括参数测试、异常测试和定时测试。

Become a GUI testing cleric with TestNG-Abbot in 4 steps(, 年 2 月):学习如何通过 4 个简单的步骤设置 TestNG-Abbot。

Testing GUI applications with TestNG (, 年 1 月):使用 TestNG-Abbot 测试 GUI 的另一个示例。

追求代码质量系列(Andrew Glover,developerWorks):了解更多关于编写专注于质量的代码的信息。

developerWorks Java 技术专区: 这里有数百篇关于 Java 编程各方面的文章。

获得产品和技术

下载 TestNG:一个受 JUnit 和 NUnit 启发而创建的测试框架,但该框架引入了一些新特性,使其功能更强大,也更容易使用。

下载 TestNG-Abbot:TestNG 和 Abbot 框架的结合,使得测试 GUI 更加简单!

讨论

参与论坛讨论。

关于作者

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。