使用JemmyFX测试多个JavaFX组件

Han*_*ans 6 java junit javafx-2 jemmy jemmyfx

我正在开发一个包含一组自定义JavaFX组件的相当大的项目.对于每个要重用的自定义组件,我已经开始使用JemmyFX和JUnit编写一组自动化测试.在开发过程中,我从Eclipse Juno中运行它们.

一次运行整套测试已经证明是困难的.这个问题似乎源于这个事实,因为我想测试多个组件,理想情况下我会为每个组件运行一个不同的应用程序(这样在一个组件上执行的测试不会影响其他测试).

我创建了一个基类,它执行以下操作:

@BeforeClass
public static void beforeClass() {

    Thread t = new Thread("JavaFX Init Thread") {

        @Override
        public void run() {
            Application.launch(UITester.class, new String[0]);
        }
    };

    t.setDaemon(true);
    t.start();
}

使用这个基类,我创建了一个单独的类,其中@Test包含每个自定义控件的测试.当我运行这个测试套件时,第一个测试用例运行正常,但其余测试用例失败:

Exception in thread "JavaFX Init Thread" java.lang.IllegalStateException: Application launch must not be called more than once

我尝试了以下方法来解决此问题:

关闭应用程序

我在基类中添加了以下内容:

@AfterClass
public static void afterClass() {
    Platform.exit();
}

同样的问题仍然存在.也许是因为VM没有在测试之间重启?

防止重启应用程序

我输入一个静态变量来检查并查看应用程序是否已在运行.当我从Eclipse运行测试时,这会使问题消失.当我从命令行运行它们时,问题仍然存在.当我们尝试在集成服务器上运行这些测试时,这不太好.

捕获IllegalStateException

这是一个奇怪的.我可以捕获异常,并且我的大多数问题都消失了,除了整个测试套件Ubuntu的每4或5次运行崩溃到shell并且我必须重新登录的事实.

那么,我如何最好地为大量自定义控件编写测试?我的方法不正确吗?

Han*_*ans 3

在查看了MarvinFX的源代码之后,我能够以解决我的问题的方式实现我们的测试框架。对解决此问题贡献最大的似乎是为每个测试重建舞台和场景,如以下(伪)代码所示:

@Before
public void before() {
    Node node = generateComponentToTest();
    Parent parent = StackPaneBuilder.create().children(node).build();
    Scene scene = SceneBuilder.create().root(parent).build();

    if (this.currentStage != null) {
        this.currentStage.close();
    }

    Stage stage = new Stage();
    stage.setScene(scene);
    stage.centerOnScreen();
    stage.show();

    this.currentStage = stage;
}
Run Code Online (Sandbox Code Playgroud)