当前位置: 首页 > 知识库问答 >
问题:

使用JemmyFX测试多个JavaFX组件

饶滨海
2023-03-14

我正在从事一个相当大的项目,其中包括一组自定义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();
}

使用这个基类,我为每个自定义控件创建了一个单独的类,其中包含测试。当我运行此测试套件时,第一个测试用例运行良好,但其余测试失败:

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运行测试时,这个问题就消失了。当我从命令行运行它们时,问题仍然存在。不适合在integration server上运行这些测试。

这是一个奇怪的问题。我可以捕获异常,我的大部分问题都消失了,除了整个测试套件Ubuntu每运行4或5次就会崩溃到shell,我必须重新登录。

那么,如何最好地为一大套自定义控件编写测试呢?我的方法是否错误?

共有1个答案

霍弘厚
2023-03-14

在查看了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;
}
 类似资料:
  • 我目前正在使用testng selenium来自动化我的测试,我有以下场景: 我需要从excel文件中读取数据,转换对象中的每一行,并为每一行运行一个测试。我试图使用annotation@DataProvider返回一个对象数组,但是它只能返回迭代器和对象[]。是否有任何变通方法可用于从数据提供程序返回客户机对象数组?我尝试了以下代码,但它只打印来自Client2的数据: 编辑1:客户类别: 在控

  • 我的actor运行在默认的akka调度程序上,然后调用一个返回Future的方法。我配置了不同的executioncontexts让所有的futures运行(因为它们是阻塞的(由于db调用),并且让actordispatcher只专用于非阻塞actors。想知道这段代码是否可以使用Akka testkit进行测试(继续使用两个执行上下文等)?如果是的话,那么配置测试的方法是什么,让Actor运行在

  • 我有一个Java项目,它在参考资料中有多个测试目录。 并且在实际的测试器中:

  • 问题内容: 我在python中有以下代码 我的问题是在test_home_page函数之后,firefox实例关闭并为下一个test_whatever函数再次打开。我该怎么做,以便所有测试用例都从同一firefox实例执行。 问题答案: 在以下位置初始化firefox驱动程序:

  • 问题内容: 我一直在寻找一种在测试方法中使用多个DataProvider的方法。我的情况如下: 假设我们有一个DataProvider类: 现在,在我的Test方法中,我要针对方案的所有组合运行: 绿广场 红方格 绿三角 红三角 鉴于我无法使用注释指定多个DataProvider,因此应如何在代码中实现此目标 问题答案: 由于缺乏更好的方法,我决定坚持解决方法。这是如何实现上述方案的示例: 这样,

  • 我在scala上,我有多个针对不同类(testsuites)的测试文件,每一个都使用testcontainers(来自同一脚本的init)。 当我启动项目中的所有测试时,所有测试都失败了(由于testContainers导致与数据库的连接出现问题)。 当我分别启动测试时,所有的测试都成功了。 有没有办法为多个测试文件(testsuites)只启动一个容器?似乎只对同一文件中的测试起作用。 @Mat