在完成配置文件的定义之后,就可以着手进行代码的编制。首先需要定义常数类,存储几个会经常使用到的字符串。这是一个纯Java的接口文件\library\vputil\IConstant.java。
package library.vputil;
public interface IConstant
public static String IDSFILE=ids.properties; //用来配置预期值文件的名称
public static String TSFIlE=ts.properties; //用来配置控件定义文件的名称
public staticStringLABELCLASS=org.eclipse.swt.custom.CLabel;//标签控件的类名称
public staticStringLABELCLASS2=org.eclipse.swt.widgets.Label;//标签控件的类名称2
public static StringTEXTCLASS=org.eclipse.swt.widgets.Text;//文本控件的类名称
然后,创建一个用来描述对象的对象定义类。它也是一个纯Java的类文件。如\library\vputil\ObjDef.java所示。
package library.vputil;
public class ObjDef
private String objId; //该控件的唯一标识字符串
private String label; //控件附近的标志性标签文字,比如Name:
private String pos; //控件和标签的相对位置关系,比如center和center
private String type; //控件的类型,比如text或者combo
private String input; //input字段存储该控件的预期值
//以下省略了ObjDef类所有属性的get和set方法
//……
另外为了让Testt类能够承载更多的信息,我们创建一个新类ExtTestt,并使用组合的模式来扩展Testt。它内部除了包含一个Testt的引用之外,还包含两个偏移变量。这两个偏移变量用来记录当前Testt相对于最原始基准的偏移量。该文件是一个纯Java类。以下是\library\vputil\ExtTestt.java的源代码。
步骤三:动态校验类PanelVerifier的实现
现在开始创建主要的类PanelVerifier类。PanelVerifier类负责主要的校验流程和关键参数的传入。首先创建PanelVerifier类框架如下:
package library.vputil;
public class PanelVerifier
在类PanelVerifier中添加tabContent变量和dataPath变量,这两个变量需要在初始化的时候传入。tabContent是所在的控件容器的Testt映射对象,而dataPath则指ids.properties和ts.properties两个文件的路径。
private Testt tabContent=null; //控件容器的引用
private String dataPath=null; //预期值文件和控件定义文件的存储位置
public PanelVerifierString dataPath,Testt tabContent
this.tabContent=tabContent;
this.dataPath=dataPath;
然后,添加方法readProperties来读取配置文件。readProperties方法读取预期值文件和控件定义配置文件,将这些读取的值封装在一个List中,List的每个元素都是ObjDef的实例。每个ObjDef对应于一个被测试的控件对象,其中中的各种属性值都来自于配置文件。
接下来,为类PanelVerifier增加一个filterSubitems方法,该方法能够在一个被测试对象内部寻找属性符合预期的子对象。比如filterSubitemstabcontent,text,Name,就是在tabcontent的所有子对象中寻找符合属性text等于Name的子对象。
private List filterSubitemsExtTestt testt,
String propertyname,t propertyvalue
Testt children =testt.getTestt.getChildren;
ArrayList list=new ArrayList;
Rectangle r=Rectangletestt.getTestt.getPropertybounds;
forint i=0;i
Testt subitem=childreni;
ExtTestt eto=new ExtTesttsubitem;
eto.setOffsetXtestt.getOffsetX+r.x; //累计x偏移量
eto.setOffsetYtestt.getOffsetY+r.y ; //累计y偏移量
t value=subitem.getPropertypropertyname;
ifvalue!=null &&value.equalspropertyvalue//判断对象是否符合要求
list.addeto;
list.addAllfilterSubitemseto,propertyname,propertyvalue;
return list;
在所有准备工作都完成之后,就可以着手实现verify方法。该方法的主要流程如图6所示。该方法通过遍历控件容器中的所有对象,首先寻找到所有的特征标签。然后根据特征标签的边界和相对位置关系去发现被测试控件,之后就可以根据被测试控件的属性来判断校验点是否符合预期值。Verify方法的源代码可以在附件中找到。
图 6: verify方法的流程
最后,我们生成\testcases\myvpcase\TestCase这个测试脚本,用来最终解答问题2。在它的testMain方法中我们调用PanelVerifier类如下。其中tabContent是控件容器对应的测试对象。
String dataPath=StringgetOptionIOptionName.DATASTORE;//获取项目所在的路径
dataPath+=\\testcases\\myvpcase; //dataPath指向具体的配置文件所在路径
PanelVerifier pv=newPanelVerifierdataPath,tabContent;//构造PanelVerifier对象
pv.verify; //执行动态校验
动态校验方法的分析和应用
在前面提到,在动态的测试框架下,如果需要进行回归测试,或者增加/减少被测试控件,只需要修改两个配置文件并且重新运行即可。在这个过程中,预期值、测试过程和被测试对象之间的耦合被大量减少,带来的是代码可读性和可维护性的提高。然而,该方法也是以损失一部分性能为代价的,因为对象的动态识别需要至少两次遍历tabContent内部的所有对象,这就损失了一些效率。幸运的是,对于大多数基于eclipse的被测试程序,根据实践经验用户通常感觉不到这方面性能的问题。
本文提供的源程序是在基于eclipse的被测试程序上运行和分析的结果,而且相对关系的处理仅限于右相对关系,可识别的控件只支持文本控件。对于非基于eclipse的被测试对象,比如html或者普通java程序,被识别控件的类型是很丰富的,但只要遵循相同的思路,通过增加相应的代码就能够实现更多的自动识别的功能。
动态的校验点测试的另外一个巨大的潜力在于,它有潜力发展成为一种校验点测试的框架。测试人员使用自动化测试工具来进行测试,其本质目的是为了能够减少手工重复点击和校验,所以测试人员书写的代码脚本越少越少。将测试人员关注的业务部分单独配置出来,而将他们不熟悉的部分封装在一个框架中,会大大提高测试工作的有效性。而本文提供的动态校验点测试正是在这个方面做出了一定的探索。在这个基础上,再增加配置文件的管理、多种控件/相对位置的识别,再辅之于输入输出的接口,它就可能是一个通用性很强的RFT测试框架。
结束语
RFT自身强大的特性决定了测试人员可以通过解耦提高测试代码的可用性,减少维护成本。Java语言的支持使得RFT能够在运行时处理更多的问题,同时能够将Java世界中许多优秀的框架和体系引入到自动化测试的领域中来。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/