用Java自动化UI测试

时间:2013-04-26 12:41:15

标签: java swing

我正致力于编写自动化测试应用程序。大多数事情已经完成。现在我需要做一些GUI自动化。安装应用程序是其中的一部分,我需要编写Java代码,它将启动应用程序安装程序并选择适当的选项并安装应用程序。如果有任何应用程序弹出窗口抛出,则捕获并响应这些弹出窗口。在UI中捕获任何错误或警告。这一切都需要用Java开发,我不允许使用任何现有的第三方工具。

只想知道最新的做法是什么。 我正在阅读http://docs.oracle.com/javase/tutorial/uiswing/components/button.html#radiobutton,还有其他最好或最简单的方法来实现这一目标。任何关于此的想法或文章都会有所帮助。

2 个答案:

答案 0 :(得分:2)

可能最好的方法是编写Java应用程序来记录用户在使用您要测试的应用程序时所执行的操作。

这意味着记录所有鼠标移动和所有击键。

稍后,您的应用程序将播放所有鼠标移动和所有击键。

每次鼠标移动开始,鼠标移动结束,按键序列开始,按键序列结束,您还必须在监视器(屏幕)上记录图像。

您的Java应用程序必须将这些图像与播放期间看到的图像进行比较。如果图像太不同,您的Java应用程序将抛出错误。祝你好运,确定差异太大了。

我多年前使用的工具有一个过程,用户可以浏览回放图像,并标出可能会改变的图像,如日期和时间显示。

如果您从链接的维基百科列表中选择GUI testing tools之一,那么您的时间会更好。有些是开源的,有些是专有的。

与生活中的大多数事情一样,如果你得到你付出的代价,那就很幸运,

答案 1 :(得分:1)

你无法直接访问另一个应用程序控件(如按钮,复选框,列表和其他UI元素),即使它是用Java编写的,除非该应用程序提供一些控制其UI的选项(我怀疑许多应用程序提供这样的事情。)

所以可能只有两种方式(我猜两者都同样糟糕): 1.使用一些第三方本机库与应用程序进行交互,但在这种情况下会有很多痛苦和问题,具体取决于测试的应用程序。 2.使用Robot并在该应用程序窗口上模拟键和鼠标事件来执行某些操作(例如按下按钮,填充文本字段或滚动列表),但这将需要您无法检索的组件的精确坐标,因此您可能只对这些坐标进行硬编码,并祈祷在测试运行时没有人移动/调整测试窗口的大小。

总结一下 - 使用Java编写UI测试应用程序并不是最好的选择。 实际上我敢打赌,在某些情况下使用其他语言写它可能会很痛苦。

也许我非常错误,有人可以用更好的方式分享在Java中做这些事情的方法......


P.S。小机器人示例(填写抽象登录表单):

public static void main ( String[] args )
{
    fillForm ();
}

private static void fillForm ()
{
    try
    {
        Robot r = new Robot ();

        // Set to true so we will wait for events to process
        // Still we might need some delays to let application take the input in some cases
        r.setAutoWaitForIdle ( true );

        // Login
        typeKey ( r, KeyEvent.VK_A );
        typeKey ( r, KeyEvent.VK_D );
        typeKey ( r, KeyEvent.VK_M );
        typeKey ( r, KeyEvent.VK_I );
        typeKey ( r, KeyEvent.VK_N );

        // Tab to password field
        typeKey ( r, KeyEvent.VK_TAB );

        // Password
        typeKey ( r, KeyEvent.VK_P );
        typeKey ( r, KeyEvent.VK_A );
        typeKey ( r, KeyEvent.VK_S );
        typeKey ( r, KeyEvent.VK_S );

        // Process form
        typeKey ( r, KeyEvent.VK_ENTER );
    }
    catch ( AWTException e )
    {
        e.printStackTrace ();
    }
}

private static void typeKey ( Robot r, int a )
{
    r.keyPress ( a );
    r.keyRelease ( a );
}