发明内容
本发明要解决的问题是:在图形用户界面软件测试中,针对后台处理程序测试的测试用例生成不仅需要耗费大量资源,且生成的测试用例并不足以保证其分支覆盖率和有效性。
本发明的技术方案为:基于符号执行的GUI程序测试用例扩增方法,对于一个GUI待测程序,使用工具Java Path Finder,简称JPF,为待测程序源代码创建“.jpf”文件,并静态分析待测程序代码,获取JPF符号执行分析后产生的有效输入值;确定已有测试用例中需要修改的参数,然后根据控件的名字属性作为关键字搜索与定位到待测程序中所述需要修改的参数对应的位置,得到修改参数有效输入值,再用所述修改参数有效输入值替换已有测试用例原脚本中对应位置的输入值,生成新的测试用例,所述新的测试用例用于扩增原测试用例集。
按照以下步骤生成“.jpf”文件并进行符号执行:
1)扫描待测程序中包含的待测类,并确定其中的程序方法及输入参数的个数;
2)对每个输入参数,随机产生参数值;
3)对于每个待测类,自动生成包含main()方法的java文件,即“.jpf”文件,main()方法中包含待测类中所有的方法;
4)根据新生成的java文件设定JPF执行时的参数,包括target、classpath、symbolic.method、listener、search.multiple_errors和vm.storage.class这6个执行参数:
target:指定新生成的包含待测类的java文件的名字;
classpath:指定新生成的定包含待测类的java文件编译后的bin文件所在目录;
symbolic.method:指定待测类中的待测方法,如果待测类中的一个方法是被另一个方法调用的,则只将进行调用的方法作为待测方法的候选,忽略被调用的方法;
listener:指定JPF中针对符号执行的监控器,设为.symbc.SymbolicListener;
search.multiple_errors:包含True和False两种值,True指在符号执行过程中即使碰到错误仍会继续执行,False指在符号执行过程中碰到错误时停止执行,默认值为True;
vm.storage.class:用于存储状态的类,设为nail,即空;
5)根据步骤4)设定的JPF的执行参数,用JPF执行新生成的包含待测类的java文件,获得该类的符号执行结果,得到有效输入值。
对于一个GUI待测程序,将其前端的输入域和后台代码的参数相对应,以便根据名字属性确定更新输入值的位置。
GUI程序的测试用例主要针对程序界面进行测试。目前已有的基于符号执行的测试用例扩增方法较少,且大部分方法针对命令行程序,并不能对GUI程序界面进行测试用例扩增。主要原因是符号执行针对的是后台逻辑代码,直接用符号执行生成的测试用例并不一定能够满足GUI程序的系统级需求或有效的查出GUI程序存在的问题。假设运用传统的符号执行得到不同路径上的两个测试用例T和T’,虽然T和T’的执行路径并不相同,但这两条路径对应的GUI界面可能是一样的。另外,对于某些GUI界面,并不能够确定其对应程序路径,传统的符号执行无法进行。因此,单纯的使用已有的基于符号执行的测试用例扩增方法并不能满足GUI软件扩增的测试需求。
本发明提出了一种改进的基于符号执行的测试用例扩增方法,该方法在传统符号执行的基础上进行改进,将GUI程序前台界面与后台逻辑代码相对应,以待测程序中控件的名字属性作为关键字在待测程序的脚本中搜索与定位需要置入新输入值的位置,再运用符号执行来生成扩增的测试用例集。
本发明作为一种GUI界面测试技术引入了符号执行技术,通过人工或自动手段,将GUI程序前台界面与后台逻辑代码相结合,得到一条可以执行到待测界面的路径,使得能够运用符号执行的方法完成对GUI程序前台界面测试用例的扩增,让GUI程序前台界面的测试更加充分,从而使得测试人员可以得到较充分的测试用例集,大大提高了GUI程序前台界面的测试效率。
具体实施方式
本发明使用的三个主要技术分别是路径分析(Path Analysis)技术,符号执行(Symbolic Execution)技术和约束求解(Constrain Solving)技术。下面介绍方法的流程并具体说明本发明所使用的各项技术的实施方式。
1路径分析技术
符号执行技术是基于路径(控制流)的技术,在用符号变量取代被测程序运行中的实际变量前,需要对被测程序代码进行静态分析,获取代码中的控制流图,例如图3所示的符号执行的示例代码,其控制流图如图4,符号执行树如图5。通常地,控制流图中的每一个节点对应为程序源代码中的一条语句。
2符号执行技术
通过路径分析,可以得到待测程序的控制流图。符号执行技术是指在不执行程序的前提下,使用符号变量替换程序中的变量。然后模拟执行代码,并对每一步中的程序执行状态进行记录。需要记录的程序执行状态一般有程序变量的符号值、路径条件(PC)、程序标记。其中,路径条件即为程序语句的约束条件,程序标记即为当前执行点的后续节点信息。符号执行后,便得到了符号执行树。
符号执行又分为过程内分析和过程间分析(又称全局分析)。过程内分析是指只对单段代码进行分析,而全局分析指对整个软件代码进行分析,包括考虑当前函数的间调用信息和环境信息等。
传统的符号执行在处理大规模或较为复杂的程序存在较大问题,例如,如果某一个路径约束的可满足性无法确定或是程序中包含较为复杂的数据类型,传统的符号执行就无法精确求解路径,从而无法获得满足路径约束的测试用例。
近几年,动态符号执行也得到了广泛发展。与传统的静态符号执行不同,动态符号的基本思想是将符号输入和具体输入值相结合。当碰到复杂路径或是大规模路径时,用具体输入值代替符号输入,这样可以继续进行符号执行并可以得到求解的约束路径,提高了符号执行的效率。并且,由于部分符号输入被具体输入值代替,使得符号执行中的复杂数据结构或表达式得以简化,大大减小了符号执行的代价。
3约束求解技术
符号执行树描述了符号执行技术作用于被测软件时执行的所有路径,其具有如下两个特点:
●对于符号执行树中的每一条路径,总存在实际的输入值能够使得被测试程序代码执行到该路径上的叶子节点。
●从共同的根节点出发的两条路径有且只有一个分叉节点。
符号执行树对符号执行具有非常重要的意义,其中包含的节点顺序、路径条件是否正确直接关系着符号执行的正确与否。符号执行树中的每一个节点都记录了程序当前状态中每个变量的符号值,和路径条件(pc)。约束求解器能够在每条路径的叶子节点处进行约束求解,从而获得能够覆盖每条路径的输入值。
下面通过具体的实例来说明本发明的实施:
本发明选择了两个java程序作为实验程序。两个程序均为开源程序。表1列出了这两个程序的详细信息。
程序 |
程序行数 |
初始测试个数 |
Triangle |
191 |
2 |
J3Calculator |
2202 |
10 |
图1为实验的流程,其中初级测试用例不是本发明生成的,是已有的测试用例。本发明需要修改初始的测试用例来生成新的测试用例。
本发明先确定已有测试用例中需要修改的参数,然后根据控件的名称搜索与定位到待测程序中需要修改的参数对应的位置,然后求解该值,用得到的值来扩增测试用例。具体实施方式如图2,介绍如下:对于一个待测GUI程序,首先使用工具Java Path Finder,简称JPF,为待测程序源代码创建“.jpf”文件,并静态分析待测程序代码,获取JPF符号执行分析后产生的有效输入值;确定已有测试用例中需要修改的参数,然后根据参数对应的控件的名字属性作为关键字搜索与定位到待测程序中所述需要修改的参数对应的位置,得到修改参数有效输入值,本发明这里用名字进行搜索,需要修改的参数的名字跟控件的名字是一致的。然后用修改参数有效输入值替换已有测试用例原脚本中对应位置的输入值,生成新的测试用例,所述新的测试用例用于扩增原测试用例集。其中,由于直接使用jpf需要main函数,因此我们按照以下步骤生成“.jpf”文件并进行符号执行:
1)扫描待测程序中包含的待测类,并确定其中的程序方法及输入参数的个数;
2)对每个输入参数,随机产生参数值;
3)对于每个待测类,自动生成包含main()方法的java文件,即“.jpf”文件,main()方法中包含待测类中所有的方法;
4)根据新生成的java文件设定JPF执行时的参数,包括target、classpath、symbolic.method、listener、search.multiple_errors和vm.storage.class这6个执行参数:
target:指定新生成的包含待测类的java文件的名字;
classpath:指定新生成的定包含待测类的java文件编译后的bin文件所在目录;
symbolic.method:指定待测类中的待测方法,也就是在待测类的方法中指定一个方法,等待进行测试,如果待测类中的一个方法是被另一个方法调用的,则只将进行调用的方法作为待测方法的候选,忽略被调用的方法;
listener:指定JPF中针对符号执行的监控器,设为.symbc.SymbolicListener;
search.multiple_errors:包含True和False两种值,True指在符号执行过程中即使碰到错误仍会继续执行,False指在符号执行过程中碰到错误时停止执行,默认值为True;
vm.storage.class:用于存储状态的类,设为nail,即空;
5)根据步骤4)设定的JPF的执行参数,用JPF执行新生成的包含待测类的java文件,获得该类的符号执行结果,得到有效输入值。
对于一个GUI软件,将前端的输入域和后台代码的参数相对应,以控件的名字属性(name)作为关键字在已有测试用例脚本中搜索与定位需要置入新输入值的位置,然后用符号执行生成的有效输入值替换已有测试用例原脚本中的输入值,生成新的测试用例。前端的输入域和后台代码的参数的对应可以用如下两种进行对应:
1)人工确定。该方法是人为的将前端的输入域和后台代码的参数进行对应,为了减少代价,我们让代码的编写人员进行对应,这样可以提高对应的效率和准确度。该方法的优点是可以保证前端的输入域和后台代码的参数对应的准确度,缺点是效率较低且需要消耗大量的人力物力等。
2)自动确定。该方法是通过java类包中自带的函数方法将前端的输入域和后台代码的参数进行对应。该方法的优点是代价较小,缺点是相对于人工确定,该方法的准确性有待提高。
本发明使用JAVA PATH FINDER(JPF)工具,在ECLIPSE开发平台中,基于符号执行技术,通过改变已有测试用例的输入值,增强其测试效率。我们使用JAVA语言实现了基于符号执行的测试用例增强技术:对源程序进行符号执行静态分析,提取分析结果,并将分析结果作用于初级测试用例中,从而获得增强后的测试用例。