如何创建和使用同步点

在 Squish 中录制脚本时,事件记录器必须确保自动测试工具(AUT)和测试脚本同步。实现这一目标的一种方法是在脚本中自动插入 snooze(seconds) 语句。这些语句强制脚本等待指定数量的秒数(可能是一个小数,如2.5)。这是确保脚本以相同的速度重放所必需的。例如,如果用户等待一个窗口弹出,则脚本将等待相同的时间。这对于防止 Squish 以 AUT 工具包无法跟上太快的速度运行是很重要的。

注意:如果您想获取一些视频指导,请访问位于 Qt Academy在线 Squish 测试同步课程,大约需要45分钟。

使用 snooze(seconds) 语句是同步 AUT 和测试脚本的简单方法。但在许多情况下,仅仅等待一定的时间是不够的。例如,如果一个脚本在快速机器上录制并在慢速机器上回放,那么 snooze(seconds) 的时间可能不足以等待。

另一种同步方法是使用 Object waitForObject(objectOrName) 语句代替 snooze(seconds) 语句。如果使用 Object waitForObject(objectOrName) 函数,则在记录每个操作之前,都会记录一个 Object waitForObject(objectOrName) 语句,以便访问对象。因此,在回放时,Squish 将等待指定的对象存在且可访问(即可见),而不是等待特定的时间。由于使用 Object waitForObject(objectOrName) 函数已被证明比使用 snooze(seconds) 更可靠,因此在记录测试案例时,它已成为默认方法。

第三种选择是使用 Boolean waitFor(condition) 函数。此函数等待给定条件变为真,或者可选择地,直到指定的时间超时。条件可以是任何可以评估的东西,从属性到复杂的脚本语句。以下是一个示例,该示例等待特定的对话框弹出,如果该对话框在5秒内没有出现,记录一个致命错误。

ok = waitFor("object.exists(':Address Book - Save As_QFileDialog')",
    5000)
if not ok:
    test.fatal("AddressBook Save As dialog didn't appear")
var ok = waitFor("object.exists(':Address Book - Save As_QFileDialog')",
    5000);
if (!ok)
    test.fatal("AddressBook Save As dialog didn't appear");
my $ok = waitFor("object::exists(':Address Book - Save As_QFileDialog')",
    5000);
if (!$ok) {
    test::fatal("AddressBook Save As dialog didn't appear");
}
ok = waitFor("Squish::Object.exists(':Address Book - Save As_QFileDialog')",
    5000)
if !ok
    Test.fatal("AddressBook Save As dialog didn't appear")
end
set ok [waitFor {object exists ":Address Book - Save As_QFileDialog"} \
    5000]
if {!$ok} {
    test fatal "AddressBook Save As dialog didn't appear"
}

下面是一个示例,这次将无限期等待,因为没有指定超时。因此,如果期望的文件不存在并且未被创建,测试脚本将陷入停滞。

waitFor("QFile.exists('addresses.tsv')")
waitFor("QFile.exists('addresses.tsv')");
waitFor("QFile::exists('addresses.tsv')");
waitFor("QFile.exists('addresses.tsv')")
waitFor {invoke QFile exists "addresses.tsv"}

接下来的示例将在2秒内等待一个 OK 按钮变为启用状态。Boolean waitFor(condition) 函数会反复评估其作为第一个参数给出的代码,并在首次代码评估为 true 时返回 true;或者,如果在其第二个参数指定的毫秒数内代码未评估为 true,则返回 false

button = findObject(":Address Book - Add.OK_QPushButton")
enabled = waitFor("button.enabled", 2000)
if not enabled:
    test.fatal("OK button has not been enabled")
var button = findObject(":Address Book - Add.OK_QPushButton");
var enabled = waitFor("button.enabled", 2000);
if (!enabled)
    test.fatal("OK button has not been enabled");
my $button = findObject(":Address Book - Add.OK_QPushButton");
my $enabled = waitFor("$button->enabled", 2000);
if (!$enabled) {
    test::fatal("OK button has not been enabled");
}
button = findObject(":Address Book - Add.OK_QPushButton")
enabled = waitFor("button.enabled", 2000)
if !enabled
    Test.fatal("OK button has not been enabled")
end
set button [findObject ":Address Book - Add.OK_QPushButton"]
set enabled [waitFor {property get $button enabled} 2000]
if {!$enabled} {
    test fatal "OK button has not been enabled"
}

这些示例展示了同步点的不同变体。由于传递给 Boolean waitFor(condition) 函数的条件可以是被评估的任何脚本代码,包括函数调用,因此创建同步点没有限制。

更多关于 Web 应用程序同步和高级 AJAX同步的信息,请参见 如何同步 Web 页面加载以进行测试

通过结合 Boolean waitFor(condition) 函数和事件处理器(如何使用事件处理器),可以使测试脚本的执行等待直到处理了特定事件。这可以通过安装事件处理器,将全局变量(如 eventHandled)设置为 false,并将该全局变量作为条件传递给 Boolean waitFor(condition) 函数来实现。在事件处理器中,只需将 eventHandled 设置为 true 即可完成。

使用这种方法可以创建完全由事件驱动的测试,其中测试的 main 函数仅安装事件处理器,然后通过调用 Boolean waitFor(condition) 开始执行,所有测试都在事件处理器内部完成。

©2024 The Qt Company Ltd。包含在此处的文档贡献是各自所有者的版权。
提供的文档根据 Free Software Foundation 发布的 GNU Free Documentation License 版本 1.3 的条款获得许可。
Qt 和相应的标志是 The Qt Company Ltd. 在芬兰和/或世界其他国家的商标。所有其他商标均为其各自所有者的财产。