我有一个 testng gui 测试,我在其中使用 org.fest.swing API。它有 3 个测试用例,在每个测试用例结束时它会尝试关闭一个对话框。执行时,它随机挂在一个对话框上,它应该单击其中一个按钮,然后在断言条件下失败。
例子:
DialogFixture saveChangesDialog = WindowFinder.findDialog(SAVE).using(robot);
String buttonText = saveChanges ? "Yes" : "No";
saveChangesDialog.button(JButtonMatcher.withText(buttonText)).click();
断言条件是:
assertThat(ComponentVisibleQuery.isVisible(target)).isFalse();
它失败了很多次(并不总是)。执行单个测试时,它总是通过。无法确定失败的原因。
找到了一个类似的参考,但它没有用。 https://github.com/joel-costigliola/assertj-swing/issues/30
---------- 编辑 1 ----------
更多分析发现,在同样的方法中,会启动一个线程来关闭Frame。它在 run() 中有单行:- org.fest.swing.fixture.JInternalFrameFixture.close();
启动此线程后,主线程调用上述对话框(如上例所示)。稍后主线程调用 t.join(5000) ... 来检查线程任务是否完成。稍后检查 Frame 可见性是否为假。
assertThat(ComponentVisibleQuery.isVisible(target)).isFalse();
在所有失败情况下,线程状态都是 WAITING 并且正在打印 stackTrace :-
10:19:32 [testng] 线程状态:WAITING 10:19:32 [testng] StackTrace1 [sun.misc.Unsafe.park(Native Method), java.util.concurrent.locks.LockSupport.park(LockSupport.java: 175), java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836), java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997), java.util.concurrent.locks.AbstractQueuedSynchronizer .acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)、java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)、org.fest.swing.edt.GuiActionRunner.run(GuiActionRunner.java:117)、org.fest。 swing.edt.GuiActionRunner.execute(GuiActionRunner.java:96)、org.fest.swing.driver.JInternalFrameCloseTask.close(JInternalFrameCloseTask.java:33)、org.fest.swing.driver。JInternalFrameDriver.close(JInternalFrameDriver.java:339), org.fest.swing.fixture.JInternalFrameFixture.close(JInternalFrameFixture.java:150),
所以这意味着,因为线程处于 WAITING 状态并且卡在某个锁定条件下,它无法关闭 Frame,因此断言条件失败。
将时间更新为 500 秒,对于失败场景,它仍处于 WAITING 状态。无法找到线程卡在等待状态的原因。