我们使用 Assertj Swing 3.9.2 进行的 GUI 单元测试有时会以难以重现的方式失败。有时整个测试套件是绿色的,有时某些测试用例失败。我们使用两台不同的机器,运行 Ubuntu 18.04 LTS 和 GNOME,并且遇到相同的错误。
抛出的异常有两个,并且在不同的测试用例中不时出现:
org.assertj.swing.exception.ComponentLookupException
org.assertj.swing.exception.WaitTimedOutError
给我们带来麻烦的是,这种行为似乎完全是随机的,并且测试套件的行为取决于以下因素:
- 从 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)
...
至于WaitTimedOutError
例外,当测试失败时,这是因为该组件实际上并未显示在屏幕上(窗口实际上并未出现)。
您可以进一步检查错误日志和代码本身wiew.swing
包在我们的GitHub 存储库 and in 这个特拉维斯构建
我们无法理解这些问题的原因,因为它们看起来完全是随机的。
这是一种已知的行为还是我们已经实施了测试(课程小组测试, 自定义对话框测试)以错误的方式?