追求代码质量 – 利用TestNG-Abbot实现自动化GUI测试
当前位置:以往代写 > JAVA 教程 >追求代码质量 – 利用TestNG-Abbot实现自动化GUI测试
2019-06-14

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

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

副标题#e#

利用Swing、AWT 和雷同的技能构建用户界面凡是会给开拓人员举办测试带 来挑战,原因如下:

底层图形框架的巨大性

GUI 中表示形式和业务逻辑之间的耦合

缺乏直观的自动测试框架

虽然,前两个原因并不新鲜 —— 图形框架原来就很巨大,并且向 GUI 应用措施添加业务成果老是会给测试造成贫苦。另一方面,已往几年中有很多利便的框架涌现出来,确实使 GUI 测试越发便利。

本月,我将先容一种新的框架,它极大地减轻了 GUI 测试的疾苦。

TestNG-Abbot 简介

TestNG-Abbot 源自于两个乐成的开拓人员测试框架的团结:Abbot 和 TestNG。Abbot 是一种 JUnit 扩展框架,主要目标是使 GUI 组件实现编程断绝 ,它还提供了一种验证 GUI 行为的浅易要领。举例来说,可以利用它来获取对 按钮组件的引用,利用编程的要领点击按钮,然后检讨其操纵。Abbot 还附带了 一个剧本记录器,利用它就可以或许以 XML 名目布设测试场景,可以通过编程的方 式运行它。

在本系列中,我已经先容了一些关于 TestNG 的内容,这里将继承先容 TestNG。根基上,TestNG 是 JUnit 的一个替代物。除了所有预期的成果外,它 还增加了一些特别成果。正如我在其他文章中提到的一样,TestNG 出格适合于 更高条理的测试,个中,它可以用来测试依赖干系并只返回失败了的测试 —— 简而言之,在测试 GUI 时,这范例测试很是利便。

它的发源就如此让人印象深刻,所以 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。接着 您还可以同时并赶早地编写这两个出格的测试。

加油!

记着 TestNG-Abbot 并不故障端对端测试(end-to-end)。可以轻 松将 TestNG-Abbot 和 DbUnit 团结在一起,好比,建设一个同时验证用户场景 和业务法则的可反复测试。


#p#副标题#e#

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测试

当利用TestNG-Abbot 举办测试时,应该首先查抄 GUI 的组件。Word Finder GUI 由图 2 所示的三个组件构成:

图 2. Word Finder GUI 的组件

追求代码质量 - 操作TestNG-Abbot实现自动化GUI测试

#p#分页标题#e#

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

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

图 3. 精采的场景 —— 事情精采!

追求代码质量 - 操作TestNG-Abbot实现自动化GUI测试

#p#副标题#e#

利用TestNG-Abbot 举办测试

要开始利用TestNG-Abbot,需要建设一个通例的测试 fixture,它将利用TestNG 的BeforeMethod 和 AfterMethod 注释为您的GUI 建设一个实例。TestNG-Abbot 框架附带了一个利便的AbbotFixture 工具,它简化了 GUI 组件 的利用,实际上也引导了整个测试进程。要在测试 fixture 中利用该工具,需 要在测试前将一个 GUI 实例通报给 fixture 工具的showWindow() 要领,然后 利用名为 cleanUp() 的要领对 fixture 举办清理。

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

清单 1. 利用AbbotFixture 工具界说 WordFindGUITest

public  class WordFindGUITest {
  private AbbotFixture fixture;

  @BeforeMethod
  private void initializeGUI() {
  fixture = new AbbotFixture();
  fixture.showWindow(new WordFind(), new Dimension(269,  184));
  }

  @AfterMethod
  public void tearDownGUI() {
  fixture.cleanUp();
  }
}

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

得到对 JTextField 的引用并向其添加一些文本。

得到 JButton 的句柄并单击它。

得到对 JLabel 组件的引用并检讨是否显示了正确的释义。

检讨精采的场景

利用TestNG-Abbot,可以通过这三个利便的fixture 范例执行上面所属的三个步调:TextComponentFixture 用于 JTextField;ButtonFixture 用于 Find Word 按钮;LabelFixture 用来验证 JLabel 中特定的文本。

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

清单 2. 测试一个精采场景

