Java 为什么在Assertj Swing测试中会偶尔出现故障?

Java 为什么在Assertj Swing测试中会偶尔出现故障?,java,swing,unit-testing,gui-testing,assertj,Java,Swing,Unit Testing,Gui Testing,Assertj,我们使用Assertj Swing 3.9.2进行的gui单元测试偶尔会以难以复制的方式失败。有时整个测试套件是绿色的,有时一些测试用例失败。我们在Ubuntu 18.04 LTS和GNOME上使用了两台不同的机器,我们得到了相同的错误 抛出的异常有两种,并且在不同的测试用例中不时出现: org.assertj.swing.exception.ComponentLookupException org.assertj.swing.exception.WaitTimeDoutror 给我们带来麻

我们使用Assertj Swing 3.9.2进行的gui单元测试偶尔会以难以复制的方式失败。有时整个测试套件是绿色的,有时一些测试用例失败。我们在Ubuntu 18.04 LTS和GNOME上使用了两台不同的机器,我们得到了相同的错误

抛出的异常有两种,并且在不同的测试用例中不时出现:

  • org.assertj.swing.exception.ComponentLookupException
  • org.assertj.swing.exception.WaitTimeDoutror
给我们带来麻烦的是,这种行为似乎完全是随机的,测试套件的行为因以下因素而异:

  • 从Eclipse执行,Eclipse作为完整窗口
  • 从Eclipse执行,Eclipse只占屏幕的一小部分(因此从测试中创建的窗口不会与Eclipse本身或其他窗口重叠)
  • Maven执行死刑
  • 执行单个测试用例或整个套件
此外,多次重新运行相同的测试可能会在不同的测试用例中导致失败或成功

Travis Ci的测试也失败了

作为附加信息,我们可以包括
ComponentLookupException
,未找到的组件实际上显示在屏幕上,但组件层次结构为空,这可以从Travis构建的摘录中看出:

...

970 org.assertj.swing.exception.ComponentLookupException: 
971 Unable to find component using matcher org.assertj.swing.core.NameMatcher[name='labelTextField', type=javax.swing.text.JTextComponent, requireShowing=true].
972
973 Component hierarchy:
974 apt.project.frontend.view.swing.CustomDialog[name='dialog1', title='', enabled=true, modal=false, visible=true, showing=true]
975
976 at apt.project.frontend.view.swing.CustomDialogTest.testWhenOkButtonIsClickedThenInputIsSavedBeforeClosing(CustomDialogTest.java:62)

...
至于
waittimedoutror
异常,当测试失败时,这是因为组件没有实际显示在屏幕上(窗口没有实际显示)

您可以在我们和中的
wiw.swing
包中进一步检查错误日志和代码本身

我们无法理解这些问题的原因,因为它们似乎完全是随机的


这是某种已知的行为,还是我们以错误的方式实现了测试(,)?

我从Travis CI日志中看到您正在使用Xvfb。我也有类似的问题。根据AssertJ()的建议,切换到VNC()解决了这些问题。

我将此答案标记为已接受,因为这是我们当时采用的解决方案,而且对我们也有效。非常感谢。