Squish脚本一开始看起来只是把录制结果改一改就能跑,但用例一多以后,最先失控的往往不是语法,而是复用边界。登录流程复制一份又一份,对象名散在各个脚本里,页面切换一改就要到处补。按Squish官方文档的原生结构来看,测试套件本身已经把测试用例目录、shared共享目录、对象库和全局脚本分成了不同层级,而且查找共享脚本时也有固定顺序。顺着这套结构来组织脚本,再去拆公共函数和页面对象,工程会稳很多。
一、Squish脚本怎么组织
脚本组织先不要想着一次做得很复杂,先把用例层、套件共享层和跨套件公共层分开。层级一旦分清,后面谁该写在哪里,基本就不会乱。
1、用例脚本只写业务流程
每个测试用例目录下的test脚本,最适合保留场景编排,比如打开页面、执行步骤、校验结果。公共动作不要长期堆在test脚本里,因为Squish官方本来就支持把共享脚本拆出去复用,测试脚本过厚,后面维护会越来越重。
2、套件内复用统一收进shared
官方文档明确把套件级共享脚本和共享数据作为一类独立能力来讲,说明凡是同一测试套件里多个用例都会用到的逻辑,都更适合放进shared/scripts这一层,而不是复制到每个用例目录里。这样改一次,整套用例都能跟着生效。
3、跨套件复用再放到全局脚本
Global Scripts的定位很清楚,任何测试套件里的任何测试用例都可以访问这层脚本。所以像通用日志、通用等待、环境探测、统一截图这类跨项目能力,才适合进入全局脚本;如果只是单个套件专用,就不要过早上升到全局层。
4、脚本查找顺序要先定清
Squish在查找脚本文件时,先找当前测试用例的scripts目录,再找测试套件的shared scripts,再找paths.ini里的全局脚本目录,最后才看SQUISH_SCRIPT_DIR环境变量。这个顺序本身就说明,越贴近当前用例的代码,越应该放在更靠近用例的位置;不要把所有东西都丢到最外层。
二、Squish公共函数与页面对象怎么拆分
公共函数和页面对象看起来都在做复用,但职责并不一样。拆分时最怕的就是把页面定位、界面动作、业务断言全揉进一个大脚本里,最后谁都能改,谁也不敢改。
1、公共函数只做通用能力
像启动应用、登录登出、等待加载、数据准备、统一断言、通用清理这类动作,本质上不是某一个页面独有的内容,更适合沉到公共函数层。它们的特点应该是少依赖具体页面结构,能被多个场景直接复用。这个拆法和Squish官方对shared scripts的用途是一致的。
2、页面对象只管页面本身
页面对象更适合承接某个页面或某个窗口自己的元素和操作,比如查询区、列表区、保存按钮、弹窗确认这类界面动作。这样做的重点,不是照搬某个外部模式名,而是让一个页面变化时,修改集中发生在同一处,而不是散落在所有用例里。Squish官方对Object Map的说明就是为了降低对象层级和对象名变化带来的维护成本。
3、对象名不要写死在页面对象里
如果采用脚本式对象库,符号名本来就定义在shared/scripts/names这类文件里;如果采用文本式对象库,则统一在objects.map中维护。更稳的做法,是让页面对象引用对象库里的符号名,不要直接在每个页面方法里硬写真实对象名,否则界面一改,页面对象会很快变成第二份散乱对象库。
4、用例脚本只调页面对象和公共函数
拆完以后,test脚本最好只保留场景顺序,不再直接处理底层对象细节。页面对象负责界面交互,公共函数负责通用支持,用例本身只负责把它们串起来。这样一来,新增场景时多半只是多写流程,维护旧场景时也不必每次下沉到对象层。这个组织方式虽然是团队规范,但它和Squish的共享脚本、对象库、测试用例目录分层是匹配的。
三、Squish复用边界怎么定
工程越做越乱,通常不是因为没有共享,而是共享得太早、太宽、太混。真正要先定下来的,是哪些内容留在页面里,哪些内容沉到公共层,哪些内容只能放在全局层。
1、页面内专属逻辑留在页面对象
某个页面独有的筛选、填写、提交、读取提示语这类动作,只要换个页面就不成立,就不要硬抽成公共函数。放在页面对象里,边界最清楚,后面页面改版时也最好收口。
2、跨页面但同套件复用的逻辑放shared
如果多个页面都会用到同一类等待、导航、校验或数据处理逻辑,那就进入套件级shared/scripts。这类能力已经超出单页范围,但又没必要推广到所有套件,放在套件共享层最合适。
3、跨套件基础能力再上升到全局脚本
只有当一段能力被多个测试套件共同依赖,而且稳定性足够高时,才值得升到Global Scripts。因为全局脚本一旦被多个套件共用,改动影响面会明显扩大,所以这层更适合放低频变动、职责单一的基础能力。
4、对象库和页面对象不要互相替代
对象库负责保存符号名和对象识别信息,页面对象负责把这些对象组织成可操作的方法,两者职责不同。Object Map的目的,是在对象层级或名字变化时降低脚本维护成本,所以对象库应该保持集中、稳定;页面对象则负责表达页面语义,不要把两者写成一回事。
总结
Squish脚本怎么组织,核心不是把代码拆得越细越好,而是先把用例层、套件共享层和全局层分开。Squish公共函数与页面对象怎么拆分,关键也不是套一个固定名词,而是让公共函数负责通用能力,让页面对象负责页面语义,让对象库负责对象识别。这样整理以后,新增用例会更快,界面变化时改动也更容易收口。