Headless testing with JavaFx and TestFx

不想你离开。 提交于 2019-11-29 04:46:45

Update:

I found this blog post that provides the solution for me to this problem. As the author suggests, you need to add the following dependency to your build:

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

Then you will need to include the following somewhere before you call registerPrimaryStage(), in my case in a method marked with @BeforeClass as I am using JUnit:

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

I would also add that its useful to include System.setProperty("java.awt.headless", "true") to ensure that you're not relying on anything from the AWT (in my case I had a call to get the size of the screen that was causing problems). I also followed the blog author's advice to add a switch to turn headless mode on and off. This gives the final method as follows:

@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();
}

You can see the solution in context here

Original Answer:

If you're using Linux, you can use xvfb for this. On a Debian-based system you can install xvfb as follows:

$ sudo apt-get install xvfb

With xvfb installed, run the following before you run your tests:

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

If you launch your tests in the same console TestFX will use the frame buffer instead of your main display. Thus the tests will run but you won't be bothered with windows opening and the mouse pointer being moved around.

I would agree with KDK for using Monocle, since it does work as charm with Jenkins. I couldn't have reliable result from Xvfb on Jenkins. Below is the steps I took and works for me.

Prepare Monocle

You want to download Monocle from Monocle Github. It looks there is api change, so you would want to edit MonocleView.java with adding below method after download. I'm not sure what I should put in the method, but found it just works without implementing it.

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

Install Monocle

Build the Monocle jar and put the jar into your JRE (under jre/lib/ext path)

Run Monocle with Glass lib

Below is my maven command used in jenkins, you will have interest on java runtime option portion.

$ mvn clean install -Dtestfx.robot=glass -Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw

Yes, it is possible to perform headless testing of JavaFx2 applications. You will need Monocle(part of OpenJFX). More details here: https://github.com/TestFX/Monocle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!