如何创建和使用同步点
在 Squish 中录制脚本时,事件记录器必须确保自动测试工具(AUT)和测试脚本同步。实现这一目标的一种方法是在脚本中自动插入 snooze(seconds) 语句。这些语句强制脚本等待指定数量的秒数(可能是一个小数,如2.5)。这是确保脚本以相同的速度重放所必需的。例如,如果用户等待一个窗口弹出,则脚本将等待相同的时间。这对于防止 Squish 以 AUT 工具包无法跟上太快的速度运行是很重要的。
注意:如果您想获取一些视频指导,请访问位于 的 在线 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. 在芬兰和/或世界其他国家的商标。所有其他商标均为其各自所有者的财产。