一种快速高路径覆盖率测试用例生成方法与流程

文档序号:17989420发布日期:2019-06-22 00:39阅读:319来源:国知局
一种快速高路径覆盖率测试用例生成方法与流程

本发明涉及软件测试领域,具体涉及软件测试中测试用例的生成。



背景技术:

软件测试是保证软件产品质量的重要手段,自动生成测试数据则是软件测试的重点与难点。近年来,一些学者研究应用进化理论生成满足路径覆盖准则的测试数据,并提出许多使用遗传算法自动生成覆盖目标路径测试数据的新方法。众所周知,适应度函数的设计是遗传算法的关键。如mcminn(mcminnp.evolutionarysearchfortestdatainthepresenceofstatebehaviour[d].universityofsheffield,england,2005)将分支距离规范化到[0,1)内,给出基于规范化后的分支距离与层接近度的适应值函数,并在进化过程中将适应值函数最小化.张岩等的文章(张岩,巩敦卫.基于稀有数据扑捉的路径覆盖测试数据进化生成方法[j].计算机学报.2013,36(12),2429—2439)通过扑捉稀有数据,对穿越难以覆盖节点的稀有数据进行保护,并计算个体对目标路径测试数据生成中的贡献度,将贡献度与分支距离、层接近度相结合调整个体的适应值,该方法有效的提高了测试数据的生成效率。

但是上述方法适应值计算中,均考虑分支距离,分支距离的计算需要针对每一个简单谓词计算,假设一个目标路径有h个节点,每个节点中至少有一个简单谓词,那么分支距离运算需要计算h个,然后求和,如果每个节点都是复合谓词,则计算量成倍增长;当程序中存在flag现象(binkleyd.w.,harmanm.,lakhotiak..f1agremover:atestabilitytransformationfortransformingloopassignedflags[j].acmtransactionsonsoftwareengineeringandmethodology,2009,2(3):110-146.)时,适应值不能有效指导进化,从而变成随机搜索;更重要的是当某个节点谓词对应的分支距离较大,会造成对其他节点的分支距离被忽略不计的情况,这样极大影响了评价个体的真实效果。此外,适应值计算中同时考虑分支距离、层接近度或者个体贡献度将导致算法计算量大、时间消耗长。因此,上述方法无法实现快速高路径覆盖率测试用例的生成。

为此,本发明在测试数据生成中,通过统计测试数据进化生成中个体穿越分支节点的真假分支情况,提出了一种能够大大缩减测试用例生成时间、提高用例路径覆盖率的测试用例生成方法。



技术实现要素:

针对现有技术中存在的上述问题,本发明提供了一种快速、高路径覆盖率的测试用例生成方法。

具体而言,本发明提供了一种快速高路径覆盖率测试用例生成方法,其特征在于,所述方法包括下述步骤:

步骤(1)、获取目标程序的控制流图,所述控制流图包含一个惟一的入口节点s和出口节点e;

步骤(2)、基于控制流图确定控制流图中各个节点中的父亲-孩子关系;

步骤(3)、判断每个节点是否为分支节点,若不为分支节点,则不作处理,若为分支节点,则将该分支节点计入计算节点;

步骤(4)、获取测试用例集,将每个测试用例作为一个个体,多个个体形成种群,代入遗传算法;

步骤(5)、对于每个计算节点计算种群中所有个体穿越该计算节点的真分支的个体数目和假分支的个体数目,分别构建分支穿越矩阵;

步骤(6)、根据所构建的分支穿越矩阵计算当前代种群中穿越任意一个分支节点的分支偏离度;

步骤(7)、为被测目标程序选取一条目标路径,计算目标路径中所有分支节点的分支偏离度,并取所有分支节点的分支偏离度之和,作为当前代种群中个体穿越程序的程序偏离度;

步骤(8)、利用遗传算法,根据所构建的分支穿越矩阵以及程序偏离度进行迭代优化,调整测试用例,获取下一代种群以及下一代种群穿越被测程序的程序偏离度,重复该步骤,直到生成的测试用例覆盖所述目标路径或达到遗传算法最大进化代数。

优选地,所述方法还包括计算当前代种群中每个个体穿越被测程序目标路径的适应值以及删除特定个体后的适应值,基于删除特定个体前后的适应值变化确定当前个体遗传到下一代种群的概率,遗传算法基于该概率选择下一代初始种群,利用该初始种群进行交叉、变异,获得遗传算法的下一代种群。

优选地,所述方法还包括计算对于目标路径删除任意一个个体之前的被测程序偏离度以及删除任意一个个体之后的被测程序分支偏离度。

优选地,

通过下述公式计算针对目标路径的程序偏离度:

其中,

表示第t代种群中第k个分支节点的分支偏离度。

优选地,通过下述公式计算个体xw的适应值:

优选地,所述步骤(3)中将循环节点视为分支节点。

技术效果

本发明的测试用例生成方法能够大大缩减测试用例生成时间、提高用例的路径覆盖率。

附图说明

图1为本发明实施例1中采用的被测程序示例的程序源代码和控制流图。

图2为本发明实施例1中采用的被测程序示例的控制流图。

具体实施方式

下面结合附图对本发明的实施例进行详细描述。

基本概念

为了介绍方便,先给出几个与被测程序相关的基本概念.

(1)控制流图

控制流图是被测程序控制结构的图形表示,是一个有向图g(n,e,s,e),其中n称作图g的节点集合,与程序的某一条语句对应;e称作图g的边集合,(nodei,nodej)称为g的边,表示从语句nodei到语句nodej存在控制流.每个程序的控制流图还包含一个唯一的入口节点s和出口节点e,如图2是图1中三角形分类源程序所对应的控制流图.

控制流图中,出度大于1的节点,称为分支节点,以分支节点为起点的两条边为分支节点的真假分支.例如,图2中的节点node2即为分支节点,当node2的谓词(a>=b)为真时,执行node2的真分支b1,当该谓词为假时,执行node2的假分支b2.需要说明的是,根据z路径覆盖,循环结构按照执行循环体次数可以化成双分支选择结构,而switch语句本身可以表示成双分支选择结构,因此,本发明主要研究每个分支节点有两个分支的情况.

(2)单孩子节点

根据图2中被测程序的控制流图,可见节点间的父亲-孩子关系。当某个节点只有一个孩子时,在测试用例运行程序后,穿越该节点的用例数目与穿越其孩子的用例数目一定相等,也就是说,测试用例均衡的穿越了该父亲节点及其孩子。因此,为了降低本发明方法的计算代价,本发明中计算时直接舍弃了单孩子节点。

例如,图1中的节点n1,只有n2一个孩子节点,从中不难看出,穿越节点n1与穿越其孩子n2的用例一定均衡,所以在计算偏离度时,将不考虑有单个孩子的父节点。

(3)分支或循环节点

同样,根据控制流图,每个分支节点至少有两个孩子,即如果用next(ni)表示分支节点ni的孩子数目,可知next(ni)>1。需要说明的是,根据z路径覆盖,循环结构可以参照文章(夏辉,宋昕,王理.基于z路径覆盖的测试用例自动生成技术研究[j].现代电子技术.2006(6):92-94)化成双分支选择结构,所以循环节点也是分支节点,因此本发明后续内容中将分支节点与循环节点统称为分支节点,作为计算节点。超过两个孩子的分支节点的switch语句本身可以表示成双分支选择结构,进而,将目标路径转换成由单分支节点和双分支节点组成的路径。由于穿越分支节点的测试用例可能会不等的穿越其两个孩子,此时,要考虑穿越其各孩子的用例数,以判断测试用例穿越该节点各孩子的偏离度。如图2中的n2为分支节点,其两个孩子分别为n3与n4,此时,要统计穿越n3与n4的测试用例数目,以考察穿越n2的测试用例是否穿越其孩子n3与n4。

(4)分支偏离度

为了提高测试数据的生成速度,申请人引入了一个新的概念,分支偏离度,所有个体对应的数据运行程序后,穿越某分支节点真、假分支的个体数之差,即为该分支节点的分支偏离度.

(5)程序偏离度

程序中目标路径上分支节点的分支偏离度之和,即为程序偏离度.该值反映了所有个体穿越被测程序全部或部分分支的整体偏离情况。

3程序偏离度的计算

从图2的控制流图中可知,穿越顺序节点(单孩子节点)及其直接后继节点的用例数目一定相等,因此,为了降低计算代价,程序偏离度计算中不考虑单孩子节点。为了计算程序偏离度,首先建立个体穿越分支节点真假分支情况,得到个体穿越分支矩阵.

3.1建立个体穿越分支矩阵

记遗传算法种群规模为m(表示具有m个测试用例),被测程序包含n个分支节点,对于第t代种群,通过统计目标路径上分支节点nodej(j=1,2…,n)真分支被个体xi(i=1,2…,m)(每个个体代表一个测试用例)穿越的情况,得到个体穿越真分支矩阵,记cross(t),表示如下:

其中

矩阵中的行代表第t代种群中个体xi是否穿越目标路径上不同分支节点,矩阵的列代表不同个体是否穿越目标路径上的分支节点nodej.

按照同样的方法,通过统计分支节点nodej假分支被个体xi穿越的情况,可以得到个体穿越假分支矩阵,记为cross′(t),表示如下:

其中

以图1中的三角形分类程序为被测程序.假设种群规模m=4,选择目标路径为“s,1,2,3,4,5,6,7,8,10,11,12,17,e”,进化到第6代时,统计图2中目标路径上分支节点node2、node4、node6、node8、node10、node11的6个真分支b1~b6被个体穿越的情况,得到个体穿越真分支矩阵cross(6):

同样,通过统计6个分支节点的假分支b′1~b′6被个体穿越情况,得到个体穿越假分支矩阵cross′(6):

3.2计算程序偏离度

当所有个体对应数据运行程序后,程序的偏离度计算方法为:根据个体穿越分支矩阵,统计穿越各分支节点真假分支的个体数目,计算出目标路径上各分支节点的分支偏离度,将所有分支偏离度之和作为程序偏离度。

3.2.1计算分支偏离度

根据3.1中建立的个体穿越真分支矩阵cross(t),计算第t代种群中穿越第k(k=1,2…,n)个分支节点真分支的个体数目,记为numkt(t),容易得到:

同样,根据3.1中个体穿越假分支矩阵cross′(t),得到穿越第k个分支节点假分支的个体数目,记为numkf(t),则:

根据式(1)和式(2),可以将第k个分支节点的分支偏离度(branchbalance)表示为bbk(t):

由式(3)可知,所定义的分支偏离度实际上反应了穿越第k个分支节点的所有个体穿越其真假分支的均衡程度。分支偏离度bbk(t)的值越小越好.

3.2.2计算程序偏离度

根据式(3),计算程序中所有分支节点的分支偏离度,并取所有分支节点的分支偏离度之和,作为第t代种群中个体穿越程序的程序偏离度(programbalance),记为pb(t),如式(4)所示.根据分支偏离度的定义可知,程序偏离度越小越好,其值越小反映出所有个体对应数据运行被测程序后,被测程序的分支偏离度越小.

仍以图1中的三角形分类程序为例。根据第6代个体穿越真分支矩阵cross(6),以及穿越分支节点真分支的个体数目计算公式(详见式(1)),将矩阵cross(6)的第一列作和,可以得到穿越第一个分支节点node2真分支的个体数目根据第6代个体穿越假分支矩阵cross′(6),以及穿越分支节点假分支的个体数目计算公式(详见式(2)),将矩阵cross′(6)的第一列作和,得到穿越第一个分支节点node2假分支的个体数目依此类推,可以得到穿越三角形分类程序分支节点node4、node6、node8、node10、node11真假分支的个体数目,见表1,进一步根据式(3)计算出第1个分支节点node2的分支偏离度:bb1(6)=|num1t(6)-num1f(6)|/(num1t(6)+num1f(6))=|3-1|/(3+1)=0.5,按照相同方法,计算出其他分支节点的分支偏离度,如表1所示.

