对于删除对象来说,判断该对象的依赖关系是修复事件序列的前提。而这些都可以通过更新对象层和事件层来完成。
(1) 该对象不存在被依赖关系
存在事件序列 (e 1,e 2...e i...e n)。如果在该序列中不存在对对象 i 的依赖事件,那么原事件序列不要更改,只需要更新 e i,因为对象树被更新,因此可以使用事件编辑器对 e i 进行更新。如图 10 “ 事件序列图 5 ” 所示,原事件序列没有改变。
图 10. 事件序列图 5
(2) 该对象存在被依赖关系
同图 5 所示,利用事件编辑器更新事件集合,原有事件序列不需要改变。
对于修改对象,其实可以看成是先删除对象,在新增一个对象。它的处理方式相对简单。
在脚本修复技术中,所有的事件序列的处理,都是要有对象和事件作为支持的,同时判断对象之间的依赖关系也是尤为重要的技术环节。所以在对脚本修复之间,需要动态的更新对象层与事件层的相关信息。
测试脚本修复思想产生的最初考虑就是以现有测试脚本为基础,尽可能使更多的原脚本可以稍加修改就可以用于频繁的回归测试过程。所以它完全可以作为一个现有方法的扩展,在计算能力足够强大或者时间要求相对宽松的条件下为了满足测试覆盖标准的要求(考虑到某一个或者某几个事件的重要性或者排除它们受到影响的可能,需要这些事件必须出现在回归测试集的脚本当中,就必须对该方法进行扩展)而进行应用。
脚本修复的模块设计如下图所示,待测系统 1 为旧系统,待测系统 2 为新系统。当输入两个对象集合之后,通过对比,获得发生变更的对象 3;同时更新对象 3 的事件操作,并找出涉及到该对象 3 的测试脚本;最后对脚本进行修复,生成可重用的测试脚本。
图 11. 解析文件生成代码的流程图
脚本修复器的实现要考虑的情况比较多,也比较复杂。因此对于脚本修复的实现主要从三个大类进行实现,即新增对象,删除对象,修改对象:
1)对新增节点的处理流程如图所示:
图 12. 新增节点处理流程图
具体算法实现如下:
// 更新脚本,参数为脚本名称,新增对象列表 Public boolean UpdateScript(String Testcasename,Element newlist) { int size = getaddedNode.size();// 节点个数 int i; String nodename; String depend;// 依赖节点名称 Boolean update = false;// 更新标记位 for(i=0;i<size;i++)// 遍历节点 { if(depend.equalsIgnoreCase(“true”))// 存在依赖关系 { if(operations.findefunction(nodename))// 找到该节点 { String default = nodename + “default”;// 默认函数名称 operations.instead(nodename,default);// 用默认函数代替原函数 update = true; } else continue; } Return update;// 返回 true 或者 false } |