CN102096630B - 一种软件测试方法和装置 - Google Patents
一种软件测试方法和装置 Download PDFInfo
- Publication number
- CN102096630B CN102096630B CN 200910242386 CN200910242386A CN102096630B CN 102096630 B CN102096630 B CN 102096630B CN 200910242386 CN200910242386 CN 200910242386 CN 200910242386 A CN200910242386 A CN 200910242386A CN 102096630 B CN102096630 B CN 102096630B
- Authority
- CN
- China
- Prior art keywords
- class
- key word
- layer
- behavior
- tested software
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明的实施例公开了一种软件测试方法和装置,该方法包括:获取被测软件的用例和验证点;根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;获取存储在所述数据类中的所述行为类的执行结果。通过本发明,实现了基于面向对象的软件测试。
Description
技术领域
本发明涉及通信技术领域,特别是涉及一种软件测试方法和装置。
背景技术
对于软件测试行业来说,单靠单纯的手工测试已经远远不能满足要求。手工测试存在时间紧、可靠性低、人力缺乏、无法保证一致性、无法重复等缺陷。相对而言,自动化软件测试快速、可重复、高覆盖率、高可靠性、重用性强等优点正好可以加以弥补。
目前市面上主流的自动化软件测试开发一般基于录制回放、数据驱动、关键字驱动等技术。以如图1所述的登录窗口为例进行说明,具体包括以下步骤:
1、进行录制:录制步骤分为3步:用户名文本框中输入用户名sa、口令文本框中输入密码sa、单击”登录(L)”按钮.
2、脚本和数据分离:把使用到的用户名sa和密码sa存放到外部的Excel表格中,脚本中相关参数用变量代替,术语叫参数化.
3、把输入用户名、输入口令、单击登录按钮这3个步骤抽象成一个函数,作为关键字供不同的用例复用。
在实现本发明的过程中,发明人发现现有技术至少存在如下问题:
现有技术的缺点如下:
1、GUI对象采用静态识别的方式,当对象或者对象属性发生些许变化,与此对象相关的所有脚本回放就会失败。
2、把操作步骤的组合抽象为关键字,类似于把相似语句组织成函数一样,抽象程度低,不利于后续的维护。
3、传统测试框架的整个设计理念就是构建在面向过程上,与现有的面向对象编程潮流不符。
4、测试脚本的开发必须在被测软件完全开发完成之后才可以开始,导致自动化软件测试脚本开发不可以和被测软件的开发并行。
发明内容
本发明的实施例提供一种软件测试方法和装置,用于实现基于面向对象的软件测试。
本发明的实施例提供一种软件测试方法,包括:
获取被测软件的用例和验证点;
根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;
获取存储在所述数据类中的所述行为类的执行结果。
其中,所述根据所述用例调用所述被测软件的关键字的行为类之前,包括:建立所述被测软件的窗口层;
所述建立所述被测软件的窗口层具体包括:
分析所述被测软件的窗口,抽取关键字,所述关键字与所述窗口对应;
根据所述关键字,抽取所述关键字的属性,构成数据类;
根据所述关键字,抽取所述关键字的行为,构成行为类。
其中,所述窗口层由对象组成,所述建立所述被测软件的窗口层之前,包括:建立所述被测软件的对象层;
所述建立所述被测软件的对象层具体包括:
识别所述被测软件的对象;和/或
封装基础控件。
其中,所述根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行包括以下两种情况中的任一种:
所述数据类提供的属性的参数值不为空时,通过所述对象层动态查找所述对象;对所述对象执行所述与所述参数值对应行为;或
所述数据类提供的属性的参数值为空时,不对所述属性对应的对象执行与所述参数值所述对应行为。
其中,还包括:
通过所述对象层的对象判断对应的窗口是否弹出。
其中,所述根据所述用例调用所述被测软件的关键字的行为类之前,还包括:
建立所述被测软件的数据层,将所述数据类和所述行为类配置在所述数据层;
建立脚本层的底层脚本、超类和顶层类,所述底层脚本继承所述超类,所述超类继承所述顶层类;
其中,所述属性包括输入参数和/或输出参数;
还包括:将所述执行结果与预期值进行比较。
本发明的实施例提供一种软件测试装置,包括:
第一获取模块,用于获取被测软件的用例和验证点;
执行模块,用于根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;
第二获取模块,用于获取存储在所述数据类中的所述行为类的执行结果。
其中,还包括:建立模块,用于建立所述被测软件的窗口层;
所述建立模块具体用于:
分析所述被测软件的窗口,抽取关键字,所述关键字与所述窗口对应;
根据所述关键字,抽取所述关键字的属性,构成数据类;
根据所述关键字,抽取所述关键字的行为,构成行为类。
其中,所述建立模块还用于:建立所述被测软件的对象层;
所述建立模块具体用于:
识别所述被测软件的对象;和/或
封装基础控件。
其中,所述执行模块具体用于:
所述数据类提供的属性的参数值不为空时,通过所述对象层动态查找所述对象;对所述对象执行所述与所述参数值对应行为;或
所述数据类提供的属性的参数值为空时,不对所述属性对应的对象执行与所述参数值所述对应行为。
其中,所述执行模块还用于:
通过所述对象层的对象判断对应的窗口是否弹出。
其中,所述建立模块还用于:
建立所述被测软件的数据层,将所述数据类和所述行为类配置在所述数据层;
建立脚本层的底层脚本、超类和顶层类,所述底层脚本继承所述超类,所述超类继承所述顶层类。
其中,所述属性包括输入参数和/或输出参数;
还包括:比较模块,用于将所述执行结果与预期值进行比较。
本发明的实施例具有以下优点:通过对被测软件的对象和窗口的建立,以及窗口关键字的抽取,使得通过关键字的数据类控制行为类的执行完成对被测软件的测试,从而实现了基于面向对象的软件测试,提高了抽象程度更高,降低了后续维护量。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对本发明或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种登录窗口;
图2为本发明实施例提供的一种软件测试方法的流程图;
图3为本发明实施例提供的一种测试框架的结构示意图;
图4为本发明实施例提供的脚本层的结构示意图;
图5(a)为本发明实施例提供的一种抽取关键字的窗口;
图5(b)为本发明实施例提供的一种抽取关键字的窗口;
图6(a)为本发明实施例提供的一种登录成功弹出的窗口;
图6(b)为本发明实施例提供的一种登录失败弹出的窗口;
图7为本发明实施例提供的一种告警知识库管理窗口;
图8为本发明实施例提供的一种软件测试装置的结构示意图;
图9为本发明实施例提供的一种软件测试装置的结构示意图。
具体实施方式
下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图2所示,为本发明的实施例提供的一种软件测试方法,应用于软件测试,具体包括以下步骤:
步骤201、获取被测软件的用例和验证点;
步骤202、根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;
步骤203、获取存储在所述数据类中的所述行为类的执行结果。
为了实现本发明实施例中提供的软件测试方法,本发明实施例提供一种基于面向对象的测试框架,该测试框架能够对GUI界面的对象进行识别,该对象识别需要使用相应的对象识别开源包Abbot或者Jemmy。本发明实施例中的测试框架基于面向对象的思想,共分为四个主要层次:对象层、窗口层、数据层、脚本层。各个层次之间按照图3所示的箭头进行调用,即脚本层调用数据层,数据层调用窗口层,窗口层调用对象层。脚本层包括进行测试的用例和验证点。其中脚本层如图4所示,又分为:顶层类、超类、底层脚本。底层脚本继承超类,超类继承顶层类。此外,该测试框架中还包括域对象层、数据库层、工具类层等辅助层次。
结合上述测试框架,自动化软件测试的流程为:
(1)分析被测软件,找出对象层所有的控件,并对控件进行封装。
具体地,对象层对被测软件中的对象进行识别,将所有控件的进行封装,并且可以根据对象的属性对对象实现动态查找,以及根据对象的属性判断窗口是否弹出。
(2)分析被测软件所有窗口,找出相似的panel或window,抽取关键字,封装关键字的数据类和行为类。
窗口层由对象层组成,根据分析被测软件的所有窗口,抽取出窗口的关键字,其中关键字与窗口层对应;根据关键字,抽取关键字的属性,其中属性包括输入参数和/或输出参数,构成数据类;根据关键字,抽取关键字的行为,构成行为类。数据类为行为类提供属性的参数值,并将行为类的执行结果存储在数据类。其中,行为类是否对相关对象执行对应的行为由数据类中的属性的参数值控制。当关键字的某个属性的参数值为空时,则不对相关对象执行对应的行为;当关键字的某个属性的参数值不为空时,则动态查找到相关对象,并对该相关对象执行对应的行为。
(3)利用spring把窗口层定义好的关键字行为类和数据类配置在数据层。
(4)获取顶层类以及被测软件各子模块的超类。
(5)底层脚本获取用例和验证点。
用例(Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求,测试用例被看作是有效发现软件缺陷的最小测试执行单元。
验证点是脚本(script)中非常重要的组成部分,通过对验证点的执行而得到测试的结果,从而完成对被测软件生成的实际数据和期望数据的比较。
根据用例调用被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行。从关键字的输出参数获取执行结果,将执行结果与预期值相比较,从而实现对被测软件的测试。
需要说明的是,当对象的属性发生变化时,本次用例失败,执行下一个用例。
以下结合附图,对各个层次的功能进行进一步详细的阐述。
一、对象层
首先,该层主要借助第三方对象识别包Abbot或者Jemmy进行对象识别,在此基础上构建自身的对象层。对象层分为两部分:
(1)各种控件类的封装
封装了所有的基础Java控件,它与具体的应用无关,可以看作是测试Java应用的基础类库。对应于Java的每一类基本控件,都有一个对应的Class,其中包括对该控件的基本操作,以及一些在测试过程中需要使用的验证方法,比如验证某个属性的值。对于第三方自定义Java控件的处理,这里采用反射机制直接获取UI对象的属性和方法。
(2)对象工厂
对象工厂主要提供两类功能:一是通过UI对象的父对象属性名和属性值、UI对象类名、UI对象属性名和属性值等5个参数动态查找对象,克服静态查找对象的弊端;二是通过UI对象属性名和属性值动态判断窗口是否已经弹出。
例如:用于完成对象查找功能的查找对象函数为:
public static TestObject findTestObject(String propertyName,String propertyValue,String classID,String propertyNameParent,String propertyValueParent)
例如:用于动态判断窗口等对象是否已经弹出的函数为:
public static boolean isObjectExists(String id,String value,int fixedTime,longloopTime)
二、窗口层
窗口层中包括以下功能:根据被测软件的所有窗口抽取关键字;根据关键字,抽取关键字的输入、输出参数,构成数据类;根据关键字,抽取关键字的行为,构成行为类。
(1)分析被测软件所有窗口,抽取关键字(相当于window或者panel)。
在进行GUI界面开发的时候,一般步骤是把各种UI对象组合成panel,再把各种panel组合成window,尽最大可能进行复用。同样的,在测试脚本中,把panel和window作为关键字提取出来,这样当程序GUI界面中某个UI对象发生变化时,只需要把相应的关键字进行修改即可,达到只修改一处的目的。其中,根据每一个窗口中panel和window之间的组合层次关系,对应不同的panel或window的关键字也具有相应的层次关系,如高层次关键字和低层次关键字。
如图5(a)和图5(b)所示,两个“子条件”tab页位于两个不同的窗口,但是基本是一致的,所以把这个tab页抽象成一个关键字:“子条件”tab页。同理,图5(a)和图5(b)中的两个“基本信息”tab页抽象成一个关键字:“基本信息”tab页。图5(a)中的窗口和图5(b)中的窗口也抽象成关键字。根据图5(a)和图5(b)中窗口和tab页的组合层次,可以获知图5(a)中的窗口是高层关键字,包括“基本信息”tab页和“子条件”tab页两个低层关键字;同样,图5(b)中的窗口也是高层关键字,包括“基本信息”tab页和“子条件”tab页两个低层关键字。从上述关系中可知,低层关键字可以供高层关键字复用。
(2)根据抽取的关键字,抽取关键字的属性,构成数据类。
抽取出关键字之后,就要对该关键字的属性进行提取,构成数据类。优选地,对于每个关键字,其属性包括输入参数和输出参数。其中,输入参数可以为文本框输入、按钮单击等操作;输出参数可以为查询出的表格数据等。对于每一个关键字,包括输入参数或输出参数,或输入参数和输出参数。且每个参数都是控制该关键字行为的一个开关,根据关键字的属性的参数值是否为空而控制是否执行关键字对应的行为。
以图1中所示的窗口为例,抽取其属性(该窗口关键字没有输出参数)。由图1可知,输入用户名、输入口令、单击“登录”或“取消”按钮都是该窗口关键字的输入参数,此关键字没有输出参数。相关示例代码如下:
public class LoginPara{
private String username;//输入的用户名,如sa
private String password;//输入的口令,如sa
private String buttonname;//点击按钮的名字,如”登录(L)”
private IActionWard actionward;//代表某个窗口对象
...省略相应get/set方法
}
从上述代码中,可以看到配置了一个IActionWard属性,用来代表接下来会弹出的窗口,例如:如果登录成功弹出图6(a)所示的窗口;如果登录失败弹出图6(b)所示的窗口。该IActionWard属性需要在每个关键字的数据类中配置,以便获知接下来会弹出的窗口。
以图7中的窗口为例,抽取其属性(该窗口关键字包括输出参数)。由图7可知,重置、查询、知识库导入、导出、关闭按钮等均是该关键字的输入参数,查询出的表格内容就是输出参数。相关代码示例如下:
public class AlarmKnlgPara{
private List<String>lstTreePath;//代表左边listbox
private List<String>lstSpecCause;//代表表格中行关键字,这里是特定原因
private String tableContextPath;//代表表格上下文菜单
private String buttonName;//代表重置、查询、知识库导入、导出、关闭按钮中的一个
private IActionWard actionWard;//代表下一个未知的弹出窗口
private Integer outTableCount;//代表查询出的表格行数
...省略相应get/set方法
}
(3)抽出关键字的行为,构成行为类
将关键字的数据类传入关键字的行为类,根据关键字的数据类中的某个属性是否为空控制行为类是否执行相关对象的操作。具体地,如果其中某个属性是null(即该属性为空),则不执行相关对象的操作。否则利用对象层,对非null属性对应的对象进行动态查找,并在对象上执行相关操作,例如单击按钮等。通过上述描述可知,关键字的数据类具有双重作用,其一是传递UI对象所需要的数据;其二是一个执行开关,只有某个属性值为非null(即参数有数据),与参数有关的操作才可以执行。
以下图1所示的登陆窗口为例,说明关健字的行为类如何根据关键字的数据类传递的参数执行相关对象的操作。首先,关键字的行为类接收传入的关键字对应的JavaBean(一种JAVA语言写成的可重用组件),根据该JavaBean取出数据层配置的参数,包括:用户名参数、口令参数、按钮名参数和关键字参数等。如果用户名参数被设置,找到相关对象,即用户名文本框,在该对象上执行setText操作,设置值;如果口令参数被设置,找到相关对象,即口令文本框,在该对象上执行setText操作,设置值;如果按钮名参数被设置,找到相关对象,即按钮,在该对象上执行click操作,单击按钮;如果关键字actionWard参数被设置,执行传入的关键字,即执行下一个窗口对象行为类。具体相关代码示例如下:
//关键字的行为类
public class SecMngLoginAW implements IActionWard{
private SecMngLoginPara para;
//传入关键字对应的JavaBean
public SecMngLoginAW(SecMngLoginPara para){
this.para=para;
}
public void perform(){
//从传入的JavaBean中取出数据层配置的参数
String title=″用户登录″;
String username=para.getUsername();
String password=para.getPassword();
String buttonname=para.getButtonname();
IActionWard actionWard=para.getActionWard();
if(ObjectFactory.isObjectExists(Constant.PROP_CaptionText,title)){
DDialog dialog=new DDialog(Constant.PROP_CaptionText,title);
//如果用户名参数被设置了,先找到用户名文本框,再在对象上执行setText操作,设置值
if(username!=null){
DTextField tfUsername=new DTextField(″用户名″,dialog);
tfUsername.setText(username);
}
//如果口令参数被设置了,先找到口令文本框,再在对象上执行setText操作,设置值
if(password!=null){
DTextField tfPassword=new DTextField(″密码″,dialog);
tfPassword.setText(password);
}
//如果按钮名参数被设置了,先找到按钮,再在对象上执行click操作,单击按钮
if(buttonname!=null){
DButton button=new DButton(buttonname,dialog);
button.click();
}
//如果关键字actionWard参数被设置了,执行传入的关键字,即执行下一个窗口对象行为类
if(actionWard!=null){
actionWard.perform();
}
}
}
}
以图7所示的告警知识库管理窗口为例,说明关键字的行为类如何根据关键字的数据类传递的参数执行相关对象的操作。对于关键字输入参数,其处理过程与上述类似。对于该关键字数据类中的输出参数,如果输出参数被设置,调用相应方法查找出表格行数,把它再次设置到关键字数据类中,这样脚本层就可以通过关键字数据类得到表格中数据。相关代码示例如下:
public class AlarmKnlgAW implements IActionWard{
private AlarmKnlgPara para;
public AlarmKnlgAW(AlarmKnlgPara para){
this.para=para;
}
public void perform(){
Integer outTableCount=para.getOutTableCount();
IActionWard actionWard=para.getActionWard();
if(ObjectFactory.isObjectExists(Constant.PROP_CaptionText,″告警知识库管理″)){
//...省略部分输入参数的代码
//输出参数部分的代码
//如果输出参数被设置,调用相应方法查找出表格行数,把它再次设置到关键字数据类中,这样脚本层就可以通过关键字数据类得到表格中数据
if(outTableCount!=null){
WTable table=new WTable(Constant.CLASS_JXTable,dialog);
Integer retVal=table.getTableCount()
para.setOutTableCount(retVal);
}
//如果关键字被设置,那么执行此关键字
if(actionWard!=null){
actionWard.perform();
}
}
}
}
三、数据层
把窗口层定义好的关键字行为类和数据类配置在数据层。这一层结合Spring框架,利用IoC的思想,把关键字需要使用到的输入输出参数和其行为类配置到XML文件中,根据输入输出参数内容的不同,一个关键字可以对应不同的数据层Bean,供脚本层调用。利用Spring框架有2个优点:首先XML文件中可以配置任意类型的对象;其次相似的Bean对象在配置文件中可以做复用继承。这样大大减少了配置文件中输入输出参数的配置亮。
对登录窗口设置值的相关代码示例如下:
<!--数据层Bean,供脚本层调用-->
<!--用户登录窗口关键字的行为类-->
<bean id=″superHelper_userLoginAW″class=″com.datang.omcauto.tasks.common.UserLoginAW″ init-method=″perform″lazy-init=″true″scope=″prototype″>
<constructor-arg ref=″superHelper_userLoginPara″></constructor-arg>
</bean>
<!--用户登录窗口关键字的数据类-->
<bean id=″superHelper userLoginPara″class=″com.datang.omcauto.tasks.common.UserLoginPara″>
<property name=″username″value=″sa″></property>
<property name=″password″value=″sa″></property>
<property name=″buttonname″value=″登录(L)″></property>
<!--这里配置的是另一个关键字,即登录成功后应该弹出哪个窗口,这里配置的是登录成功后的窗口-->
<property name=″linkNeAW″ref=″superHelper_linkNeAW″></property>
</bean>
...省略其他Bean
此外,以用户sa1登录窗口,利用Spring,通过继承即可省略其它3个域的配置,从而利用配置文件减少输入量,相关代码示例如下:
<!--用户登录窗口关键字的数据类-->
<bean id=″superHelper_userLoginAnother″parent=″superHelper_userLoginPara″>
<property name=″username″value=″sa1″></property>
</bean>
对带有输出参数的告警知识库窗口的属性配置相关代码示例如下:
<!--告警知识库窗口关键字的数据类-->
<bean id=″alarmKnlg_getTableObject″parent=″superHelper_userLoginPara″>
<!--...省略输入参数的配置-->
<!--随便输入对应类型的初始值即可,在关键字行为类中会重新设置的-->
<property name=″outLstKnlgObject″value=″-1″></property>
</bean>
四、脚本层
如图4所示,脚本层又分为:顶层类、超类、底层脚本,以下分别对每一个层次的功能进行详细的阐述。
1、顶层类
顶层类主要内容包括启动被测程序,初始化spring容器,进行异常处理,配置公共数据层Bean等功能。
(1)异常处理
执行自动化用例,很关键的一点就是异常的处理,当前一个用例执行失败后,后续的用例还要继续正常执行。目前处理是脚本层的异常(如对象查找不到,对象属性查找不到,对象方法不存在等等)按类型直接发送给上层的超类,由超类对各种异常进行处理,默认的处理是只要有异常就把所有程序相关的窗口一一关闭。
(2)配置公共数据层Bean
将登录登出关键字的数据层Bean放到顶层类的前置和后置条件中,供所有脚本共用,用以实现用户登录或登出被测程序的操作。
//前置条件函数,调用数据层Bean”superHelper_userLoginAW”,实现用户登录被测程序的操作
public void onSetup(){
context.getBean(″superHelper_userLoginAW″);
}
//后置条件函数,调用数据层Bean”superHelper_userLogoutAW”,实现用户退出被测程序的操作
public void onTeardown(){
context.getBean(″superHelper_userLogoutAW″);
}
2、超类
一般被测程序都是由几个子模块组成的,所以把每个子模块用到的特有公共数据层Bean配置在此层,供子模块对应的脚本共用。
3、底层脚本
用例和验证点配置在底层脚本中。在脚本的前置条件,后置条件,操作步骤中调用数据层中配置的Bean,这些Bean对于脚本来说是复用的。对于验证点,需要的实际值可以从关键字的数据类、数据库等地方获取。
告警管理子模块中的1个用例底层脚本的相关代码示例如下:
//从告警子模块超类中继承
public class A02B03C05_001_ExistTemplate extends AlarmSuper
{
private static Logger log =Logger.getLogger(A02B03C05_001_ExistTemplate.class);
private String title=″A02B03C05.001--告警管理,告警频次分析窗口,使用已存在的告警条件模板进行频次分析,操作成功″;
//脚本前置条件
Override
public void onSetup(){
log.info(title);
super.onSetup();
log.info(″前置条件1:设置基本条件模板开始″);
context.getBean(″kw_basicConfTemplate_addBasicConfTemplateAW″);
log.info(″前置条件1:设置基本条件模板结束″);
log.info(″前置条件2:上报模拟告警开始″);
context.getBean(″kw_simulate_sendSNDBNewAlarm1″);
log.info(″前置条件2:上报模拟告警结束″);
}
//脚本后置条件
Override
public void onTeardown(){
log.info(″后置条件1:删除基本条件模板开始″);
context.getBean(″kw_basicConfTemplate_delBasicConfTemplateAW″);
log.info(″后置条件1:删除基本条件模板结束″);
log.info(″后置条件2:清除模拟告警开始″);
context.getBean(″kw_alarmMonitor_clearNodeBAlarmAW″);
log.info(″后置条件2:清除模拟告警结束″);
super.onTeardown();
log.info(title);
}
//脚本步骤
public void onTest(Object[]args)
{
log.info(″步骤1:设置告警频次开始″);
context.getBean(″kw_alarmFrequency_addFrequencyAW_template″);
AlarmFrequencyResultPara alarmFrequencyResultPara =(AlarmFrequencyResultPara)context.getBean(″alarmFrequency_addAlarmFrequencyResultPara_template″);
log.info(″步骤1:设置告警频次结束″);
log.info(″步骤2:验证告警频次开始″);
//验证点,把实际查询到的告警数和预期值做对比,其中输出参数从关键字的数据类中取出
Assert.assertEquals(title,″实际查询到的告警数:″+alarmFrequencyResultPara.getOutTableRowCount(), 1,alarmFrequencyResultPara.getOutTableRowCount());
log.info(″步骤2:验证告警频次结束″);
}
}
此外,该测试框架中还包括域对象层、数据库层、工具类层等辅助层次。
(1)域对象层
域对象层是一种数据类,域对象贯穿于整个框架中,每个层次都可以使用,被测***需要的所有域对象都配置在此。
例如:有一个用例希望把图中表格的内容、相对应的数据库内容、导出的Excel表格中内容进行比较,查看三者数据是否一致。按照面向对象的思想,把表格中一行抽象成1个域对象KnlgObject,在域对象上配置自定义annotation,这样表格、数据库、Excel表格可以共用一个对象,通过域对象的equals方法即可以比较三者是否一致。
(2)数据库层
采用JPA技术,以对象形式获取数据库记录,以便更好的进行数据比对。
(3)工具类层
封装工具类,比如ftp工具类、断言工具类、excel工具类、csv工具类等。
需要说明的是,本发明实施例提供的软件测试方法所基于的测试框架,使得自动化软件测试在被测软件概要设计完成后就可以介入。只要有完整的GUI界面和软件需求即可,从而使得自动化软件测试与被测软件就可以同步开发。当被测软件发布测试时,只需要调试对应自动化脚本,降低了自动化软件测试的开发成本。
本发明的实施例提供一种软件测试装置,应用于软件测试,如图8所示,软件测试装置800包括:
第一获取模块810,用于获取被测软件的用例和验证点;
执行模块820,用于根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;
第二获取模块830,用于获取存储在所述数据类中的所述行为类的执行结果。
其中,还包括:建立模块840,用于建立所述被测软件的窗口层;
建立模块840具体用于:
分析所述被测软件的窗口,抽取关键字,所述关键字与所述窗口对应;
根据所述关键字,抽取所述关键字的属性,构成数据类;
根据所述关键字,抽取所述关键字的行为,构成行为类。
其中,建立模块840还用于:建立所述被测软件的对象层;
建立模块840具体用于:
识别所述被测软件的对象;和/或
封装基础控件。
其中,执行模块820具体用于:
所述数据类提供的属性的参数值不为空时,通过所述对象层动态查找所述对象;对所述对象执行所述与所述参数值对应行为;或
所述数据类提供的属性的参数值为空时,不对所述属性对应的对象执行与所述参数值所述对应行为。
其中,执行模块820还用于:
通过所述对象层的对象判断对应的窗口是否弹出。
其中,建立模块840还用于:
建立所述被测软件的数据层,将所述数据类和所述行为类配置在所述数据层;
建立脚本层的底层脚本、超类和顶层类,所述底层脚本继承所述超类,所述超类继承所述顶层类。
其中,所述属性包括输入参数和/或输出参数;
还包括:比较模块850,用于将所述执行结果与预期值进行比较。
本发明的实施例具有以下优点:通过对被测软件的对象和窗口的建立,以及窗口关键字的抽取,使得通过关键字的数据类控制行为类的执行完成对被测软件的测试,从而实现了基于面向对象的软件测试,提高了抽象程度更高,降低了后续维护量。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。
Claims (12)
1.一种软件测试方法,其特征在于,包括:
获取被测软件的用例和验证点;
根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;
获取存储在所述数据类中的所述行为类的执行结果;
其中,根据所述用例调用所述被测软件的关键字的行为类之前,包括:
建立所述被测软件的对象层;具体包括:识别所述被测软件的对象和/或封装基础控件;
建立所述被测软件的窗口层,所述窗口层由对象组成。
2.如权利要求1所述的方法,其特征在于,所述建立所述被测软件的窗口层具体包括:
分析所述被测软件的窗口,抽取关键字,所述关键字与所述窗口对应;
根据所述关键字,抽取所述关键字的属性,构成数据类;
根据所述关键字,抽取所述关键字的行为,构成行为类。
3.如权利要求1所述的方法,其特征在于,所述根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行包括以下两种情况中的任一种:
所述数据类提供的属性的参数值不为空时,通过所述对象层动态查找所述对象;对所述对象执行所述与所述参数值对应行为;或
所述数据类提供的属性的参数值为空时,不对所述属性对应的对象执行与所述参数值所述对应行为。
4.如权利要求3所述的方法,其特征在于,还包括:
通过所述对象层的对象判断对应的窗口是否弹出。
5.如权利要求1所述的方法,其特征在于,所述根据所述用例调用所述被测软件的关键字的行为类之前,还包括:
建立所述被测软件的数据层,将所述数据类和所述行为类配置在所述数据层;
建立脚本层的底层脚本、超类和顶层类,所述底层脚本继承所述超类,所述超类继承所述顶层类;其中,所述被测软件的用例和验证点配置于底层脚本中;所述被测软件程序的各个子模块所用到的特有公共数据层配置于超类中,以供所述子模块对应的脚本共用;所述顶层类用于启动被测程序、初始化spring容器、进行异常处理、配置公共数据层。
6.如权利要求1至5中任一项所述的方法,其特征在于,所述属性包括输入参数和/或输出参数;
还包括:将所述执行结果与预期值进行比较。
7.一种软件测试装置,其特征在于,包括:
第一获取模块,用于获取被测软件的用例和验证点;
执行模块,用于根据所述用例调用所述被测软件的关键字的行为类,根据所述验证点调用所述被测软件的关键字的数据类,并根据所述数据类提供的属性的参数值控制所述行为类中对应行为的执行;
第二获取模块,用于获取存储在所述数据类中的所述行为类的执行结果;
所述软件测试装置还包括建立模块,所述建立模块用于:在所述执行模块根据所述用例调用所述被测软件的关键字的行为类之前,建立所述被测软件的对象层;具体包括:识别所述被测软件的对象和/或封装基础控件;以及,建立所述被测软件的窗口层,所述窗口层由对象组成。
8.如权利要求7所述的装置,其特征在于,所述建立模块具体用于:
分析所述被测软件的窗口,抽取关键字,所述关键字与所述窗口对应;
根据所述关键字,抽取所述关键字的属性,构成数据类;
根据所述关键字,抽取所述关键字的行为,构成行为类。
9.如权利要求7所述的装置,其特征在于,所述执行模块具体用于:
所述数据类提供的属性的参数值不为空时,通过所述对象层动态查找所述对象;对所述对象执行所述与所述参数值对应行为;或
所述数据类提供的属性的参数值为空时,不对所述属性对应的对象执行与所述参数值所述对应行为。
10.如权利要求9所述的装置,其特征在于,所述执行模块还用于:
通过所述对象层的对象判断对应的窗口是否弹出。
11.如权利要求7所述的装置,其特征在于,所述建立模块还用于:
建立所述被测软件的数据层,将所述数据类和所述行为类配置在所述数据层;以及建立脚本层的底层脚本、超类和顶层类,所述底层脚本继承所述超类,所述超类继承所述顶层类;其中,所述被测软件的用例和验证点配置于底层脚本中;所述被测软件程序的各个子模块所用到的特有公共数据层配置于超类中,以供所述子模块对应的脚本共用;所述顶层类用于启动被测程序、初始化spring容器、进行异常处理、配置公共数据层。
12.如权利要求7至11中任一项所述的装置,其特征在于,所述属性包括输入参数和/或输出参数;
还包括:比较模块,用于将所述执行结果与预期值进行比较。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200910242386 CN102096630B (zh) | 2009-12-10 | 2009-12-10 | 一种软件测试方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200910242386 CN102096630B (zh) | 2009-12-10 | 2009-12-10 | 一种软件测试方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102096630A CN102096630A (zh) | 2011-06-15 |
CN102096630B true CN102096630B (zh) | 2013-11-06 |
Family
ID=44129733
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200910242386 Active CN102096630B (zh) | 2009-12-10 | 2009-12-10 | 一种软件测试方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102096630B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103092750A (zh) * | 2012-11-13 | 2013-05-08 | 瑞斯康达科技发展股份有限公司 | 一种单元测试方法及装置 |
CN107864488B (zh) * | 2017-11-15 | 2020-12-08 | 京信通信***(中国)有限公司 | 一种基站业务自动测试的方法、装置及*** |
CN107908564A (zh) * | 2017-11-27 | 2018-04-13 | 于海生 | 一种基于数据分离原则的ui测试框架 |
CN108304329B (zh) * | 2018-02-13 | 2020-12-15 | 论客科技(广州)有限公司 | 一种测试用例的设计方法、装置、终端及可读存储介质 |
CN109783388B (zh) * | 2019-01-16 | 2022-03-01 | 北京金山云网络技术有限公司 | Ui自动化测试方法、装置及电子设备 |
CN111737149B (zh) * | 2020-07-24 | 2020-12-29 | 浙江口碑网络技术有限公司 | 一种真机平台、测试方法、以及测试脚本处理方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5751941A (en) * | 1996-04-04 | 1998-05-12 | Hewlett-Packard Company | Object oriented framework for testing software |
CN101339534A (zh) * | 2008-06-17 | 2009-01-07 | 金蝶软件(中国)有限公司 | 一种软件测试的方法及装置 |
-
2009
- 2009-12-10 CN CN 200910242386 patent/CN102096630B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5751941A (en) * | 1996-04-04 | 1998-05-12 | Hewlett-Packard Company | Object oriented framework for testing software |
CN101339534A (zh) * | 2008-06-17 | 2009-01-07 | 金蝶软件(中国)有限公司 | 一种软件测试的方法及装置 |
Non-Patent Citations (6)
Title |
---|
刘佳 等.基于对象状态的面向对象软件测试方法研究.《电脑知识与技术》.2008,第4卷(第8期),全文. |
基于对象状态的面向对象软件测试方法研究;刘佳 等;《电脑知识与技术》;20081231;第4卷(第8期);全文 * |
张文祥 等.面向对象的软件测试方法.《计算机应用》.2004,第24卷(第12期),全文. |
罗娜 等.面向对象软件测试的方法研究.《东北师大学报自然科学版》.2004,第36卷(第1期),全文. |
面向对象的软件测试方法;张文祥 等;《计算机应用》;20041231;第24卷(第12期);全文 * |
面向对象软件测试的方法研究;罗娜 等;《东北师大学报自然科学版》;20040331;第36卷(第1期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN102096630A (zh) | 2011-06-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102096630B (zh) | 一种软件测试方法和装置 | |
CN107861870B (zh) | 接口测试及测试数据生成方法、装置、终端和存储介质 | |
CN105701005B (zh) | 基于osgi的应用框架测试方法和*** | |
CN101770423B (zh) | 一种测试数据生成方法及测试*** | |
CN106843837A (zh) | openstack组件容器化的构建方法 | |
CN107832207A (zh) | 接口性能测试方法、装置、存储介质和计算机设备 | |
Margaria et al. | Efficient test-based model generation for legacy reactive systems | |
CN109040235B (zh) | 一种基于区块链技术的工业控制***操作记录的存储方法 | |
CN103984626B (zh) | 一种生成测试用例脚本的方法及装置 | |
CN107807878A (zh) | 基于关键字的自动化测试引擎 | |
CN109902017A (zh) | 一种基于RobotFramework测试Dubbo接口的方法及终端 | |
Fahland et al. | Mining branching-time scenarios | |
CN108845940A (zh) | 一种企业级信息***自动化功能测试方法和*** | |
CN103605606B (zh) | 一种可自动转换的嵌入式软件测试用例批量执行方法 | |
CN102043716A (zh) | 基于业务驱动的软件自动化测试方法 | |
CN105204991A (zh) | 一种物联设备测试方法及装置 | |
CN103399814A (zh) | 自动化测试的方法及装置 | |
CN106484609A (zh) | 页面测试方法和装置 | |
CN110134612A (zh) | Ui测试数据生成方法、装置、设备及可读存储介质 | |
CN106778264A (zh) | 一种移动客户端的应用程序分析方法及分析*** | |
CN108874649A (zh) | 自动化测试脚本的生成方法、装置及其计算机设备 | |
CN101216766A (zh) | 原子操作封装装置和方法 | |
CN106294172A (zh) | 基于终端设备的app自测方法和装置 | |
CN105760300A (zh) | 一种stk/utk业务的自动化测试方法及测试*** | |
CN103777092A (zh) | 一种基于云技术的继电保护测试***及其方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |