基于控制流图遍历和切片前向遍历相结合的软件测试方法

文档序号:6607383阅读:246来源:国知局
专利名称:基于控制流图遍历和切片前向遍历相结合的软件测试方法
技术领域
本发明涉及的是一种软件测试方法。特别涉及回归测试技术领域的一种基于控制 流图遍历和切片前向遍历算法结合的选择性回归测试方法。软件测试是伴随着软件的产生而产生的,早期的软件开发过程中,测试的含义比 较狭窄,将测试等同于“调试”。直到1957年,软件测试才开始与调试区别开来,成为一种发 现软件缺陷的活动。目前国内外软件测试的研究热点在软件测试过程模型、单元测试充分 性标准、回归测试、嵌入式软件测试、面向对象软件测试、软件质量和复杂度度量、自动化测 试数据生成等。其中,回归测试是软件测试领域中的一个重要研究方向。在回归测试中,经常面临数量巨大的单元测试用例和复杂度很高的成员函数,如 何从已存在的测试用例集中选择测试用例或者设计新的测试用例,从而既保证回归测试的 质量,又提高回归测试效率,一直是回归测试面临的主要问题。目前,已经存在几种选择性回归测试方法,在这一领域中,测试方法的优劣主要是 通过安全性和精确度来衡量的,安全性和精确度的定义如下1.安全性假设M是一个选择性回归测试方法,安全性是衡量M从测试用例集T中选择修改 揭露测试用例的范围。我们定义安全性是根据一个特定的程序P、修改的程序P'和测试用 例集T,具体如下定义假设T包含了 η个测试用例对于程序P和P'是修改揭露的,假设选择这些 测试用例中的m个,则M关于P、P'和T的安全性如下如果M确定地选择了所有的修改揭露测试用例,那么我们说M技术是安全的。如 果M选择了一个已知的修改揭露的超集,则M也是安全的。例如,如果M选择了所有的修改 遍历的测试用例对于控制性回归测试,那么M是安全。如果M是安全的,则M选择了在T中每一个错误揭露测试用例,而如果M是不安全 的,则它可能忽略一些暴露错误的测试用例,此外,我们假设M1和M2是两个选择性回归测试 方法,若M1比M2有更大的安全性,则M1相对M2有更大的揭露错误的能力。2.精确度假设M是一个选择性回归测试方法,精确度衡量M忽略非修改揭露测试用例的程 度,定义精确度根据一个特定的程序P、被修改的程序P'和测试用例集T,具体如下定义假设测试用例集T中包含了 η个测试用例是非修改揭露的,假设M忽略了其 中的m个测试用例,则M关于P、P'和T的精确度如下
背景技术
ml η πφΟ 100% η = 0
ml η πφ^ 100% η = 0
与安全性相似,对于任意的M、P、P'和T,还没有一个算法能够决定M关于P、P' 和T的精确度,但是关于精确度,我们仍然能够得到一些有用的结论。首先,我们能够根据 精确度来比较选择性回归测试方法礼和礼的优劣;其次,我们能够证明M是不是精确的,如 果M选择一个非修改揭露的测试用例,则M是不精确的。精确度是很有实用价值的,因为它衡量了一个选择性回归测试方法M避免选择一 些测试用例的能力,而这些测试用例在P和P'上不能产生不同输出结果。一般来说,根据 精确度比较选择性回归测试方法,能够识别哪一个方法执行更少的没必要的测试。与本发明相关的文献包括[1]R. Gupta, Μ. J. Harrold, Μ. L. Soffa. An Approach to Regression Testing UsingSlicing ;[2]H. Agrawal, J. Horgan, E. Krauser, S. London. Incremental Regression Testing ;[3]Gregg Rothermel, Mary Jean Harrold. A Safe,Efficient Regression Test SelectionTechnique0接下来分析三个典型的选择性回归测试方法,使用上述的框架来评估和分析它 们,为了更加清晰地阐述安全性和精确度,这里用图1来描述,在椭圆内的所有测试用例都 是修改遍历的,其余的测试用例则不是,在图1中,T' modification-revealing阴影部分是修改揭露 的测试用例集,因为修改遍历的测试用例集中一部分测试用例是修改揭露的,而另一部分 却不是修改揭露的。文献[1]提出了基于数据流的选择性回归测试方法。安全性仅仅考虑了与变量定义使用对(define-use)有关的修改,因此它可能忽略一些 修改揭露的测试用例,例如函数调用代码的删除不涉及变量的定义使用,该方法不能选择 任何测试用例;相似地,如果一个测试用例执行一个新的或修改的输出语句,但是该语句中 并没有包含变量的使用,该方法就不可能选择对应的测试用例,即使该语句对于P和P'是 修改揭露的,因此数据流技术是不全的。精确度1)仅仅选择执行那些新增加的、被修改的或被删除的变量定义使用对的测试用 例,所以,数据流选择性回归测试技术典型地忽略了非修改遍历的测试用例;2)数据流测试技术选择遍历新增加的、修改的或删除的定义使用对的测试用例, 数据流技术就可能忽略一些测试用例,该测试用例达到了一个被修改的变量定义,但是却 没有达到该变量的使用,这些测试用例是修改遍历的,但是非修改揭露的。3)数据流技术可能忽略掉修改揭露的测试用例,例如,当代码的删除不涉及到变 量定义使用时。文献[2]定义了采用程序切片技术来实现选择性回归测试的方法。包括执行切 片、动态切片、相关切片和近似相关切片四种切片类型。安全性1)当程序P中包含了修改的断言语句时,动态切片技术可能忽略一些修改揭露的 测试用例,所以该技术是不安全的,;当代码的修改没有改变程序P的控制流图或增加新的变量定义,其它的切片技术是安全的。2)在程序P中增加断言语句或赋值语句将会对切片技术的安全性产生不利影响, 例如在P中增加一个新的赋值语句S,因为程序切片技术获得的切片仅仅是包含在程序修 改之前出现在程序P中的语句,任何测试用例的切片都不会包含语句S。但是,在测试程序 P'时,在τ中任何能够执行到S语句的测试用例都是修改揭露的,但是切片技术并没有选 择这些测试用例,所以切片技术是不安全的。精确度当代码修改是非结构化的,并且没有新代码的增加,切片技术仅仅选择修改遍历 的测试用例。通过限制性地选择影响程序输出的测试用例,动态切片技术和相关切片技术 在不同程度上排除了一些是修改遍历而不是修改揭露的测试用例。但是当程序P'中包含 结构化的改变,该技术就可能选择非修改遍历的测试用例。文献[3]提出了一个基于控制流图遍历技术的选择性回归测试方法。安全性控制流图遍历技术选择了所有的修改遍历的测试用例,对于控制性回归测试,该 技术是安全的。精确度控制流图遍历技术并不是100%的精确的。控制流图具有一个多次被访问的节点 (multiply-visited-node)特性,同时当程序P和P'中不含有该特性时,该技术精确地选 择了修改遍历的测试用例;当程序P和P'中含有该特性时,该技术将可能选择了一些非修 改遍历的测试用例。

