为什么我们在 Assertj Swing 测试中偶尔会失败?
Why do we get occasional failures in Assertj Swing tests?
我们使用 Assertj Swing 3.9.2 的 gui 单元测试有时会以难以重现的方式失败。有时整个测试套件都是绿色的,有时某些测试用例会失败。我们正在使用两台不同的机器 Ubuntu 18.04 LTS 和 GNOME,我们得到了同样的错误。
抛出的异常有两个,不时出现在不同的测试用例中:
org.assertj.swing.exception.ComponentLookupException
org.assertj.swing.exception.WaitTimedOutError
给我们带来麻烦的是这种行为似乎完全是随机的,测试套件的行为因以下因素而异:
- 从 Eclipse 执行,Eclipse 完整 window。
- 从 Eclipse 执行,Eclipse 占据屏幕的一小部分(因此从测试创建的 windows 不会与 Eclipse 本身或其他 windows 重叠)。
- 从 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
异常,当测试失败时,是因为组件没有实际显示在屏幕上(window没有物理出现)。
您可以在我们的 GitHub repository and in this Travis build
中的 wiew.swing
包中进一步检查错误日志和代码本身
我们无法理解这些问题的原因,因为它们看起来完全是随机的。
这是已知行为还是我们以错误的方式实施了测试 (CoursePanelTest, CustomDialogTest)?
我从 Travis-CI 日志中看到您正在使用 Xvfb。我有类似的问题。按照 AssertJ (https://joel-costigliola.github.io/assertj/assertj-swing-running.html) 的建议切换到 VNC 修复了它们。
我们使用 Assertj Swing 3.9.2 的 gui 单元测试有时会以难以重现的方式失败。有时整个测试套件都是绿色的,有时某些测试用例会失败。我们正在使用两台不同的机器 Ubuntu 18.04 LTS 和 GNOME,我们得到了同样的错误。
抛出的异常有两个,不时出现在不同的测试用例中:
org.assertj.swing.exception.ComponentLookupException
org.assertj.swing.exception.WaitTimedOutError
给我们带来麻烦的是这种行为似乎完全是随机的,测试套件的行为因以下因素而异:
- 从 Eclipse 执行,Eclipse 完整 window。
- 从 Eclipse 执行,Eclipse 占据屏幕的一小部分(因此从测试创建的 windows 不会与 Eclipse 本身或其他 windows 重叠)。
- 从 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
异常,当测试失败时,是因为组件没有实际显示在屏幕上(window没有物理出现)。
您可以在我们的 GitHub repository and in this Travis build
中的wiew.swing
包中进一步检查错误日志和代码本身
我们无法理解这些问题的原因,因为它们看起来完全是随机的。
这是已知行为还是我们以错误的方式实施了测试 (CoursePanelTest, CustomDialogTest)?
我从 Travis-CI 日志中看到您正在使用 Xvfb。我有类似的问题。按照 AssertJ (https://joel-costigliola.github.io/assertj/assertj-swing-running.html) 的建议切换到 VNC 修复了它们。