在Java中自动化UI测试



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

我只是想知道做这件事的最好方法是什么。我在看http://docs.oracle.com/javase/tutorial/uiswing/components/button.html#radiobutton,有没有其他最好的或简单的方法来实现这一点。关于这方面的任何想法或文章都会有所帮助。

最好的方法可能是编写一个Java应用程序来记录用户在使用您想要测试的应用程序时所做的事情。

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

之后,你的应用程序会回放所有的鼠标移动和所有的按键。

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

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

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

如果您从链接的维基百科列表中选择一个GUI测试工具,那么您的时间会花得更好。有些是开源的,有些是专有的。

就像生活中的大多数事情一样,物有所值是很幸运的。

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

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

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

也许我大错特错了,有人可以分享一种更好的方法在Java中做这些事情…


注:小机器人示例(填写抽象登录表单):

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 );
}

最新更新