基于程序控制依赖引导的回归测试案例生成方法

文档序号:6508097阅读:241来源:国知局
基于程序控制依赖引导的回归测试案例生成方法
【专利摘要】本发明提出一种基于程序控制依赖引导的回归测试案例生成方法,可以自动生成对程序修改部分进行有效测试的测试案例。该方法以发生修改的程序代码为测试目标,通过分析程序的控制流和信息流,建立程序控制依赖图;计算各个分支语句到达测试目标代码的概率(到达概率),引导符号执行生成可以保证目标代码被执行的测试案例;计算所有分支语句的可能使得目标代码执行结果无法传播到输出的概率(阻断概率),引导符号执行生成可以保证目标代码执行结果影响输出的测试案例。相比现有回归测试方法,本方法可以保证测试案例的有效性,同时显著提高测试案例生成的效率。
【专利说明】基于程序控制依赖引导的回归测试案例生成方法
【技术领域】
[0001]本发明涉及可信软件及软件测试领域,特别涉及回归测试案例生成方法。
【背景技术】
[0002]软件回归测试是指软件代码修改后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。对软件的有效修改需要满足两个条件:1)程序的修改符合预期行为,即能够将待修改的部分修改正确;2)程序的修改不会影响其它非预期的行为发生变化,即修改部分不会影响其它不需要修改的程序行为。回归测试是保证软件修改符合预期的重要手段,如何高效地进行回归测试也是软件测试中的重要问题。现有思路主要分为以下两种:1)连续测试,利用已有的测试案例对演化的程序进行重新测试,此方法存在的主要问题是效率低,其绝大部分测试案例对被修改程序来说都是无效的测试案例。2)针对程序修改部分增量生成新的测试案例,其难点是如何高效地自动生成符合期望的测试案例。
[0003]为解决连续测试效率低下的问题,研究人员提出了两种改进方法,测试案例选择和测试案例排序。这两种方法都是通过分析测试案例和演化程序的关系来选择出最合适的测试案例。虽然测试案例选择和测试案例排序解决了连续测试的效率低下问题,但是没有解决连续测试的有效性问题,因为已有的测试案例在创建时并不会考虑到将来程序的变化,所以有可能这些测试案例都不能覆盖被修改的程序部分。
[0004]为解决测试案例集覆盖率低下的问题,目前研究的热点是将程序抽象为形式化模型,采用测试案例自动生成算法对形式化模型中的各种信息进行提取、生成一个完备的测试案例集。其中最常用的方法是符号执行,符号执行是20世纪70年代提出的一种程序验证方法,是一种基于符号化的模型检验方法。广泛用于符号调试,测试案例生成等。其核心思想是使用符号值代替具体的变量输入,并使用符号表达式来表示程序中各变量的值。最终,程序的输出值被转化为一个以符号值作为输入的函数。符号执行将程序抽象为符号执行树,其中顺序语句对应着树的计算节点,分支语句对应着分支节点,而对于循环语句,将其按循环次数展开为语义上等价的分支语句。一般,一条循环语句对应一组分支节点。可以认为,在符号执行过程中,程序只有顺序和分支两种结构。
[0005]符号执行的过程本质上是路径条件的构造过程。路径条件指的是对于执行该路径的测试案例,程序输入值所需要满足的数学约束条件。因而一个路径条件唯一地对应一条执行路径。一个路径条件由一组子条件(sub-condition)组成,每一个被执行分支的条件作为一个子条件。在初始时路径条件为true,在探索程序的过程中,每遇到一个分支语句,就更新路径条件,将被执行分支的条件加入到路径条件中,公式为PC=PCTnewsub-condition。由于每一个分支语句都对应着true和false两个分支,而符号执行基于静态分析,变量没有具体的数值,因而无法确定执行哪一条分支。所以对两条分支都进行探索(搜索顺序可按需定义,深度优先,广度优先等),即分别以两个分支的条件作为子条件来更新路径条件。这样就得到了两个新的路径条件,对应两条不同的执行路径。之后,继续对这两条路径分别进行探索。符号执行实现了对程序的全路径探索。当程序探索结束时就得到了被测程序所有执行路径的路径条件。最后,检查所有得到的路径条件,如果路径条件是无法被满足的,则说明该路径是一条不可执行路径,如果路径条件可以被满足,则说明该路径是一条可执行路径。将路径条件输入约束求解器即可解出对应的测试案例。
[0006]符号执行存在两个阻碍,使得其难以大规模使用。I)符号执行是一种基于搜索的遍历算法,需要对程序的所有分支进行遍历,虽然可以通过一些附加的剪枝条件进行优化,但其算法的复杂度非常高,为O (2η),其中η为被测程序中条件语句(包括分支,循环,逻辑运算)的数目;2)符号执行不能很好地解决测试案例集更新的问题,每次代码进行修改后,只能重新遍历一次符号执行树来生成一个新的测试案例集。由前面的分析可知,重新生成一个测试案例集的时间开销比较大,而且一个软件可能会频繁变更,如果每次变更之后都通过符号执行生成一个新的测试案例集,测试的效率就会受到影响。

【发明内容】

[0007]本发明的目的在于提供一种基于程序控制依赖引导的回归测试案例生成方法,以提高测试效率。
[0008]为了实现上述目的,本发明采用如下技术方案:
[0009]基于程序控制依赖引导的回归测试案例生成方法,包括如下步骤:
[0010]S101)、利用程序静态分析方法,分析测试程序的控制流和信息流,建立测试程序的控制依赖图;
[0011]S102)、针对输入的测试程序的目标代码,根据步骤S101)中建立的控制依赖图中计算各个分支的到达概率;
[0012]S103)、采用基于分支到达概率引导的约束生成算法,迭代搜索和取反测试案例执行路径上到达概率最大的分支条件,生成新的约束,利用符号执行方法进行求解,若可以生成一个执行目标代码的测试案例,转入步骤S104);若无法生成测试案例可以执行目标代码,则表示测试目标代码在程序中不会被执行,转入步骤S107);
[0013]S104)、针对测试程序的目标代码,根据程序信息流,检测各个分支语句是否阻断目标代码执行结果对程序输出的影响,若改变则标记为阻断分支;然后,计算各个分支的阻断概率;
[0014]S105)、采用基于分支阻断概率引导的约束生成算法,迭代搜索和取反测试案例执行路径上阻断概率最小的分支条件,生成新的约束,利用符号执行方法进行求解,若可以生成一个测试案例保证目标代码执行结果影响输出,转入步骤S106);若无法生成测试案例,转入步骤S103);
[0015]S106)输出有效测试案例,流程结束;所述有效测试案例是指该测试案例可以保证测试目标代码被执行,且执行结果影响程序输出结果;
[0016]S107)针对输出测试程序和测试目标代码,无法生成有效测试案例。
[0017]本发明进一步的改进在于:步骤S103)中所述分支到达概率为:对于某一个分支,从该分支到目标代码,所需要经过的最少依赖分支数目的倒数。
[0018]本发明进一步的改进在于:步骤S103)中所述基于分支到达概率引导的约束生成算法具体包括:
[0019]S1031)、执行测试案例,第一次执行初始测试案例;从第二次开始执行上一周期步骤S10310)生成的测试案例;
[0020]S1032)、检查目标代码是否被执行;如果测试案例能执行到期望执行的目标代码,则转至步骤S10312);如果测试案例不能执行到目标代码,则转至步骤S1033);
[0021]S1033)、检查执行路径上是否有可取反的分支,如果有,则转至步骤S1034);如果没有,则转至步骤S1035);
[0022]S1034)、取反所有可取反的分支来生成一系列待扩展路径片段,并将待扩展路径片段最后一个分支的分支到达概率值作为该路径片段能覆盖目标代码的概率,存入第一未探测集合中;
[0023]S1035)、未探测集合是否为空,若为空,转至步骤S10311),若不为空,转至步骤S10316);
[0024]S1036)、从第一未探测集合中选择一条概率最大的待扩展路径片段,基于此路径片段进行符号执行;
[0025]S1037)、符号执彳了该路径片段,并记录路径约束Cnew ;
[0026]S1038)、利用约束求解器求解Cnew,若可解,则转至步骤S10310);若不可解,则转至步骤S1039);
[0027]S1039)、废弃该路径片段,同时跳转至步骤S1033);
[0028]S10310)、生成新的测试案例Tnew,然后跳转至步骤S1031);
[0029]S10311)、无有效测试案例输出;
[0030]S10312)、输出该能执行到期望执行的目标代码的有效测试案例。
[0031]本发明进一步的改进在于:步骤S104)中所述阻断分支为目标代码执行后,导致目标代码执行结果无法传递到输出语句的分支。
[0032]本发明进一步的改进在于:步骤S104)中所述分支阻断概率为:对于在目标代码之后执行的某一个分支,执行该分支后将会执行阻断分支的概率;取值范围为0%-100%。
[0033]本发明进一步的改进在于:分支阻断概率的计算公式为:
[0034]BP=1- Nb/Np
[0035]其中分支阻断概率的计算方法包括:首先将待测程序的所有分支分为Ep,Eb两个集合,Ep为所有分支的集合,Eb为阻断分支的集合;对于某一个分支,从两个集合中选择子集Ep’,Eb’,分别表示在该分支之后执行的所有分支和所有阻断分支,然后基于Ep’,Eb’构建可能的执行路径;Np为基于Ep’构建的路径数,Nb为基于Eb’构建的路径数;得到Nb,Np后代入公式即可得到某一分支的分支阻断概率值BP。
[0036]本发明进一步的改进在于:步骤S105)中所述基于分支阻断概率引导的约束生成算法包括:
[0037]S1051)、执行测试案例;第一次执行步骤S103)的步骤S10312)生成的有效测试案例,从第二次开始执行上一周期步骤S10510)生成的测试案例;
[0038]S1052)、检查目标代码执行结果是否传递到输出语句:如果目标代码执行结果传递到了输出语句,则转至步骤S10512);否则,则转至步骤S1053);
[0039]S1053)、检查执行路径上是否有可取反的分支,如果有,则转至步骤S1054);如果没有,则转至步骤S1055);
[0040]S1054)、取反所有可取反的分支来生成一系列待扩展路径片段,并将待扩展路径片段最后一个分支的分支阻断概率值作为该路径片段将执行阻断分支的概率值,存入第二未探测集合中;
[0041]S1055)、第二未探测集合是否为空,若为空,转至步骤S10511 ;若不为空,转至步骤 S1056);
[0042]S1056)、从第二未探测集合中选择一条阻断概率最小的待扩展路径片段,基于此路径片段进行符号执行;
[0043]S1057)、符号执行该路径片段,并记录路径约束Cnew ;
[0044]S1058)、利用约束求解器求解Cnew,若可解,则转至步骤S10510);若不可解,则转至步骤S1059);
[0045]S1059)、废弃该路径片段,跳转至步骤S1053);
[0046]S10510)、生成新的测试案例Tnew,然后跳转至步骤S1051);
[0047]S10511)、无有效测试案例输出;
[0048]S10512)输出该能执行到期望执行的目标代码,且执行结果影响程序输出结果的有效测试案例。
[0049]相对于现有技术,本发明具有以下有益效果:本发明提出一种基于程序控制依赖引导的回归测试案例生成方法,该方法以发生修改的程序代码为测试目标,通过分析程序的控制流和信息流,建立程序控制依赖图;计算各个分支语句到达测试目标代码的概率(到达概率),引导符号执行生成可以保证目标代码被执行的测试案例;计算所有分支语句的可能使得目标代码执行结果无法传播到输出的概率(阻断概率),引导符号执行生成可以保证目标代码执行结果影响输出的测试案例;本发明方法可以自动生成对程序修改部分进行有效测试的测试案例;相比现有回归测试方法,本方法可以保证测试案例的有效性,同时显著提高测试案例生成的效率。
【专利附图】

