测试 JavaFX 应用程序时的 7 大错误

主要观点:JavaFX 是创建丰富企业级 GUI 应用的多功能工具,测试是开发周期的重要部分,但互联网上关于 JavaFX 测试的最佳实践和指南很少,开发者需依赖商业服务或试错来编写测试套件。本文总结了程序员在测试 JavaFX 应用时最常犯的 7 个错误及避免方法。

关键信息:

  • RaffleFXSolfeggioFX演示 JavaFX 测试能力,基于开源Liberica JDK且有集成 JavaFX 支持,使用 JDK 21 和TestFX测试框架等。
  • 常见错误及避免方法:

    • 错误 1:在 FX 线程外更新 UI,应在 FX 线程写入和读取 UI,如使用robot.interact(() -> {... })
    • 错误 2:错误引导测试和 FXML 类加载器,使 FXMLoader 使用与 Spring 相同的类加载器,用@Start连接真实 Stage 等。
    • 错误 3:混淆处理程序布线与真实用户输入,避免在 UI 测试中直接调用控制器方法,使用robot.clickOn()等测试用户交互。
    • 错误 4:竞争 FX 事件队列,简单变化用WaitForAsyncUtils.waitForFxEvents(),等待可观察结果用WaitForAsyncUtils.waitFor()
    • 错误 5:假设跨平台的像素完美相等,不断言精确颜色,允许颜色和像素密度的容忍度。
    • 错误 6:错误配置无头 CI,添加 Monocle 依赖,设置必要标志,调整等待全屏的测试等。
    • 错误 7:将业务逻辑与 UI 纠缠,将业务逻辑移至 ViewModels 用普通 JUnit 测试。

重要细节:

  • JavaFX 应用启动时创建应用线程,测试在 JUnit 线程运行,易忘在 FX 线程执行特定操作导致各种异常。
  • FXMLLoader 与 Spring 使用不同类加载器,会导致NoSuchBeanDefinitionException等错误。
  • robot.clickOn()模拟真实鼠标点击,button.fire()触发按钮动作程序式跳过鼠标事件。
  • JavaFX 是单线程工具包,UI 事件在 FX 应用线程排队,测试时需等待队列排空。
  • JavaFX 应用在不同平台像素颜色可能不同,测试时应考虑容忍度。
  • CI 中运行 JavaFX 测试需在无头模式下用 Monocle,注意模块锁定等问题。
  • 业务逻辑测试不应与 UI 测试在同一类,应移至 ViewModels 用 JUnit 测试。
阅读 206
0 条评论