如何创建跨平台测试

通常情况下,在一个平台上记录的 Squish 测试不仅可以在该平台上回放,还可以在任何 Squish 支持的平台上回放。例如,为 Linux 上的 Qt 应用程序记录的测试通常可以在 Linux、macOS 和 Windows 上回放。然而,在某些情况下,跨平台回放可能无法工作——至少不是即插即用。

如何创建跨平台的 Java AWT/Swing 测试

使用 Java AWT/Swing 自动化工具(AUT)记录的测试应该可以在任何 Java 平台上回放。因此,在 Windows 上记录的测试应该可以在 macOS 或 Linux 上回放,依此类推。遗憾的是,当记录涉及文件选择对话框时,这种情况并不成立。如果一个涉及文件选择对话框的测试在 Windows 或 Linux 上记录,则可以在任一平台上正确回放。但是在 macOS 上将无法工作,因为 Java AWT/Swing 在不同平台间存在差异。

例如,如果我们记录文件的打开——但不是在 macOS 上——Squish 将会记录如下代码

    startApplication('"' + os.environ["SQUISH_PREFIX"] + '/examples/java/addressbook/AddressBookSwing.jar"')

    activateItem(waitForObjectItem(names.address_Book_JMenuBar, "File"))
    activateItem(waitForObjectItem(names.file_JMenu, "Open..."))

        type(waitForObject(names.open_File_Name_JTextField), "MyAddresses.adr")

    clickButton(waitForObject(names.open_Open_JButton))
    startApplication('"' + OS.getenv("SQUISH_PREFIX") +
        '/examples/java/addressbook/AddressBookSwing.jar"');
    activateItem(waitForObjectItem(names.addressBookJMenuBar, "File"));
    activateItem(waitForObjectItem(names.fileJMenu, "Open..."));
        type(waitForObject(names.openFileNameJTextField), "MyAddresses.adr");
    clickButton(waitForObject(names.openOpenJButton));
        startApplication("\"$ENV{'SQUISH_PREFIX'}/examples/java/addressbook/AddressBookSwing.jar\"");
    activateItem(waitForObjectItem($Names::address_book_jmenubar, "File"));
    activateItem(waitForObjectItem($Names::file_jmenu, "Open..."));

        type(waitForObject($Names::open_file_name_jtextfield), "MyAddresses.adr");
    clickButton(waitForObject($Names::open_open_jbutton));
    startApplication("\"#{ENV['SQUISH_PREFIX']}/examples/java/addressbook/AddressBookSwing.jar\"")
    activateItem(waitForObjectItem(Names::Address_Book_JMenuBar, "File"))
    activateItem(waitForObjectItem(Names::File_JMenu, "Open..."))

        type(waitForObject(Names::Open_File_Name_JTextField), "MyAddresses.adr")
    clickButton(waitForObject(Names::Open_Open_JButton))
    startApplication "\"$::env(SQUISH_PREFIX)/examples/java/addressbook/AddressBookSwing.jar\""
    invoke activateItem [waitForObjectItem $names::Address_Book_JMenuBar "File"]
    invoke activateItem [waitForObjectItem $names::File_JMenu "Open..."]

        invoke type [waitForObject $names::Open_File_Name_JTextField] "MyAddresses.adr"
    invoke clickButton [waitForObject $names::Open_Open_JButton]

为了使这一点跨平台(即在 Windows、Linux 和 macOS 上)可行,我们必须将使用 type(objectOrName, text) 函数(如代码缩进所示——当然这对 Python 并不是真的)的行替换为一些可在 macOS 上正常工作的自定义代码,并在其他平台上回退到原始代码。以下是替换 type 行所需的代码

    if java_lang_System.getProperty("os.name").startswith("Mac OS"):
        table = waitForObject(names.open_JTable)
        rows = object.children(table)
        for row in rows:
            cells = object.children(row)
            if cells[0].toString().endswith("MyAddresses.adr"):
                mouseClick(cells[0])
                break
    else:
        type(waitForObject(names.open_File_Name_JTextField), "MyAddresses.adr")
    if (java_lang_System.getProperty( "os.name" ).indexOf( "Mac OS") == 0) {
        var ftable = waitForObject(names.openJTable);
        var rows = object.children(ftable);
        for (var i = 0; i < rows.length; ++i) {
            var cells = object.children(rows[i]);
            if (cells[0].toString().indexOf("MyAddresses.adr") > -1) {
                mouseClick(cells[0]);
                break;
            }
        }
    } else {
        type(waitForObject(names.openFileNameJTextField), "MyAddresses.adr");
    }
    if (java_lang_System::getProperty( "os.name" ) =~ /Mac OS/) {
        my $ftable = waitForObject($Names::open_jtable);
        my @rows = object::children($ftable);
        foreach my $row (@rows) {
            my @cells = object::children($row);
            if ($cells[0]->toString() =~ /MyAddresses\.adr$/) {
                mouseClick($cells[0]);
                last;
            }
        }
    } else {
        type(waitForObject($Names::open_file_name_jtextfield), "MyAddresses.adr");
    }
    if LC::Java_lang_System.getProperty("os.name").start_with?("Mac OS")
        table = waitForObject(Names::Open_JTable)
        rows = Squish::Object.children(table)
        for row in rows
            cells = Squish::Object.children(row)
            cell = String(cells[0])
            if cell.match("MyAddresses.adr$")
                mouseClick(cells[0])
                break
            end
        end
    else
        type(waitForObject(Names::Open_File_Name_JTextField), "MyAddresses.adr")
    end
    if {[string match "Mac OS*" [invoke java_lang_System getProperty "os.name"]]} {
        set ftable [waitForObject $names::Open_JTable]
        set rows [object children $ftable]
        foreach row $rows {
            set cells [object children $row]
            if { [string last "MyAddresses.adr" [toString [lindex $cells 0]]] > -1 } {
                invoke mouseClick [lindex $cells 0]
                break
            }
        }
    } else {
        invoke type [waitForObject $names::Open_File_Name_JTextField] "MyAddresses.adr"
    }

    invoke clickButton [waitForObject $names::Open_Open_JButton]

使用此代码,测试脚本应在 Linux、macOS 和 Windows 上正确回放。

©2024 Qt 公司有限公司。此处包含的文档贡献属于其各自的权利人。
提供的文档按照自由软件基金会发布的 GNU 通用文档许可协议1.3版本 的条款许可。
Qt 和相应的标志是芬兰和/或世界上其他国家的 Qt 公司的商标。所有其他商标属于其各自的权利人。