【附图说明】
[0050]图1为本发明方法的整体流程图;
[0051]图2为测试目标代码到达的测试案例生成流程图;
[0052]图3为测试目标执行影响输出的测试案例生成流程图;
[0053]图4为示例待测试程序图;
[0054]图5为示例程序的控制依赖图。
【具体实施方式】
[0055]以下结合附图和实例详细说明本发明的实施方式。待测程序如图4所示,对于执行路径,我们以路径上经过的分支语句来表示。假设某一执行路径经过了 2F,3T这两个分支语句,则其表示为[2F,3T]。
[0056]步骤SlOl:基于静态分析方法分析测试程序的控制流和信息流,生成测试程序的控制依赖图,控制依赖图如图5所示,目标代码为第19行;
[0057]步骤S102:针对输入的测试程序的目标代码,在步骤SlOl中建立的控制依赖图中
计算各个分支的到达概率;结果如下表所示。
[0058]
【权利要求】
1.基于程序控制依赖引导的回归测试案例生成方法,其特征在于,包括如下步骤: 5101)、利用程序静态分析方法,分析测试程序的控制流和信息流,建立测试程序的控制依赖图; 5102)、针对输入的测试程序的目标代码,根据步骤S101)中建立的控制依赖图中计算各个分支的到达概率; 5103)、采用基于分支到达概率引导的约束生成算法,迭代搜索和取反测试案例执行路径上到达概率最大的分支条件,生成新的约束,利用符号执行方法进行求解,若可以生成一个执行目标代码的测试案例,转入步骤S104);若无法生成测试案例可以执行目标代码,则表示测试目标代码在程序中不会被执行,转入步骤S107); 5104)、针对测试程序的目标代码,根据程序信息流,检测各个分支语句是否阻断目标代码执行结果对程序输出的影响,若改变则标记为阻断分支;然后,计算各个分支的阻断概率; 5105)、采用基于分支阻断概率引导的约束生成算法,迭代搜索和取反测试案例执行路径上阻断概率最小的分支条件,生成新的约束,利用符号执行方法进行求解,若可以生成一个测试案例保证目标代码执行结果影响输出,转入步骤S106);若无法生成测试案例,转入步骤S103); 5106)输出有效测试案例,流程结束;所述有效测试案例是指该测试案例可以保证测试目标代码被执行,且执行结果影响程序输出结果; 5107)针对输出测试程序和测 试目标代码,无法生成有效测试案例。
2.根据权利要求1所述方法,其特征在于,步骤S103)中所述分支到达概率为:对于某一个分支,从该分支到目标代码,所需要经过的最少依赖分支数目的倒数。
3.根据权利要求1所述方法,其特征在于,步骤S103)中所述基于分支到达概率引导的约束生成算法具体包括: 51031)、执行测试案例,第一次执行初始测试案例;从第二次开始执行上一周期步骤S10310)生成的测试案例; 51032)、检查目标代码是否被执行;如果测试案例能执行到期望执行的目标代码,则转至步骤S10312);如果测试案例不能执行到目标代码,则转至步骤S1033); 51033)、检查执行路径上是否有可取反的分支,如果有,则转至步骤S1034);如果没有,则转至步骤S1035); 51034)、取反所有可取反的分支来生成一系列待扩展路径片段,并将待扩展路径片段最后一个分支的分支到达概率值作为该路径片段能覆盖目标代码的概率,存入第一未探测集合中; 51035)、未探测集合是否为空,若为空,转至步骤S10311),若不为空,转至步骤S10316); 51036)、从第一未探测集合中选择一条概率最大的待扩展路径片段,基于此路径片段进行符号执行; 51037)、符号执行该路径片段,并记录路径约束Cnew; 51038)、利用约束求解器求解Cnew,若可解,则转至步骤S10310);若不可解,则转至步骤 S1039);S1039)、废弃该路径片段,同时跳转至步骤S1033); 510310)、生成新的测试案例Tnew,然后跳转至步骤S1031); 510311)、无有效测试案例输出; 510312)、输出该能执行到期望执行的目标代码的有效测试案例。
4.根据权利要求1所述方法,其特征在于,步骤S104)中所述阻断分支为目标代码执行后,导致目标代码执行结果无法传递到输出语句的分支。
5.根据权利要求1所述方法,其特征在于,步骤S104)中所述分支阻断概率为:对于在目标代码之后执行的某一个分支,执行该分支后将会执行阻断分支的概率;取值范围为0%-100%。
6.根据权利要求1或5所述方法,其特征在于,分支阻断概率的计算公式为:
BP=1- Nb/Np 其中分支阻断概率的计算方法包括:首先将待测程序的所有分支分为Ep,Eb两个集合,Ep为所有分支的集合,Eb为阻断分支的集合;对于某一个分支,从两个集合中选择子集Ep’,Eb’,分别表示在该分支之后执行的所有分支和所有阻断分支,然后基于Ep’,Eb’构建可能的执行路径;Np为基于Ep’构建的路径数,Nb为基于Eb’构建的路径数;得到Nb,Np后代入公式即可得到某一分支的分支阻断概率值BP。
7.根据权利要求1所述方法,其特征在于,步骤S105)中所述基于分支阻断概率引导的约束生成算法包括: 51051)、执行测试案例;第一次执行步骤S103)的步骤S10312)生成的有效测试案例,从第二次开始执行上一周期步骤S10510)生成的测试案例; 51052)、检查目标代码执行结果是否传递到输出语句:如果目标代码执行结果传递到了输出语句,则转至步骤S10512);否则,则转至步骤S1053); 51053)、检查执行路径上是否有可取反的分支,如果有,则转至步骤S1054);如果没有,则转至步骤S1055); 51054)、取反所有可取反的分支来生成一系列待扩展路径片段,并将待扩展路径片段最后一个分支的分支阻断概率值作为该路径片段将执行阻断分支的概率值,存入第二未探测集合中; 51055)、第二未探测集合是否为空,若为空,转至步骤S10511;若不为空,转至步骤S1056); 51056)、从第二未探测集合中选择一条阻断概率最小的待扩展路径片段,基于此路径片段进行符号执行; 51057)、符号执行该路径片段,并记录路径约束Cnew; 51058)、利用约束求解器求解Cnew,若可解,则转至步骤S10510);若不可解,则转至步骤 S1059); 51059)、废弃该路径片段,跳转至步骤S1053); 510510)、生成新的测试案例Tnew,然后跳转至步骤S1051); 510511)、无有效测试案例输出; 510512)输出该能执行到期望执行的目标代码,且执行结果影响程序输出结果的有效测试案例。
【文档编号】G06F11/36GK103455421SQ201310362303
【公开日】2013年12月18日 申请日期:2013年8月19日 优先权日:2013年8月19日
【发明者】郑庆华, 刘烃, 王海军, 俞乐晨, 黄小龙 申请人:西安交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1