发明内容
本发明的目的在于提供一种同时保证回归测试用例选择的安全性和精确度的基 于控制流图遍历和切片前向遍历相结合的软件测试方法。本发明的目的是通过如下步骤实现的A.分别创建原有程序及修改后的程序控制流图G和G',对回归测试之前的测试 用例集T中每一个测试用例,建立其与执行路径的对应关系;B.对G和G'同步进行深度优先搜索遍历,比较每一个遍历能够到达的语句节点; 对于代码中变量定义的改变,使用前向遍历算法只识别所有直接或间接被影响的变量定义 使用对Vdrfim ,在T中选择遍历到变量定义使用对的测试用例;对于比较过程中其他 的节点N和N'的语句词法不一致的情况,在T中选择所有能够达到该节点的测试用例;C.列出从T中选出的所有适合修改后程序的测试用例。上述技术方案中,所述步骤B进一步包括Bi.根据步骤B中遍历得到的定义改变的变量,初始化其变量定义使用对集合,并 记录该语句所在的节点位置;B2.继续向前遍历1)若发现在一个语句中使用步骤B中遍历到的变量的值,将其放入定义使用对集 合中;2)若发现在一个语句中使用的变量控制依赖于步骤B中遍历到的变量的值,将其放入定义使用对集合中;3)若发现在一个语句中,步骤B遍历得到的变量有一个新的定义,停止在该路径 上的遍历;B3.返回步骤Bl记录的节点位置继续执行步骤B。本发明在基于控制流图遍历的选择性回归测试方法的基础上,结合切片前向遍历 算法,提出了一种改进的选择性回归测试方法,使其在保持基于控制流图遍历的选择性回 归测试方法的完全安全的优点同时,进一步改提高回归测试用例选择的精确度。本发明的方法区别于现有方法的显著特征在于对于代码中存在的变量定义的改 变,只需识别所有直接或间接被影响的变量定义使用对Vdrfim Vuse即可,而不需选择所有 通过该变量值定义的测试用例。直接被影响的变量定义使用对是指主要由于变量定义值的 直接改变,例如定义语句χ = 2被直接改为χ = 3,代码改变并没有引入新的定义使用对,但 是必须重新测试所有依赖变量χ值的定义使用对;间接被影响的变量定义使用对是指某变 量定义使用对的变量定义值依赖于被改变的变量值,或者是某变量定义使用对控制依赖于 被改变的变量。选择遍历这些变量定义使用对的测试用例,即选择了所有的修改遍历的测 试用例,因而也保证了其安全性。本发明的方法的有益效果主要体现在本发明中,对基于控制流图遍历的选择性 回归测试方法的遍历策略进行改进,对于代码中变量定义的改变,引用切片前向遍历算法, 识别所有直接或间接被影响的变量定义使用对 v_,并只选择遍历到这些变量定义 使用对的测试用例,避免了选择所有通过某节点的测试用例而造成的测试时间和效力的消 耗。由于改进只是针对变量定义的修改,不考虑代码的删除等,所以本发明公开的方法不会 对安全性产生不利的影响,并且在一定范围内提高了测试用例选择的精确度。


