我想构建一个用于测试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应用程序中做到这一点。
答案 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应用程序。方法
让我们记住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
我的答案的全部意义在于,我相信您应该学会使用源代码中现有的一种工具。然后,如果您了解它是如何工作的,请确保您确实需要自己的工具,或者您可以为现有工具做出贡献。