@Test
public void assertDefinitionPresent() {
  TextComponentFixture text1 = new TextComponentFixture (this.fixture,
   "wordValue");
  text1.enterText("pugnacious");

  ButtonFixture bfix = new ButtonFixture(this.fixture,  "findWord");
  bfix.click();

  LabelFixture fix = new LabelFixture(this.fixture,  "definition");
  fix.shouldHaveThisText("Combative in nature;  belligerent.");
} 

留意 fixture 工具通过一个逻辑名称和特定的GUI 组件毗连在一起。譬喻 ,在 Word Finder GUI 中,通过编程将 JButton 工具与 “findWord” 名称联 系起来。请留意在界说按钮时,我是如何通过挪用组件的setName() 要领做到 这点的,如清单 3 所示:

清单 3. 界说 Find Word 按钮

findWordButton = new  JButton();
findWordButton.setBounds(new Rectangle(71, 113, 105, 29));
findWordButton.setText("Find Word");
findWordButton.setName("findWord");

同样要留意,在 清单 2 中,我是如何通过将 “findWord” 名称通报给 TestNG-Abbot 的ButtonFixture 工具而得到对按钮的引用。“单击” 按钮( 挪用click 要领)然后利用TestNG-Abbot 的LabelFixture 工具插入单词的释义,何等酷!不外不要就此满意。

#p#副标题#e#

测试意外场景

虽然,假如我很是但愿验证我的Word Finder GUI,我必需确保在用户执行 意外操纵时 —— 措施可以或许正常事情,好比在输入单词之前按下 Find Word 按 钮,可能环境更糟,好比他们输入了一个无效的单词。举例来说,假如用户没有 向文本字段输入内容,GUI 应该显示特定的信息,如清单 4 所示:

图 4. 糟糕的极度例子

追求代码质量 - 操作TestNG-Abbot实现自动化GUI测试

虽然,利用TestNG-Abbot 测试这种环境很是简朴,不是吗?我所做的仅仅 是将空值传送到 TextComponentFixture 中,按下按钮(通过对 ButtonFixture 利用click 要领)并插入 “Please enter a valid word” 响应!

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

#p#分页标题#e#

@Test
public void assertNoWordPresentInvalidText() {
  TextComponentFixture text1 = new TextComponentFixture (this.fixture,
   "wordValue");
  text1.enterText("");

  ButtonFixture bfix = new ButtonFixture(this.fixture,  "findWord");
  bfix.click();

  LabelFixture fix = new LabelFixture(this.fixture,  "definition");
  fix.shouldHaveThisText("Please enter a valid word");
}

如清单 4 所示,一旦领略了得到所需 GUI 组件的引用时,工作并不是很困 难。最后一步是检讨其他 糟糕的极度例子 —— 输入了无效的单词。这个进程 与 清单 1 和 清单 3 很是相似:仅仅是将所需的String 通报到 TextComponentFixture 工具,单击,然后插入特定的文本。如清单 5 所示:

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

@Test
public void assertNoWordPresentInvalidText() {
  TextComponentFixture text1 = new TextComponentFixture (this.fixture,
   "wordValue");
  text1.enterText("Ha77");

  ButtonFixture bfix = new ButtonFixture(this.fixture,  "findWord");
  bfix.click();

  LabelFixture fix = new LabelFixture(this.fixture,  "definition");
  fix.shouldHaveThisText("Word doesn't exist in  dictionary");
}

清单 5 很好地验证了图 5 演示的成果,莫非您不这样认为吗?

图 5. 输入了无效单词

追求代码质量 - 操作TestNG-Abbot实现自动化GUI测试

真不错!我们已经利用TestNG-Abbot 垂手可得地验证了三种差异的用户场 景。对付每种环境,我需要的只是被测试的组件的逻辑名称以及一系列步调,以 便建设场景。

继承测试 GUI

TestNG-Abbot 大概是测试东西中的新生儿,但它从其前辈哪里担任了一些非 常有用的特性。本文向您展示了如何利用TestNG-Abbot 通过编程的要领将 GUI 组件断绝,然后利用fixture 果真组件的验证要领。在这个进程中,您相识了 对正常环境下的场景(所有事务都合乎逻辑)以及无法预见场景下(包罗意外操 作)举办测试是何等简朴。总之,你只需要知道场景和组件在个中起到了浸染。利用TestNG-Abbot 利便的fixture 工具可以很等闲地改变组件的行为。

    关键字:

在线提交作业