表1分支偏离度的计算

最后,根据程序偏离度的计算方法(详见式(4)),得到程序偏离度:

4.测试用例进化生成

为了得到某个体是否能改善程序测试过程,实现方法为:将某个个体删除后,重新计算第k个分支节点的分支偏离度,以及被测程序的程序偏离度,根据删除个体前后程序偏离度的变化情况计算个体对程序路径覆盖率的影响.

4.1删除个体后程序偏离度的计算

根据3.1中的个体穿越真分支矩阵cross(t)与3.2中穿越分支节点真分支的个体数目计算公式(详见式(1)),将删除个体xw(1≤w≤m)后穿越第k个分支节点真分支的个体数目num′kt(xw,t)表示为:

由式(5)可知,如果删除矩阵cross(t)的第w行,再重新计算穿越第k个分支节点真分支的个体数目,即得到num′kt(xw,t).也就是说num′kt(xw,t)计算过程中,不考虑个体xw穿越第k个分支节点的真分支情况.

同理,根据3.1中的个体穿越假分支矩阵cross′(t)与3.2中穿越分支节点假分支的个体数目计算公式(详见式(2)),删除个体xw后,穿越第k个分支节点的假分支个体数目num′kf(xw,t)表示为:

进一步根据式(5)与式(6),将删除个体xw后第k个分支节点的分支偏离度bb′k(xw,t)表示为:

从而计算出删除个体xw后第k个分支节点的程序偏离度,记为pb′(xw,t),则pb′(xw,t)可以表示为:

4.2个体适应值的计算

一般来说,遗传算法会将当前种群中适应值较高的个体按照某种规则遗传到下一代群体中,也就是说,适应值较高的个体将以相对大的概率复制到下一代.本发明个体适应值计算过程中,需要考虑到第t代种群中个体对应数据运行程序后得到的程序偏离度与删除个体xw后得到的程序偏离度间的大小关系,得到个体对程序偏离度的影响,即为个体xw的适应值f(xw,t),可以表示为:

由式(9)可知,本发明在计算个体适应值时,考虑删除个体xw前后程序偏离度的变化情况.如果个体xw的删除使程序偏离度增大,即pb′(xw,t)>pb(t),说明个体xw的存在能有效减小偏离度,则在进化过程中提高个体xw的适应值,优先保留这样的个体,若同时有多个个体能减小偏离度,式(9)保证了个体对程序偏离度降低程度越大,个体的适应值就越高.反之,如果个体xw的删除使程序偏离度不变或者减小,即pb′(xw,t)≤pb(t),说明个体xw不能减小偏离度,此时要将这样的个体淘汰,通过降低个体xw的适应值,将其设为0;

仍以三角形分类程序为例进行说明.根据3.1中的个体穿越真假分支矩阵cross(t)、cross′(t)与3.2中穿越分支节点真假分支的个体数目计算公式(详见式(1)、(2)),运行到第6代,当删除个体x1时,删除矩阵cross(6)中第1行的值,将cross(6)中第一列剩余元素作和,得到删除个体x1后穿越第一个分支节点node2真分支的个体数目同理,得到穿越其他分支节点真分支的个体数目;按照同样的方式,根据cross′(6),得到同理计算出穿越其他分支节点真假分支的个体数目.从而计算删除个体x1后第一个分支节点node2的分支偏离度bb′1(x1,6)=|num′1t(x1,6)-num′1f(x1,6)|/(num′1t(x1,6)+num′1f(x1,6))=|3-0|/(3+0)=1,同理计算出其他节点的分支偏离度,穿越分支节点真假分支个体数目及分支偏离度如表2所示.根据表2,进一步计算出删除个体x1后的程序偏离度按照同样的方法,可以计算出删除其他个体的程序偏离度:pb′(x2,6)≈2.33,pb′(x3,6)≈2.33,pb′(x4,6)≈3.67.

