基于控制流图的单元回归测试用例集合优化方法

文档序号:6380154阅读:265来源:国知局
专利名称:基于控制流图的单元回归测试用例集合优化方法
技术领域
本发明涉及软件测试技术,尤其涉及一种基于控制流图的单元回归测试用例集合优化方法,属于控制流图对比技术在回归测试中的应用。
背景技术
当开发人员在单元测试过程中发现软件故障时,会对代码进行相应的修改。被测单元在改动之后,需要重新测试以保证所做的修改达到了预期的目的,并且没有引入新的缺陷,这个过程叫做回归测试。回归测试作为单元测试周期中的一个组成部分,在整个测试过程中占有很大比重,其成本甚至达到了整个测试成本的一半以上。因此,通过选择正确的回归测试策略来改进回归测试的有效性和效率是非常有意义的。
提高回归测试效率的重心是构造精简而有效的测试用例集合。如果简单地重测所有用例将会带来大量不必要的开销;而部分测试用例又会因为软件不断更新而失效。因此,回归测试只需要根据修改情况进行有选择性的测试,并根据测试目标考虑补充新的测试用例。现有的回归测试策略主要分为三类对基线测试用例库的约简,测试用例优先级技术以及测试用例的选择性复用。其中,测试用例库约简技术是通过删除所有冗余测试用例得到测试用例集合的最小约简子集。而测试用例优先级技术是根据测试用例对测试目标的贡献程度进行比较和排序,优先执行相对重要的测试用例。虽然测试用例库约简技术和测试用例优先级技术的测试效率较高,但是由于缺乏选择的针对性,其发现程序错误的能力相比于原有测试用例集可能会有很大的损失,即这种通过减少测试用例来节省测试精力的策略,在降低成本的同时也增加了测试风险。所述的测试用例的选择性复用是围绕某种准则从基线测试用例库中选择测试用例,目前最常见的选择准则是程序修改点与测试用例的相关性。这种方法能够保证选择出的测试用例精度高、针对性强,在测试过程中使用这样的测试用例集合可以同时保证回归测试的高效性与有效性。

