1

我有一个 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 状态。无法找到线程卡在等待状态的原因。

4

0 回答 0