java - 为什么我们在 Assertj Swing 测试中偶尔会失败?

标签 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.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异常,当测试失败时,是因为组件没有实际显示在屏幕上(窗口没有物理出现)。

您可以在我们GitHub repositorywiew.swing 包中进一步检查错误日志和代码本身。在this Travis build

我们无法理解这些问题的原因,因为它们看起来完全是随机的。

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

最佳答案

我从 Travis-CI 日志中看到您正在使用 Xvfb。我有类似的问题。按照 AssertJ (https://joel-costigliola.github.io/assertj/assertj-swing-running.html) 的建议切换到 VNC 修复了它们。

关于java - 为什么我们在 Assertj Swing 测试中偶尔会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57338739/

相关文章:

java - 我正在尝试使用 JFrame 创建计算器,但遇到一些困难

java - 设置带 2 位小数的 double 格式

python - 单元测试设计

java - IOUtils 类型未定义方法 toByteArray(InputStream)

java - 如何在事件更新时更新日历中的闹钟时间?

java - Netty解码器编码器错误

unit-testing - 对编译器进行单元测试

java - 没有看到使用 Autowired 注释的 bean,没有任何帮助

java - 如何限制 JTextField 不接受超过 'x' 数量的输入

python - 请求库中的模拟 session