发明内容
有鉴于此,本发明的主要目的在于提供一种基于控制流图的单元回归测试用例集合优化方法,根据代码中被修改部分筛选和新增测试用例,从而构造出回归测试用例集合,以提高回归测试的效率,并保证回归测试的有效性与充分性。为达到上述目的,本发明的技术方案是这样实现的
基于控制流图的单元回归测试用例集合优化方法,该方法包括
A、对比被测单元修改前后的控制流图,找出代码中被修改的部分所对应的节点,所述节点简称修改点;
B、从单元测试用例集合中筛选出执行路径经过修改点的测试用例,作为回归测试用例集合的一部分,记作选择测试用例集Tselected,并运行集合中的所有测试用例;
C、计算修改点的所有可达后继节点,从中选出在步骤B的运行过程中未被覆盖的节点子集
D、若节点子集#为空,则执行步骤F,否则执行步骤E;
E、从节点子集#中取出一个节点作为覆盖目标生成测试用例,将其加入到新增测试用例集合Tnew并运 行;待运行完毕后,更新节点子集见从中删除在此次运行中已被覆盖的节点,然后执行步骤D ;
F、回归测试用例集合Tk构造完毕,Tr
Tselected ^ ^new0其中,所述步骤A中根据对比控制流图的方法找出修改点的具体过程为
Al、在代码被修改前,将其对应的控制流图备份,记为CFGl ;代码被修改后,对被测单元重新进行静态分析,生成控制流图,记为CFG2 ;控制流图的节点包含对应的抽象语法树
信息;
A2、使用深度优先搜索算法同时遍历控制流图CFGl和CFG2 ;在遍历过程中成对地对比当前遍历到的控制流图节点;若其包含的抽象语法树信息不同,则把它当作修改点,加入到修改点集合当中。其中,步骤A2中使用深度优先搜索算法同时遍历控制流图CFGl和CFG2,对比当前节点对的抽象语法树信息;同时还考虑节点的增加和删减情况,并作了相应处理;其具体过程如下
A21、根据控制流图产生时的节点序号顺序,分别取CFGl和CFG2的未访问过的后继节点作为当前节点对,并取当前节点对中CFG2的节点作为当前节点;
A22、若当前节点对为空,当父节点是函数入口节点时,遍历结束,否则回退到当前节点对的父节点,执行步骤A21 ;
A23、若当前节点对中的两个节点都不为空,则比较当前节点对中每个节点包含的抽象语法树信息,即对应的表达式中的常量、变量、运算符信息,若这些信息都相同则执行步骤A21 ;若不同,则执行步骤A24;
A24、将当前节点作为修改点,加入到修改点集合当中;如果当前节点对中CFGl的节点为空,CFG2的节点不为空,则说明CFG2的节点是修改后新增的,此时将CFG2非空节点的父节点作为修改点,加入到修改点集合当中;如果CFGl的节点不为空而CFG2的节点为空,则说明CFGl中对应的代码已被删除,把CFGl中被删除的节点作为修改点,加入到修改点集合中。步骤B中在单元测试过程中使用的测试用例,均以控制流图节点标号的形式将执行路径记录于数据库中;遍历测试用例数据库中的每个测试用例,若其执行路径的标号序列中包含了修改点集合中任一修改点的标号,则被选择为回归测试用例,加入到选择测试用例集
Tselected 并执行。步骤C中,从覆盖率角度考虑为回归测试添加新的测试用例;具体为首先,计算出修改点在控制流图中的所有可达后继节点;然后,从此节点集合中选出在步骤B的运行过程中没有被覆盖到的节点,作为需要在回归测试中被覆盖的目标节点集合見步骤E中,以节点集合#中的节点为覆盖目标,进行区间运算,生成满足覆盖条件的测试用例,并运行。同时,更新节点集合见从中删除在本次运行过程中已覆盖到的节点。步骤F中,该回归测试用例集合由两部分构成选择测试用例集和新增测试用例集合Tnev,即 'Tr =
Tselected ^ ^new0本发明所提供的基于控制流图的单元回归测试用例集合优化方法,具有以下优
占-
应用该单元回归测试用例集合优化方法进行回归测试,其关键在于提高测试用例选择精度和测试可信度,本发明方法在基于控制流图遍历的回归测试用例选择算法和基于覆盖要求的测试方法的基础上,加以改进和综合,能够达到以下的目标以更少的测试用例提高回归测试的效率;以筛选相关测试用例和补充新测试用例的方式提高回归测试的有效性。


