10

我有一个简单的 JavaFx 应用程序(Java 8),它使用 TestFx 进行了单元测试。但是,当测试运行时,应用程序窗口会启动,并且鼠标会移动以执行我的测试中的任何操作。这些测试能否以不弹出应用程序的方式运行,并且在自动构建和测试正在运行时,我仍然可以将鼠标用于其他事情?

4

3 回答 3

3

更新:

我发现这篇博文为我提供了解决这个问题的方法。正如作者建议的那样,您需要在构建中添加以下依赖项:

testRuntime 'org.testfx:openjfx-monocle:1.8.0_20'

然后,您需要在调用之前在某处包含以下内容,在我的情况下,在我使用 JUnit 时registerPrimaryStage()标记为的方法中:@BeforeClass

System.setProperty("testfx.robot", "glass");
System.setProperty("testfx.headless", "true");
System.setProperty("prism.order", "sw");
System.setProperty("prism.text", "t2k");

我还要补充一点,包括它有助于System.setProperty("java.awt.headless", "true")确保您不依赖 AWT 中的任何内容(在我的情况下,我有一个电话来获取导致问题的屏幕大小)。我还按照博客作者的建议添加了一个开关来打开和关闭无头模式。这给出了最终方法如下:

@BeforeClass
public static void setupSpec() throws Exception {
    if (Boolean.getBoolean("headless")) {
        System.setProperty("testfx.robot", "glass");
        System.setProperty("testfx.headless", "true");
        System.setProperty("prism.order", "sw");
        System.setProperty("prism.text", "t2k");
        System.setProperty("java.awt.headless", "true");
    }
    registerPrimaryStage();
}

您可以在此处查看上下文中的解决方案

原答案:

如果您使用的是 Linux,则可以为此使用 xvfb。在基于 Debian 的系统上,您可以按如下方式安装 xvfb:

$ sudo apt-get install xvfb

安装 xvfb 后,在运行测试之前运行以下命令:

$ Xvfb :99 &>/dev/null &
$ export DISPLAY=:99

如果您在同一个控制台中启动测试,TestFX 将使用帧缓冲区而不是您的主显示器。因此测试将运行,但您不会被打开窗口和移动鼠标指针所困扰。

于 2016-02-10T08:17:06.943 回答
1

我同意 KDK 使用 Monocle,因为它对 Jenkins 确实很有魅力。我无法从 Jenkins 上的 Xvfb 获得可靠的结果。以下是我采取并为我工作的步骤。

准备单片眼镜

你想从Monocle Github下载 Monocle 。看起来有 api 变化,所以你想编辑 MonocleView.java 并在下载后添加以下方法。我不确定我应该在该方法中添加什么,但发现它没有实现它就可以工作。

@Override
protected int _getNativeFrameBuffer(long ptr) {
    // TODO Auto-generated method stub
    return 0;
}

安装单片眼镜

构建 Monocle jar 并将 jar 放入您的 JRE(在 jre/lib/ext 路径下)

使用 Glass lib 运行 Monocle

下面是我在 jenkins 中使用的 maven 命令,您将对 java 运行时选项部分感兴趣。

$ mvn clean install -Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw
于 2016-02-18T17:06:38.110 回答
-1

是的,可以对 JavaFx2 应用程序执行无头测试。您将需要 Monocle(OpenJFX 的一部分)。更多细节在这里: https ://github.com/TestFX/Monocle

于 2015-01-08T16:18:18.443 回答