Squish录制回放不稳定,最常见的根源不是录制功能本身,而是对象名不稳、等待方式不对、以及把异步界面当成同步界面来回放。真正想把脚本跑稳,思路要从“多录几次试运气”改成“先固定对象识别,再把等待和同步点补全”,这样后面回归时才不会同一条用例今天过、明天挂。
一、Squish录制回放不稳定怎么办
这一节先解决“为什么录出来能看不能跑”的问题。处理顺序建议固定为先稳对象,再稳启动,再稳等待,这样你每改一处都能看见效果,不容易把问题越修越散。
1、先把对象名从录制结果改成稳定对象映射
录制脚本如果直接依赖临时文本、层级位置或界面细节,界面一改就容易找不到对象。Squish从较早版本开始就强调使用脚本式对象映射,这种方式更利于处理翻译界面、对象名复用与后续重构,稳定性也更高。
2、把对象映射文件路径固定到测试套件配置里
在测试套件设置里可以明确对象映射文件位置。如果路径漂移、多人各自用一份objects.map,录制和回放结果就很容易不一致。项目里最好只保留一份正式对象映射,并在套件配置里固定引用。
3、减少对纯坐标和瞬时状态的依赖
录制阶段如果大量产生依赖坐标、瞬时焦点或动画中间态的操作,回放就很容易波动。更稳的做法是尽量让操作落在可识别对象上,再配合对象属性校验,少依赖视觉瞬间结果。
4、把全局等待时间统一到套件级别
Squish提供testSettings对象控制执行行为,waitForObject这一类函数默认会读testSettings.waitForObjectTimeout。不要在脚本里到处写分散的等待时长,先把全局超时在套件级别定稳,再对个别慢场景单独加长。
5、版本异常时先查维护版本说明
官方维护版本里多次修过录制回放与等待精度相关问题,例如等待精度、对象名生成、特定Qt场景下的录制回放稳定性。如果你的脚本只在某一版本异常,先排查版本差异,往往比反复改脚本更省时间。
二、Squish等待机制与同步点怎么加
这一节的重点是把“睡几秒再点”换成“等到正确状态再做下一步”。等待机制用对了,脚本稳定性通常会立刻提升,因为它把异步界面的不确定性收敛成了明确条件。
1、对象可见且可操作时用waitForObject
waitForObject适合你下一步要直接点击、输入或读取属性的场景,因为它等待的是对象存在、可见并且可用。换句话说,界面真的准备好了再往下执行,这是最常用也最稳的同步入口。
2、对象先出现后再加载完成时用waitForObjectExists
如果对象会先创建、后显示,或者先进入对象树、后变成可操作状态,先用waitForObjectExists等“出现”,再补属性判断或下一层等待,比一开始就强等可见更容易定位问题。
3、列表和表格项不要只等容器,要等具体项
很多回放失败不是窗口没出来,而是列表项、表格项还没准备好。waitForObjectItem专门用于等待具体项出现,适合下拉框、树、表格、列表这类控件,比只等外层对象更准确。
4、Qt异步交互优先等信号而不是硬等待
对Qt应用,界面刷新、后台任务结束、模型切换这类动作更适合用waitForSignal去等真实信号到达。它同样受等待超时控制,而且比写固定延时更贴近程序真实完成时机。
5、同步点尽量落在可验证状态上
同步点不要只写成“等完就继续”,最好在关键步骤后加属性校验或验证点,例如文本值、按钮状态、列表数量是否达标。官方也把验证点分成代码方式和IDE方式,两者都可以作为回放中的稳定检查点。
6、少用固定休眠,多用条件等待
固定休眠最大的问题是快了浪费时间,慢了还是失败。条件等待的价值就在于只等到目标状态成立,并在超时时给出明确失败点,后续调试会比单纯加延时清楚得多。
三、Squish回放稳定性核对清单
脚本补完等待后,还要有一套固定复核动作,不然项目一大,很快又会回到谁都能录、谁都跑不稳的状态。把下面几项变成每条用例的检查清单,稳定性会明显提升。
1、先查对象映射是否为正式版本
确认当前用例引用的是团队统一对象映射,而不是个人临时改过的副本。
2、再查等待函数是否与场景匹配
可操作对象用waitForObject,存在性判断用waitForObjectExists,列表项用waitForObjectItem,Qt异步完成优先等信号。
3、关键步骤后必须有同步点
凡是页面切换、弹窗出现、数据刷新、保存成功这类关键动作后,都要补状态校验或验证点,不能只靠下一步操作间接证明成功。
4、套件级超时统一管理
先在测试套件设置里统一超时,再对个别慢流程局部加长,避免脚本里到处散落不同等待值。
5、版本升级后先跑最小回归
Squish版本、AUT版本或对象映射变动后,先跑一组最小用例验证录制回放、对象查找和等待机制,再扩大到全量回归。
总结
Squish录制回放不稳定,先不要急着重复录制,优先把对象映射、套件级等待和关键同步点补齐。等待机制上,可操作对象用waitForObject,存在性判断用waitForObjectExists,列表项用waitForObjectItem,Qt异步完成优先等信号,再用验证点把关键状态钉住。把这套顺序固定下来后,脚本的稳定性和可维护性都会明显提升。