GUI测试Java Swing应用程序

时间:2016-10-28 06:56:48

标签: java swing user-interface gui-testing

我想构建一个用于测试Swing应用程序的Java GUI测试工具,我想知道如何在Java Swing应用程序中查找和操作组件,并使用if来点击和按键,输入文本等。

测试中的应用程序以批处理文件设置参数启动,最后调用它  "%JRE_HOME%\ bin中\ javaw.exe的" %ARG%com.sun.javaws.Main%JAVAWS_PARAMS%http://%SERVER%:8080/appundertest/appundertest.jnlp

如果我新增了视图和按钮的名称,我怎样才能找到一个按钮并模拟从另一个java程序中点击它?

被测程序的源代码可以在同一个存储库中找到。 不允许使用被测程序的仪器。

我没有找到GUI测试工具来做这件事,我想从我自己的java应用程序中做到这一点。

1 个答案:

答案 0 :(得分:4)

  

我没有找到GUI测试工具来做这件事,我想从中做到   我自己的java应用程序。

TLDR :检查assertj-swing的来源,并在此之后决定是否需要编写自己的。

我想请你耐心,因为我仍然从引用现有的测试工具开始我的答案。 assertj-swing(FEST的分支)在他们的入门指南中展示了以下示例。

public class SimpleCopyApplicationTest {
  private FrameFixture window;

  @BeforeClass
  public static void setUpOnce() {
    FailOnThreadViolationRepaintManager.install();
  }

  @Before
  public void setUp() {
    SimpleCopyApplication frame = GuiActionRunner.execute(() -> new SimpleCopyApplication());
    window = new FrameFixture(frame);
    window.show(); // shows the frame to test
  }

  @Test
  public void shouldCopyTextInLabelWhenClickingButton() {
    window.textBox("textToCopy").enterText("Some random text");
    window.button("copyButton").click();
    window.label("copiedText").requireText("Some random text");
  }

  @After
  public void tearDown() {
    window.cleanUp();
  }
}

请参阅:http://joel-costigliola.github.io/assertj/assertj-swing-getting-started.html

此示例与浏览器自动化测试(例如Selenium)通常可行的方式不同。它不是针对应用程序的真实实例运行测试,而是将您的应用程序GUI容器(更高或更低级别)包装在另一个名为 Fixture 的对象中,就像JFrame一样。然后将针对此Fixture对象的实例执行检查。

这是否意味着,无法运行整个应用程序?否。

如果你花了一些时间在assertj-swing的github存储库中,它有一个名为ApplicationLauncher.java的类,它允许你实例化一个具有 main方法的类。

  

从具有" main"的类中执行Java应用程序。方法

     

https://github.com/joel-costigliola/assertj-swing/blob/master/assertj-swing/src/main/java/org/assertj/swing/launcher/ApplicationLauncher.java

让我们记住Sergiy提到的java.awt.Robot在这里真的很重要。

  

此类用于为其生成本机系统输入事件   测试自动化,自运行演示等的目的   需要控制鼠标和键盘的应用程序。该   Robot的主要目的是促进Java的自动化测试   平台实施。

     

使用类生成输入事件与发布事件不同   事件所在的AWT事件队列或AWT组件   在平台的本机输入队列中生成。例如,   Robot.mouseMove实际上会移动鼠标光标而不仅仅是   生成鼠标移动事件。

来源:https://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html

我们现在可以看到另一个例子:

    ApplicationLauncher.application(app.qahelp.core.app.Runner.class)
            .withArgs(arg).start();
    ...
    robot = BasicRobot.robotWithCurrentAwtHierarchy();
    // Find main frame of application
    FrameFixture frame = WindowFinder.findFrame(
            getMainFrameByName("Celsius")).using(robot);
    frame.focus();

    // Type 120 in text box
    frame.textBox("tempCelsius").setText("120");
    ...

    frame.button("convertTemp").click();
    ...

    // Get result conversion
    JLabelFixture lableResult = frame
            .label(getLableTextByTextContain("Fahrenheit"));
    AssertJUnit.assertTrue(lableResult.text().contains("248"));
    ...

来源:http://helpqaspb.com/swing.htm

我的答案的全部意义在于,我相信您应该学会使用源代码中现有的一种工具。然后,如果您了解它是如何工作的,请确保您确实需要自己的工具,或者您可以为现有工具做出贡献。