我有以下测试方法:
@Test public void f3KeystrokeShowsHotkeysDialog() throws AWTException{
App app = new App();
Robot robot = new Robot();
robot.keyPress( KeyEvent.VK_F3 );
try {
Thread.sleep( 1000L );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertTrue( app.mainFrame.hotkeysDlg.isVisible() );
}
sleep
这assertTrue
次通过;没有它就失败了。
原因很明显:Robot
,必须在非EDT线程中执行,并在此处生成KeyEvent
,EDT需要有限的时间来响应。
相应的Action
如下:
ActionMap am = mainFrame.getRootPane().getActionMap();
Action f3Action = new AbstractAction(){
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("# blip...");
mainFrame.hotkeysDlg.setVisible( true );
}
};
am.put( "show hotkeys", f3Action );
... actionPerformed
当然是在EDT中执行的。
对测试有很多了解的人可以告诉我:
我应该这样做,并且涉及“任意”睡眠吗?
有没有更好的框架或技术来处理这个,我 假设是一种相当常见的情况吗?
我应该完全避免这种测试吗? NB我知道这不是“单元测试”,但它是(我认为)功能测试:“按F3:热键对话框出现”< - 这是应用程序的规范...
答案 0 :(得分:0)
对于遇到这种情况并对这类东西感兴趣的人,我以为我会提炼过去几天我所学到的东西。
首先,看起来GUI功能的测试是“专业人士”在最后添加的东西:首先你得到应用程序的工作......
其次,GUI测试似乎非常具有挑战性。
第三,我将用以下代码替换上面的代码:
<base href="http://www.mywebsite.com/images/" target="_blank">
...演示 App app = new App();
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_F3);
robot.waitForIdle();
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
assertTrue(app.mainFrame.hotkeysDlg.isVisible());
}
});
的使用......并且正确地(我相信)在其所属的线程中对可见性进行测试,即EDT。无论如何,它似乎工作,这足以让你继续!
NB Robot.waitForIdle()
是EventQueue.invokeAndWait
不太熟悉的兄弟姐妹,但在这样的测试环境中,它实际上似乎有点关键:如果你使用EventQueue.invokeLater
似乎很有可能在invokeLater
实际运行......