如何修复本地通过但在CI服务器中失败的AssertJ Swing测试?

问题描述

我的带有Assertj Swing(版本3.17.0)的GUI单元测试全部在本地通过,但有时它们在CI服务器中失败。如果我重试的时间足够长,最终测试套件将变为绿色。我很难弄清楚如何解决这些测试。

我正在使用Java 8和Github Actions作为CI。根据{{​​3}}中的建议,我正在使用VNC通过以下命令在CI上无头运行这些测试:

./execute-on-vnc.sh mvn -B -f pom.xml clean verify

这是一个失败的测试示例(我在模拟控制器,只是验证单击按钮实际上会调用带有正确参数的控制器方法):

@Mock private ItemController controller;

@Test @GUITest
public void testAddItemButtonShouldDelegatetoControllerAddItem() {
    window.textBox("itemIdTextField").enterText("1");
    window.textBox("itemNameTextField").enterText("Some Item");
    window.button(JButtonMatcher.withName("addItemButton")).click();
    verify(controller).addItem(new Item("1","Some Item"));
}

这是处理JButton上的点击的非常直接的代码

addItemButton.addActionListener(e ->
    controller.addItem(new Item(itemIdTextField.getText(),itemNameTextField.getText()))
);

每次都在本地通过测试,没有问题,但是在CI上经常失败,并出现以下错误

testAddItemButtonShouldDelegatetoControllerAddItem(com.example.view.swing.ItemSwingViewTest)
Time elapsed: 0.985 sec  <<< FAILURE!
Wanted but not invoked:

controller.addItem(
  Item{id='1',name='Some Item'}
);

Actually,there were zero interactions with this mock.

我无法弄清这些不稳定测试的原因。

我尝试过的事情:

  • 添加了5秒的超时时间来验证()方法
  • 无效的CI Maven缓存并重新运行测试
  • 在CI和其他Java版本(9、11和13)上进行了测试

一切都没有运气。我在做错什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)