5 脚本修复技术的应用
在RFT中3层框架的表示,appObjects代表对象层,managers代表事件层和对象层一一对应,最后是testcases脚本层。此外还有一些辅助的类用来进行其他操作。

图13. RFT中3层框架
5.1 对象层(appobject)
这里以一个简单的对话框来描述对象的树结构:对象捕获之后对象的层次结构。

图14. 对象捕获之后对象的层次结构
在RFT中的GUI树形图

图15. 在RFT中的GUI树形图
GUI元素对象化:
所有被识别到的GUI被测对象都被记录在Rational Functional Tester的测试对象映射文件中。Rational Functional Tester的测试对象映像文件是一个后缀为rftxmap的XML文件。通过对XML的解析,直接返回GUI对象。为下一步生成相关事件做准备。
public WButton getButtonOK()
{
return new WButton(new TestObject(getMappedTestObject(“OK”));// 将元素对象化
}
RFT中的显示

图16. RFT中的显示
5.2 事件层(managers)
基本事件的表示:
public void clickButtonOK()
{
addDBDlg.getButtonOK().click();
}
public void DoubleclickButtonOK()
{
addDBDlg.getButtonOK().doubleClick();
}
default事件的生成:
public void ClickBTNOKDefault()
{
setTextIPAddressDefault();// 必填字段 1
setTextDBNameDefault();// 必填字段 2
setTextUserNameDefault();// 必填字段 3
setTextPasswordDefault();// 必填字段 4
clickButtonOK();// 保证所有的依赖关系都被调用,Button 此时可以被调用。
}
5.3 脚本层(testcase)
脚本层就是将事件进行拼装。可以安装事先指定的覆盖率自动生成。
public void testcase1(Object[] args)
{
DBServerInfoTableViewMgr dbServerInfoViewMgr = new DBServerInfoTableViewMgr();
// 调用事 件层对象
AddDBServerDlgMgr addDBServerDlgMgr = new AddDBServerDlgMgr();
dbServerInfoViewMgr.clickToolBar("addDBServer");
addDBServerDlgMgr.setTextIPAddress();
addDBServerDlgMgr.setTextDBName();
addDBServerDlgMgr.setTextPassword();
addDBServerDlgMgr.setTextComments();
ClickButtonOK();
// 安装覆盖率自动 生成脚本,也可以测试者手动添加。
}
5.4 脚本修复(update)
在进行用例修复的时候,通常对于删除对象最难处理。因此这里选择删除的对象进行处理。

图17. 选择删除的对象进行处理
如图所示查找内容的输入栏被删除,其对象名称为TextFieldFind。通过用例修复器对现有的用例集合进行修复:
(1)自动更新事件层,删除TextFieldFind的所有事件 , 同时更新所有的default操作,保证default操作一定可达;
(2)查找到涉及到TextFieldFind的测试脚本如Testcase3;
(3)TextFieldFind 对象变化类型为删除,ButtonSearchNext、ButtonInstead、ButtonInsteadAll对其有依赖关系;
(4)将存在有依赖关系的步骤,替换成默认操作,保证其可达性。
原测试脚本如下所示:
public void testMain(Object[] args)
{
MenuEditMgr menueditMgr = new MenuEditMgr();
SearchDlgMgr searchdlgMgr = new SearchDlgMgr();
menueditMgr.ClickMenubar("Edit");
menueditMgr.ClickMenubar("Edit->Paste");
menueditMgr.ClickMenubar("Edit");
menueditMgr. ClickMenubar("Edit->Instead");
searchdlgMgr.SetTextFieldFind("abc");// 事件被删除
searchdlgMgr.ClickBTNSearchNext();// 有依赖关系更新为 BTNSearchNextDefault()
searchdlgMgr.ClickBTNInstead();// 有依赖关系更新为 BTNInsteadDefault()
searchdlgMgr.SetTextFieldFind("123");// 事件被删除
searchdlgMgr.ClickBTNInsteadALL();// 有依赖关系更新为 BTNInsteadALLDefault()
searchdlgMgr.ClickBTNCancel();// 没有依赖关系不做改变
}
经过修复的测试脚本覆盖了旧脚本,执行这个脚本就可以完成回归测试,代码如下所示:
public void testMain(Object[] args)
{
MenuEditMgr menueditMgr = new MenuEditMgr();
SearchDlgMgr searchdlgMgr = new SearchDlgMgr();
menueditMgr.ClickMenubar("Edit");
menueditMgr.ClickMenubar("Edit->Paste");
menueditMgr.ClickMenubar("Edit");
menueditMgr.ClickMenubar("Edit->Instead");
searchdlgMgr.BTNSearchNextDefault();
searchdlgMgr.BTNInsteadDefault();
searchdlgMgr.BTNInsteadALLDefault();
searchdlgMgr.ClickBTNCancel();
}
总结
一个完整的回归测试脚本集由修复的测试脚本和新生成的测试脚本两部分组成。使用测试脚本修复技术对已有测试脚本进行修复,提高了脚本的重用性。
最后结合一个实际的待测程序,进一步对脚本修复中技术细节进行研究与验证。最终达到了高效进行GUI软件测试、降低测试成本、提高GUI软件质量的目的。