Ⅰ.6 如何创建和使用Synchronization Points

当Squish纪录脚本时,事件recorder必须确保同步了AUT和测试脚本。实现此功能的方法是recorder自动的插入snooze语句到脚本中。这些语句强制脚本等待一定的时间(该时间可能是个小数如2.5秒)。有必要确保脚本回放的速度和纪录时的速度一致。例如,如果用户等待弹出某个窗口,脚本将等待同样的时间。阻止Squish过快的运行AUT是很重要的,这样AUT的toolkit才能跟得上。

使用snooze 语句是最简单的同步AUT和测试脚本的方法。但是在很多情况下,只是简单的等待一定的时间还是不够的。例如,如果在一台运行快的机器上记录一个脚本,然后在一个运行慢的机器上回放脚本,snooze 等待的时间可能就不足够长了。

另一个同步的方法是使用 waitForObject 语句代替snooze 语句。如果使用了waitForObject 函数,在记录每个行为之前,将会纪录一条waitForObject 语句,这样才可以访问对象。因此重播时,Squish将会等待指定对象出现并且可访问(即可见),而不是等待一定的时间。自打证明使用waitForObject 函数比使用snooze 更可信,当记录测试案例时自动将它设为默认方法。

第三种方法是使用waitFor 函数。这个函数在指定条件为true之前一直阻塞,或者,在一个指定的时间过期之前一直阻塞。 条件可以是从一个属性到一个复杂的脚本语句中的任何事物。下面的例子等待弹出一个特定的对话框,如果在5秒内没有弹出将会纪录下一条数据错误的日志。

ok = waitFor("object.exists(':Address Book - Save As_QFileDialog')", 5000)
if not ok:
    test.fatal("AddressBook Save As dialog didn't appear")

下面是另外一个例子:如果没有指定超时时间它将“永远”等待。因此如果未知文件没有出现或者未被创建,测试脚本将会卡住。

waitFor("QFile.exists('addresses.tsv')")

下面的例子将会花2秒钟等待OK按钮变成可用的。waitFor 函数反复计算是否给出了代码的第一个参数,并且一旦机算代码的值为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")

这些例子展示了各种不同的synchronization points。传递给waitFor 函数的条件可以使任何可计算的脚本代码,包括函数调用,在创建synchonization points方面没有限制。

更多的关于Web应用程序的synchronization和先进的AJAX synchronization可以参考Ⅰ.3.8。

 

事件驱动的测试

通过将waitFor 函数和事件句柄(Ⅰ.5)结合在一起,有可能使测试脚本执行等待处理完一个指定的事件。可以通过安装一个事件句柄实现此功能, 设置一个全局变量(如,eventHandled)为false,将全局变量作为条件传给waitFor 函数。在事件句柄中,只要设置eventHandled 的值为true就完成了。

使用这种方法使创建完全的事件驱动的测试成为可能,测试的main 函数只在事件驱动测试中安装事件句柄,然后由调用waitFor 开始,所有的测试在事件句柄内处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值