表2删除个体x1后分支偏离度的计算

根据3中未删除个体前计算的程序偏离度pb(6)≈3.33,以及删除个体x1后程序偏离度pb′(x1,6)≈3.99,由于pb′(x1,6)>pb(6),由式(9)计算出个体x1的适应值f(x1,6)=pb′(x1,6)-pb(6)≈0.66,同理,得到f(xi,6)≈0(i=2,3),f(x4,6)≈0.32.根据f(x1,6)>f(xi,6)(i=2,3,4),说明个体x1能最大程度减小原有的偏离度;而f(x1,6)与f(x4,6)均大于0,说明个体x1与个体x4均能有效减小程序被覆盖的偏离度,这两个个体在进化中将有较大几率被保留;个体x2与个体x3的适应值为0,进化过程中将会被淘汰.可以看出,本发明提出的方法能将不同个体对程序偏离度的影响得到有效的区分.

4.3测试用例进化生成步骤

(1)确定被测程序的一条目标路径,插桩被测程序,并对遗传算法的控制参数赋值,设定实验次数、每次实验最大进化代数、交叉算子、变异算子、种群规模、测试用例范围;

(2)获取测试用例集,将每个测试用例作为一个个体,多个个体形成种群,代入遗传算法;

(3)分别将每个进化个体作为输入数据运行被测程序;

(4)判断是否有个体穿越路径与目标路径完全相同或者算法达到事先设定的最大进化代数,若满足二者之一,则停止种群的进化,并转至步骤7;

(5)计算进化个体的适应值;

(6)对种群依次实施选择、交叉以及变异操作,生成子代种群,并转至步骤3;

(7)停止种群的进化过程,保存进化个体,输出穿越目标路径的测试用例.

5.实验

现有技术中虽然也存在一些测试用例生成方法,但是现有技术中的方法都无法达到本发明的效果。

比如,下述文献中给出了一些方法,并且,本发明采用相似程序对现有方法与本发明方法进行了详细对比。

[1]mcminnp.evolutionarysearchfortestdatainthepresenceofstatebehaviour[d].universityofsheffield,england,2005[2]张岩,巩敦卫基于稀有数据扑捉的路径覆盖测试数据进化生成方法[j].计算机学报.2013,36(12),2429-2439

[3]夏辉,宋昕,王理基于z路径覆盖的测试用例自动生成技术研究[j].现代电子技术.2006(6):92-94

为了验证本发明方法的有效性,被测程序选择了1个基准程序和5个工业用例,均为c语言程序,仿真环境为vc++6.0.为了验证本发明方法的性能,每组实验结果都与同类方法的结果进行比较分析,选择的对比方法包括:文献[1]所述方法,采用分支距离与层接近度相结合作为适应值函数;文献[2]所述方法,通过对稀有数据进行扑捉,对穿越难以覆盖节点的稀有数据进行保护,并计算个体对目标路径测试用例生成中的贡献度,该方法中适应值函数的计算是在原有分支距离与层接近度相结合基础上,增加了个体贡献度.并且文献[1]采用遗传算法进化生成测试用例,与其对比,以验证本发明方法生成测试用例的效率.实验中三种方法采用相同的实验参数、种群规模与初始种群,本发明方法和对比方法使用的遗传算法控制参数也相同,个体均采用二进制编码,采用轮盘赌选择、单点交叉、单点变异,交叉和变异概率分别设定为0.9和0.3,比较三种方法找到覆盖目标路径测试用例的平均评价次数、平均运行时间和成功率.

5.1基准程序实验

选择三角形分类程序作为实验程序.为确保实验条件基本相同,15次,目标路径选择难度较大的等边三角形路径,“s,1,2,3,4,5,6,7,8,10,11,12,17,e”,实验设置中包含六种情况,不同情况选择不同的数据范围、种群规模和最大终止代数,实验设置及结果如表3所列,平均评价次数越少,说明算法性能越好,成功率指在最大运行代数之内成功生成测试用例的实验次数与实验总数(即15次)的比值.