图1为测试用例集关系图;图2为本发明公开的选择性回归测试方法的具体实施流程图;图3为本发明公开的选择性回归测试方法选择的回归测试用例集图。
具体实施例方式下面结合附图举例对本发明做更详细地描述结合图2,主要包含以下几个步骤步骤1 分别创建原有程序及修改后的程序控制流图G和G',对回归测试之前的 测试用例集T中每一个测试用例,建立其与执行路径的对应关系。步骤2 对G和G'同步深度优先搜索进行遍历,比较每一个遍历能够到达的语句 节点。对于改变变量定义的节点,跳至步骤3;对于比较过程中节点N和N'的语句词法不 一致的情况,在T中选择所有能够达到该节点的测试用例。步骤3 首先对前向遍历算法ForwardWalk (Pairs)中的使用的变量和过程量进行 说明算法 Forwardffalk (Pairs)输入Pairs :(Si,Vi)受影响的变量定义的集合,其中Si为变量Vi定义的语句,Vi为变量。输出 ValueUseTriples {(s, u, ν)}声明In[i],Out [i],kill,NewIn 变量的集合Worklist, Cd[i],OldCd, Affected Preds 语句的集合s 语句集ν 原始变量集u 被改变的变量集k,n:语句i,x:节点DefsOfV[i] (s, ν)定义的集合Pred (i),Succ (i)程序控制流图中节点i的前驱、后继节点Def(i)语句i定义的变量具体如下对于改变变量定义的节点,初始化变量定义使用对集合ValueUseTriples {(s, u,ν)},令ValueUseTripks = 0。得到受影响的变量定义的集合Pairs中每一个(s,ν)中s的 直接后继节点的深度优先搜索工作列表Worklist = ndepth_firet+W0rkliSt。将控制流图中所 有不在Pairs中的节点Iii的Infci]和Outfci]初始化为0 ;在Pairs中的节点s的In[s] 初始化为0,Out [s]初始化为{(s,ν)}。对于每一个语句节点η e G,In和Out集合包含了 定义值被修改或影响的变量,采用一个二元值用(d,ρ)表示,d为变量的位置,ρ为被改变 或影响的变量,并且这些变量的使用将在后续遍历过程中被发现,集合In[n]表示在节点η 之前变量的使用已经被发现,Out [η]表示在节点η之后变量的使用将会被发现。步骤4 循环处理Worklist中的每个节点,如果^0A/树=0则算法停止,否则从
Worklist中取出第一个语句节点η,定义NewIn 二。如果New〗n φ Ιη[η],则
In [η] =NewIn,0WCc/= U。
pe Tea(n)1)如果OWOZ-OZ(X) ,则所有 k e (OldCd-Cd(n)) Π Affected Preds 的语 句,式(1)、(2)、(3)成立,如下In[n] = In[n]-{(k,ViM(1)AffectedPreds = AffectedPreds-{k}(2)ValueUseTriples = ValueUseTriples-{(k, u, ν)} (3)对于所有(d,ν) e DefsOfV[k]的定义对,式⑷成立,如下ValueUseTriples = ValueUseTriples U {(d, u, ν)} (4)2)如果语句η计算使用了(d,ν) e In [η]的变量ν,式(5)成立,如下ValueUseTriples = ValueUseTriples U {(d, η, ν)} (5)如果在该路径上发现了变量ν的新定义,则停止(d,v)在该路径上的搜索,并且定 义 kill = {(χ, Def (η)) (χ, Def (η)) e Ιη[η]},式(6)成立,如下Out [η] = (In [η]-kill) U {η, Def (η)}(6)3)如果语句η断言使用了(d,ν) e In [η]的变量ν,式(7)成立,如下ValueUseTriples = ValueUseTriples U {(d, η, ν)} (7)
再计算出达到该断言语句却不在In[n]中的定义集合,式(8)、(9)、(10)、(11)成 立,如下DefsOfV[n] = Backwardffalk(η, {ν})-In[η](8)In [η] = In [η] U {(η, Vi) (d, Vi) e DefOfV [η]} (9)Out [η] = In [η](10)Affected Preds = Affected Preds U {η}(11)4)如果语句11定义了一个变量?,并且0/|>2]门4#^仗^^1^论#0,则Out [η]= Out[η] U {(η, Def (η))};5)否则 Out [η] = In [η];6)如果* 0,将η的所有后继节点χ e Succ (η)的深度优先搜索加入工作列 表 Worklist = xdepth_first+Workl i st ;7)如果炉w妨;y/ = 0则算法停止,返回ValueUseTriples,否则回到1)。步骤5 在T中选择遍历ValueUseTriples集合中所有变量定义使用对的测试用 例;步骤6 返回至步骤2中变量定义改变的节点位置,继续基于控制流图的深度优先 搜索遍历;步骤7 遍历结束,列出从T中选出的所有适合修改后程序的测试用例。以下通过实验来比较研究本发明公开的方法与以文献[3]方法的精确度和安全 性,证明了本发明公开的方法在保证测试用例选择安全性的情况下,提高了精确度,比较结 果详见表1。表1文献[3]方法和本发明公开的方法测试用例选择对照表 实验结果分析总结1)当被测试函数的复杂度越大——圈复杂度和节点数,如calcup、draw_ft、draw_ feature和drawjoimding等函数,它们的复杂度都非常高。当仅仅在函数入口改变变量值 时,本发明公开的方法能够较大幅度的提高基于控制流图遍历技术的精确度。2)当被测试函数的复杂度较小时,函数内部的嵌套语句较少,或者被修改得定义值存在断言使用时,如getdeg、kp_sub、putspace和get_text_cmds等函数,本发明公开的 方法与控制流图遍历技术的精确度基本一致。3)当被测试函数内的全局变量值被修改,而在函数内不存在引用时,如getcmds 和get_Chinese_Cmds函数,本发明公开的方法不会选择任何测试用例,而基于控制流图遍 历算法会选择所有的测试用例。综上所述,本发明公开的方法能够在一定范围内提高基于控制流图遍历的算法的 精确度,如图3所示,由于本发明公开的方法只是针对变量定义的修改,不考虑代码的删除 等,所以不会对安全性产生不利的影响。
权利要求
一种基于控制流图遍历和切片前向遍历相结合的软件测试方法,其特征是A.分别创建原有程序及修改后的程序控制流图G和G′,对回归测试之前的测试用例集T中每一个测试用例,建立其与执行路径的对应关系;B.对G和G′同步进行深度优先搜索遍历,寻找语句词法不一致的节点N和N′,判断节点N和N′是否为改变变量定义的节点;如果是,则使用前向遍历算法识别所有直接或间接被影响的变量定义使用对vdefine~vuse,并在T中选择变量定义使用对的测试用例;如果不是,则直接在T中选择所有能够达到该节点的测试用例;C.列出从T中选出的所有适合修改后程序的测试用例。
2.根据权利要求1所述的基于控制流图遍历和切片前向遍历相结合的软件测试方法, 其特征是所述步骤B进一步包括Bi.判断步骤B中寻找到的语句词法不一致的节点N和N',并判断是否为改变变量定 义的节点,如果是则执行B2 ;如果不是,则继续对G和G'同步进行深度优先搜索遍历,直至 遍历结束;B2.根据步骤B中遍历得到的定义改变的变量,初始化其变量定义使用对集合,并记录 该语句所在的节点位置;B3.识别所有直接或间接被影响的变量定义使用对,具体如下1)若发现在一个语句中使用了步骤B中遍历到的变量的值,将其放入变量定义使用对 集合中;2)若发现在一个语句中使用的变量依赖于步骤B中遍历到的变量的值,将其放入变量 定义使用对集合中;3)若发现在一个语句中,步骤B遍历得到的变量有一个新的定义,将其放入变量定义 使用对集合中,并停止在该路径上的遍历;B4.选择T中遍历到变量定义使用对的测试用例,继续对G和G'同步进行深度优先搜 索遍历,直至遍历结束。
全文摘要
本发明提供的是一种基于控制流图遍历和切片前向遍历相结合的软件测试方法。是对基于控制流图遍历的选择性回归测试方法的遍历策略进行改进,对于代码中变量定义的改变,引用切片前向遍历算法,识别所有直接或间接被影响的变量定义使用对vdefine~vuse,并只选择遍历到这些变量定义使用对的测试用例,避免了选择所有通过某节点的测试用例而造成的测试时间和效力的消耗。由于策略改进和算法引入只是针对变量定义的修改,不考虑代码的删除,所以本发明公开的方法不会对安全性产生不利的影响,并且在一定范围内提高了测试用例选择的精确度。
文档编号G06F11/36GK101916222SQ20101024774
公开日2010年12月15日 申请日期2010年8月9日 优先权日2010年8月9日
发明者刘厂, 张振兴, 李刚, 沈志峰, 高峰, 高昕睿 申请人:哈尔滨工程大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1