简单的 TestFX 示例失败
Simple TestFX example fails
在 Eclipse photon 和 fx9 或 fx11(无关紧要)中使用 TestFX 4.0.14,TestFX wiki 中的 simple example test 在 should_click_on_button()
中失败
Expected: Labeled has text "clicked!"
but: was "click me!"
当查看屏幕时,会显示窗格及其包含的按钮,但鼠标会移动到其他地方:因此按钮永远不会被点击,因此它的文本也永远不会改变。
知道 wrong/how 需要修复什么吗?
测试代码(为方便起见全部从wiki复制而来):
import org.junit.Test;
import org.testfx.framework.junit.ApplicationTest;
import static org.testfx.api.FxAssert.*;
import static org.testfx.matcher.control.LabeledMatchers.*;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
* Simple testfx example from testfx wiki:
* https://github.com/TestFX/TestFX/wiki/Getting-Started
*
*/
public class ClickApplicationTest extends ApplicationTest {
@Override
public void start(Stage stage) {
Parent sceneRoot = new ClickApplication.ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
@Test
public void should_contain_button() {
// expect:
verifyThat(".button", hasText("click me!"));
}
@Test
public void should_click_on_button() {
// when:
clickOn(".button");
// then:
verifyThat(".button", hasText("clicked!"));
}
}
申请代码:
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
* Simple testfx example from testfx wiki:
* https://github.com/TestFX/TestFX/wiki/Getting-Started
*
*/
public class ClickApplication extends Application {
// application for acceptance tests.
@Override public void start(Stage stage) {
Parent sceneRoot = new ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
// scene object for unit tests
public static class ClickPane extends StackPane {
public ClickPane() {
super();
Button button = new Button("click me!");
button.setOnAction(actionEvent -> button.setText("clicked!"));
getChildren().add(button);
}
}
}
更新:
在 TestFX that might match. It mentions a core fx bug 中发现了一个未解决的问题,这可能是原因 - 但似乎不是:它已在 fx11 中修复(已验证核心错误报告中的代码通过),但 testfx 问题占上风..
对我有用。
无论如何,您可能会在 UI 更改发生之前检查它,因为它是在 FX 应用程序线程中完成的,而不是在执行测试的线程中完成的。
使用这条线
WaitForAsyncUtils.waitForFxEvents()
在 clickOn
和 verifyThat
调用之间。
原来是有几个原因的问题:
- 最底层是 core bug - 机器人在 win(只有 10 个?)HiDPI 屏幕上不能正确移动,所以并不是每个人都会遇到失败
- 核心错误已在 fx11 中修复(在本机 win 代码中),因此现在 public fx 机器人表现良好
- 最新版本(4.0.14)中TestFX机器人相关代码尚未更新至fx11,repo版本为
- 默认情况下,TestFX 使用仍然失败的 AWTRobot(至少在 TestFX 的上下文中,核心错误报告中的示例通过)
- 为了使 TestFX 测试 运行 在 Win HiDPI 屏幕上可靠,我们需要强制使用 fx 机器人,通过设置系统来完成 属性 testfx.robot到玻璃
- 最后一个怪癖:在测试代码中通过
System.getProperties().put("testfx.robot", "glass")
以编程方式设置 属性 时,必须在测试 class 开始之前执行此操作,即在方法中由@BeforeClass 注释(不在@Before 或testApp.init()
中)!否则,直接或间接涉及 mouseMove 的第一个测试将失败,随后的测试都很好(让我困惑了一段时间,因为失败感觉是虚假的;)。
样本:
public class ClickTest extends ApplicationTest {
@Test
public void testClick() {
verifyThat(".button", hasText("click me!"));
clickOn(".button");
verifyThat(".button", hasText("clicked!"));
}
/**
* Use glass robot.
* Note: this must happen once before the class is loaded. Otherwise,
* the very first test run uses the awt robot
*/
@BeforeClass
public static void config() throws Exception {
System.getProperties().put("testfx.robot", "glass");
}
@Override
public void start(Stage stage) {
Parent sceneRoot = new ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
// scene object for unit tests
public static class ClickPane extends StackPane {
public ClickPane() {
super();
Button button = new Button("click me!");
button.setOnAction(actionEvent -> button.setText("clicked!"));
getChildren().add(button);
}
}
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(ClickTest.class.getName());
}
在 Eclipse photon 和 fx9 或 fx11(无关紧要)中使用 TestFX 4.0.14,TestFX wiki 中的 simple example test 在 should_click_on_button()
中失败
Expected: Labeled has text "clicked!"
but: was "click me!"
当查看屏幕时,会显示窗格及其包含的按钮,但鼠标会移动到其他地方:因此按钮永远不会被点击,因此它的文本也永远不会改变。
知道 wrong/how 需要修复什么吗?
测试代码(为方便起见全部从wiki复制而来):
import org.junit.Test;
import org.testfx.framework.junit.ApplicationTest;
import static org.testfx.api.FxAssert.*;
import static org.testfx.matcher.control.LabeledMatchers.*;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
* Simple testfx example from testfx wiki:
* https://github.com/TestFX/TestFX/wiki/Getting-Started
*
*/
public class ClickApplicationTest extends ApplicationTest {
@Override
public void start(Stage stage) {
Parent sceneRoot = new ClickApplication.ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
@Test
public void should_contain_button() {
// expect:
verifyThat(".button", hasText("click me!"));
}
@Test
public void should_click_on_button() {
// when:
clickOn(".button");
// then:
verifyThat(".button", hasText("clicked!"));
}
}
申请代码:
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
* Simple testfx example from testfx wiki:
* https://github.com/TestFX/TestFX/wiki/Getting-Started
*
*/
public class ClickApplication extends Application {
// application for acceptance tests.
@Override public void start(Stage stage) {
Parent sceneRoot = new ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
// scene object for unit tests
public static class ClickPane extends StackPane {
public ClickPane() {
super();
Button button = new Button("click me!");
button.setOnAction(actionEvent -> button.setText("clicked!"));
getChildren().add(button);
}
}
}
更新:
在 TestFX that might match. It mentions a core fx bug 中发现了一个未解决的问题,这可能是原因 - 但似乎不是:它已在 fx11 中修复(已验证核心错误报告中的代码通过),但 testfx 问题占上风..
对我有用。
无论如何,您可能会在 UI 更改发生之前检查它,因为它是在 FX 应用程序线程中完成的,而不是在执行测试的线程中完成的。
使用这条线
WaitForAsyncUtils.waitForFxEvents()
在 clickOn
和 verifyThat
调用之间。
原来是有几个原因的问题:
- 最底层是 core bug - 机器人在 win(只有 10 个?)HiDPI 屏幕上不能正确移动,所以并不是每个人都会遇到失败
- 核心错误已在 fx11 中修复(在本机 win 代码中),因此现在 public fx 机器人表现良好
- 最新版本(4.0.14)中TestFX机器人相关代码尚未更新至fx11,repo版本为
- 默认情况下,TestFX 使用仍然失败的 AWTRobot(至少在 TestFX 的上下文中,核心错误报告中的示例通过)
- 为了使 TestFX 测试 运行 在 Win HiDPI 屏幕上可靠,我们需要强制使用 fx 机器人,通过设置系统来完成 属性 testfx.robot到玻璃
- 最后一个怪癖:在测试代码中通过
System.getProperties().put("testfx.robot", "glass")
以编程方式设置 属性 时,必须在测试 class 开始之前执行此操作,即在方法中由@BeforeClass 注释(不在@Before 或testApp.init()
中)!否则,直接或间接涉及 mouseMove 的第一个测试将失败,随后的测试都很好(让我困惑了一段时间,因为失败感觉是虚假的;)。
样本:
public class ClickTest extends ApplicationTest {
@Test
public void testClick() {
verifyThat(".button", hasText("click me!"));
clickOn(".button");
verifyThat(".button", hasText("clicked!"));
}
/**
* Use glass robot.
* Note: this must happen once before the class is loaded. Otherwise,
* the very first test run uses the awt robot
*/
@BeforeClass
public static void config() throws Exception {
System.getProperties().put("testfx.robot", "glass");
}
@Override
public void start(Stage stage) {
Parent sceneRoot = new ClickPane();
Scene scene = new Scene(sceneRoot, 100, 100);
stage.setScene(scene);
stage.show();
}
// scene object for unit tests
public static class ClickPane extends StackPane {
public ClickPane() {
super();
Button button = new Button("click me!");
button.setOnAction(actionEvent -> button.setText("clicked!"));
getChildren().add(button);
}
}
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(ClickTest.class.getName());
}