2

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

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

4

2 回答 2

2

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

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

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

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

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

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

如果您从链接的 Wikipedia 列表中选择一种GUI 测试工具,您的时间会更好。有些是开源的,有些是专有的。

就像生活中的大多数事情一样,如果你得到你所支付的,你很幸运,

于 2013-04-26T12:52:22.903 回答
1

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

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

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

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


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

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 );
}
于 2013-04-26T13:20:50.663 回答