我有一个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();
启动此线程后,主线程调用上面提到的Dialog(在上面的例子中给出)。 后来的主线程调用t.join(5000)...来检查线程任务是否完成。 然后检查Frame可见性是否为假。
assertThat(ComponentVisibleQuery.isVisible(target)).isFalse();
在所有失败方案中,线程状态为WAITING并且在打印stackTrace时: -
10:19:32 [testng]线程状态:等待 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状态。无法找到线程陷入等待状态的原因。