图I为本发明的回归测试用例集合组成图;
图2为本发明的单元回归测试用例集优化策略的应用流程示意 图3为本发明源程序Testl. Java中函数f的初始控制流 图4为本发明中控制流图对比过程中CFGl的后继节点为空而CFG2的后继节点不为空的控制流图对比 图5为本发明中控制流图对比过程中CFGl的后继节点不为空而CFG2的后继节点为空的控制流图对比图。
具体实施例方式下面结合附图及本发明的实施例对本发明的方法作进一步详细的说明。本发明的基本思想是利用回归测试的第三种策略,即根据程序修改情况对基线测试用例库中的测试用例进行选择性复用,考虑到运行原有测试用例可能无法满足新代码的测试需求,导致回归测试不够充分,因此有必要向回归测试用例集合中补充新的测试用例。这样,通过程序控制流图对比技术识别出程序中的修改点,根据执行路径经过修改点的测试用例在再次运行时结果可能发生改变的原理对这类测试用例选择性复用,并且按照覆盖需求补充新的测试用例;即回归测试用例集合包括两部分复用测试用例和新增测试用例。在开发人员对原程序改动较少的情况下,没有必要将所有单元测试的测试用例进行回归测试。此时,应进行选择性回归测试(selective regression test),即从原测试用例集合中找出部分测试用例来测试。当这些测试用例对于修改后的代码来说,测试并不够充分的情况下,再生成新的测试用例进行测试。因此,回归测试的重点在于测试用例的选择与生成。本发明方法中,优化回归测试用例集合的策略,尽力保证集合中的每个元素都与修改相关。因此,本发明的研究内容主要为以下两点
分析回归测试需要哪些测试用例;
如何筛选或生成这些测试用例。第一点,即讨论回归测试中测试用例集合的组成。由于回归测试的测试目标主要包含两方面,即所做的修改达到了预期的目的;软件的修改没有引入新的缺陷。为了保证第一个条件成立,需要将与该修改处相关且在单元测试中执行失败的测试用例重新运行,以验证修改后这些测试用例可以通过;同时,为了保证对修改处的测试足够充分,可能需要新增一部分与之相关的测试用例。而为了保证第二个条件成立,则需要将与该修改处相关且在单元测试中执行成功的测试用例再重新运行一次,以验证这些本来已经通过的测试用例在回归测试中依然通过。因此,回归测试用例集合Tk可以表示为
Tr ~ Tfajl U Tnew U Tpass - Tselected U Tnew
其中'Tfail表示与该修改处相关且在单元测试环节中执行失败的测试用例集合,Tnew表示需要为修改处新增的 测试用例集合,Tpass表示与该修改处相关且在单元测试环节中执行成功的测试用例集合。Tfail和Tpass组合成为选择测试用例集合Ts+rted。图I为本发明的回归测试用例集合组成图。在研究分析出回归测试用例集合的组成后,需要讨论如何筛选或者生成符合条件的测试用例。由于回归测试中测试用例集合主要由两部分组成选择测试用例集合T—和为修改处新增的测试用例集合TnOT。所述“选择测试用例集合”T—即在代码被修改之后,执行结果可能会受到影响的测试用例。显而易见,若一个测试用例在执行过程中,其执行路径经过被修改的语句或判定条件,那么它的执行结果受之影响的可能性非常大。所以,将执行路径经过修改点的测试用例等价为“与修改处相关的测试用例”。另外,这些测试用例不仅是执行结果可能会受影响,其执行路径也有可能会发生改变,如某个判定条件的修改。为了保证对修改后的功能进行了充分的测试,有必要新增一些测试用例,将与被修改点相关的所有语句按覆盖率要求(包括语句、分支、MCDC)至少执行一次。这里,将被修改点的相关节点定义为被修改点的后继语句(或表达式),并且修改点到这些相关节点都是可达的。以下结合附图,对本发明提出的测试用例集合优化策略在软件回归测试实施例中的应用进行解释和说明。图2为本发明单元回归测试用例集优化策略的应用流程示意图。如图2所示,该方法主要包括
步骤A、对比被测单元修改前后的控制流图,找出代码中被修改部分所对应的节点,该节点简称为修改点。若要找到被修改语句,就要比较被修改前后的代码。本发明采用基于控制流图的比较方法。这里所使用的控制流图不仅包含程序控制结构的信息,同时也将每个节点对应的语句(或表达式)信息一一记录下来。在对两个控制流图进行比较时,使用深度优先搜索算法进行遍历并采用节点“成对比较”的方式,即分别从两个控制流图的入口节点开始遍历,并成对比较其对应的抽象语法树信息是否相同(变量、常量、运算符)。当抽象语法树信息不同的节点时,将其加入到修改点集合中。该方法具体包括如下步骤
Al、备份代码修改前的控制流图CFG1,并生成代码修改后的控制流图CFG2。被测单元在单元测试过程中,通过静态分析获得了对应的抽象语法树。由抽象语法树,进一步获得对应的控制流图。因此,控制流图的节点包含了代码对应的表达式信息。为避免在代码修改后由于重新进行静态分析,而导致原控制流图丢失,需要将代码修改前的控制流图进行备份,记为CFGl。当确认代码修改完成时,系统对新代码重新进行静态分析,得到新的控制流图,记为CFG2。此时,被测单元一共有两个控制流图,一个是单元测试时的控制流图CFG1,另一个是开发人员对代码进行修改后的控制流图CFG2。这两个控制流图完整的保存了代码修改前后的程序结构与代码信息。A2、使用深度优先搜索算法同时遍历控制流图CFGl和CFG2。在遍历的过程中成对地对比当前遍历到的控制流图节点;若其包含的抽象语法树信息不同,则把它当作修改点,加入到修改点集合当中。同时考虑了节点的增加和删减情况,并作了相应处理。其具体步骤如下
A21、根据控制流图产生时的节点序号顺序,分别取CFGl和CFG2的未访问过的后继节点作为当前节点对,并取当前节点对中CFG2的节点作为当前节点。A22、若当前节点对为空,当父节点是函数入口节点时,遍历结束,否则回退到当前节点对的父节点,执行步骤A21 ;
A23、若当前节点对中的两个节点都不为空,则比较当前节点对中每个节点包含的抽象语法树信息,即对应的表达式中的常量、变量、运算符信息,若这些信息都相同则执行步骤A21 ;若不同,则当前节点为修改点,加入到修改点集合当中。如果当前节点对中CFGl的节点为空,CFG2的节点不为空,则说明CFG2的节点是修改后新增的,将CFG2非空节点的父节点作为修改点,加入到修改点集合当中。如果CFGl的节点不为空而CFG2的节点为空,则说明CFGl中对应的代码已被删除,把CFGl中被删除的节点作为修改点,加入到修改点集合当中。下面本发明结合具体实例对本发明做进一步说明。对于下面的源程序test, c中的函数f,在被修改前建立的初始控制流图如附图3,图中的节点与源程序中行号的对应关系如表I所示,其中节点名字的最后一个数字标识了产生的顺序号,边上标识的最后一个数字标识了该边产生的顺序号,以“T”开头表示为条件表达式的真分支,以“F”开头则表示为假分支。函数f的单元测试用例库如表2所示,其中包含了每个测试用例的执行路径信息(注路径节点不包含终结符节点,如if_out、func_out)。/#
* 一元二次方程test, c */
I: ^include〈stdio. h〉
2: int f (int a, int b,int c) {
3:int mid 二 b氺b_4氺a氺c;
4:if (mid> 0)
5:printf (〃two real roots \n ;
6:elsei f (mi d==~3)
7:print f (,,one real root\n〃);
8:else
9:print f (〃two complex roots\n〃);
10 :return mid ;
11: I
权利要求
1.基于控制流图的单元回归测试用例集合优化方法,其特征在于,该方法包括 A、对比被测单元修改前后的控制流图,找出代码中被修改的部分对应的节点,即修改占. B、从单元测试用例集合中筛选出执行路径经过修改点的测试用例,作为回归测试用例集合的一部分,记作选择测试用例集Tselected,并运行集合中的所有测试用例; C、计算修改点的所有可达后继节点,从中选出在步骤B的运行过程中未被覆盖的节点子集 D、若节点子集#为空,则执行步骤F,否则执行步骤E; E、从节点子集#中取出一个节点作为覆盖目标生成测试用例,将其加入到新增测试用例集合Tnev并运行;待运行完毕后,更新节点子集见从中删除在此次运行中已被覆盖的节点,返回步骤D ; F、回归测试用例集合Tk构造完毕,Tr
2.根据权利要求I所述的基于控制流图的单元回归测试用例集合优化方法,其特征在于,所述步骤A中根据对比控制流图的方法找出修改点的具体过程为 Al、在代码被修改前,将其对应的控制流图备份,记为CFGl ;代码被修改后,对被测单元重新进行静态分析,生成控制流图,记为CFG2 ;控制流图的节点包含对应的抽象语法树信息; A2、使用深度优先搜索算法同时遍历控制流图CFGl和CFG2 ;在遍历过程中成对地对比当前遍历到的控制流图节点;若其包含的抽象语法树信息不同,则把它当作修改点,加入到修改点集合当中。
3.根据权利要求2所述基于控制流图的单元回归测试用例集合优化方法,其特征在于,步骤A2中使用深度优先搜索算法同时遍历控制流图CFGl和CFG2,对比当前节点对的抽象语法树信息;同时还考虑节点的增加和删减情况,并作了相应处理;其具体过程如下 A21、根据控制流图产生时的节点序号顺序,分别取CFGl和CFG2的未访问过的后继节点作为当前节点对,并取当前节点对中CFG2的节点作为当前节点; A22、若当前节点对为空,当父节点是函数入口节点时,遍历结束,否则回退到当前节点对的父节点,执行步骤A21 ; A23、若当前节点对中的两个节点都不为空,则比较当前节点对中每个节点包含的抽象语法树信息,即对应的表达式中的常量、变量、运算符信息,若这些信息都相同则执行步骤A21 ;若不同,则执行步骤A24; A24、将当前节点作为修改点,加入到修改点集合当中;如果当前节点对中CFGl的节点为空,CFG2的节点不为空,则说明CFG2的节点是修改后新增的,此时将CFG2非空节点的父节点作为修改点,加入到修改点集合当中;如果CFGl的节点不为空而CFG2的节点为空,则说明CFGl中对应的代码已被删除,把CFGl中被删除的节点作为修改点,加入到修改点集合中。
4.根据权利要求I所述的基于控制流图的单元回归测试用例集合优化方法,其特征在于,步骤B中在单元测试过程中使用的测试用例,均以控制流图节点标号的形式将执行路径记录于数据库中;遍历测试用例数据库中的每个测试用例,若其执行路径的标号序列中包含了修改点集合中任一修改点的标号,则被选择为回归测试用例,加入到选择测试用例集 Tselected 并执行。
5.根据权利要求I所述的基于控制流图的单元回归测试用例集合优化方法,其特征在于,步骤C中,从覆盖率角度考虑为回归测试添加新的测试用例;具体为首先,计算出修改点在控制流图中的所有可达后继节点;然后,从此节点集合中选出在步骤B的运行过程中没有被覆盖到的节点,作为需要在回归测试中被覆盖的目标节点集合見
6.根据权利要求I所述的基于控制流图的单元回归测试用例集合优化方法,其特征在于,步骤E中,以节点集合#中的节点为覆盖目标,进行区间运算,生成满足覆盖条件的测试用例,并运行;同时,更新节点集合见从中删除在本次运行过程中已覆盖到的节点。
7.根据权利要求I所述的基于控制流图的单元回归测试用例集合优化方法,其特征在于,步骤F中,该回归测试用例集合Tr由两部分构成选择测试用例集和新增测试用例集合Tner,即
全文摘要
本发明公开了一种基于控制流图的单元回归测试用例集合优化方法,包括A、在被测单元修改前后的控制流图中找出被修改部分对应的修改点;B、筛选出执行路径经过修改点的测试用例,作为回归测试用例集合的一部分即选择测试用例集Tselected,运行集合中的所有测试用例;C、计算修改点的所有可达后继节点,选出步骤B运行过程中未被覆盖的节点子集N;D、若N为空,执行步骤F,否则执行步骤E;E、从N中取出一个节点作为覆盖目标生成测试用例,将其加入新增测试用例集合Tnew并运行完毕,更新N,删除在此次运行中已被覆盖的节点,返回步骤D;F、回归测试用例集合TR构造完毕。应用本发明,能够提高回归测试的效率,并保证回归测试的有效性与充分性。
文档编号G06F11/36GK102915271SQ201210426628
公开日2013年2月6日 申请日期2012年10月31日 优先权日2012年10月31日
发明者宫云战, 王雅文, 黄俊飞, 金大海, 蔡敏 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1