表3三角形分类程序实验结果

从表3可以见:

(1)从评价次数上看,当数据范围较小在[1,128]时,文献[2]的平均评价次数是2130.0,本发明为1993.3,约是本发明的1.1倍,文献[1]的平均评价次数是54443.33,约是本发明的27.3倍,当数据范围较大在[1,1024]时,文献[2]的平均评价次数约是本发明的8.1倍,文献[1]的平均评价次数约是本发明的161.5倍.针对六种实验情况,本发明方法评价次数均明显少于其他两种方法.这说明与同类方法相比,本发明能用更少的评价次数成功的生成测试用例,且随着数据范围、种群规模与最大进化代数的增加,本发明的优势更加明显.

(2)从运行时间上看,对于不同的数据范围,本发明方法所需要的运行时间都比其他两种方法少,且随着数据范围的增大,这种趋势更加明显,如当数据范围在[1,4096]时,文献[4]的平均运行时间是0.5619s,本发明为0.0787s,约是本发明的7倍,文献[1]的平均运行时间是21.2714s,约是本发明的270倍,这充分说明了本发明方法生成测试用例的时间明显比其它两种方法要少.这是因为文献[1]在计算适应值时,考虑层接近度与分支距离,文献[4]在文献[1]的基础上,增加了个体贡献度,本发明方法则仅需计算个体穿越程序真假分支情况,得到个体对程序偏离度的影响,因此算法运行的时间更少.

(3)从成功率上看,在不同的数据范围、种群规模与最大进化代数情况下,本发明方法的成功率均能达到100%,这充分说明本发明方法生成测试用例的有效性.

5.2工业用例实验

为了验证本发明提出的方法在工业用例上的有效性,选择五个工业用例进行实验,每个程序随机选择一条可行路径作为目标路径,程序描述及其它参数设置(参见现有技术23)如表4所列,其中节点数表示选择目标路径的节点数,实验中设定每种方法分别独立运行50次,分析评价次数平均值、运行时间平均值以及生成测试用例的成功率.实验结果见表5.

表4工业用例参数设置

由表5可知:从评价次数来看,在工业用例实验中,本发明方法的平均评价次数比同类方法次数要少;例如,对于较复杂的工业用例flex,本发明方法的评价次数为1965700.4,文献[4]的评价次数为6967436.7,文献[1]为13747252.2,本发明方法的评价次数比同类方法要少,这是因为在种群规模一定的情况下,应用本发明方法需要更少的运行代数来进化生成满足目标路径测试用例;从运行时间的平均值来看,对于选择的所有工业用例,本发明方法所用的时间明显少于文献[1]与文献[3]所提出方法,例如,对于复杂用例flex,本发明方法的运行时间是97.3572s,文献[2]中方法为169.3522,比本发明运行时间多71.995s,文献[1]运行时间平均值为354.8913,比本发明运行时间多257.5341s;从成功率来看,本发明方法更具有优势,例如,对于用例对于所有用例,应用本发明方法均能生成满足目标路径的测试用例.基准程序和工业用例replace、sed、flex程序,本发明方法与文献[3]中方法均能生成目标路径的测试用例,成功率均为100%,而文献[1]中方法的成功率分别为63%、50%与38%.实验结果充分验证了本发明方法生成目标路径测试用例的有效性,并且验证了本发明方法能够提高测试用例的生成效率.

表5工业用例实验结果

综上所述,本发明提出了一种快速高路径覆盖率的测试用例进化生成方法。在种群中个体对应的数据运行被测程序后,统计穿越程序中各分支的测试用例数目,并据此设计种群中个体对程序偏离度影响程度相关的适应值函数,保证对程序偏离度影响小的个体具有更好的适应值,有效提高了测试用例的生成效率。实验结果表明,与同类方法相比,本发明方法生成测试用例的成功率高,耗时少.本发明主要是用于单路径测试用例的进化生成。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1