一种基于链接排名算法和排序学习的缺陷定位方法技术

技术编号:35104616 阅读:20 留言:0更新日期:2022-10-01 17:14
本发明专利技术涉及一种基于链接排名算法和排序学习的缺陷定位方法。利用不同测试用例的函数覆盖情况来改进定位准确性,综合考虑各类缺陷定位算法得到最终怀疑度。首先收集所有的测试频谱并进行函数聚合;动态分析失败的测试用例的函数调用关系,得到函数

【技术实现步骤摘要】
一种基于链接排名算法和排序学习的缺陷定位方法


[0001]本专利技术属于软件缺陷定位领域,涉及一种利用PageRank技术与排序学习技术改进软件缺陷定位的方法。

技术介绍

[0002]在软件系统的开发和维护过程中,出现缺陷是不可避免的问题。同时缺陷的定位是最困难、最苛刻的步骤,需要占用约80%的软件开发成本。因此软件缺陷定位已经成为降低软件维护昂贵成本的主要方法。但随着软件系统复杂性的增加,在数百万行的代码中准确定位软件缺陷是非常困难的。因此,在软件工程领域迫切需要自动化的软件缺陷定位技术。
[0003]在过去的二三十年里,出现了各种技术来帮助开发者定位软件缺陷的具体位置,如基于频谱的技术、基于切片的技术、基于机器学习的技术以及基于突变的技术。其中基于频谱的缺陷定位(Spectrum

Based Fault Localization,下称SBFL)因其轻巧而成为研究最广泛的技术之一。现有SBFL技术的重点是区分不同程序实体出错的可能性,其计算过程只考虑了程序实体所执行的测试用例的数目以及最终的执行结果,而不考虑测试用例覆盖范围大小对缺陷定位所作出的贡献存在区别。对开发人员来说,不同的测试用例对缺陷定位所能作出的贡献的是不同的,该分析主要基于以下事实:
[0004]1.如果一个执行失败的测试用例只覆盖了很少的程序实体,那么该测试用例的搜索空间较小,所执行的程序实体中包含缺陷的概率更高,所以在开发人员眼中该测试用例所执行的程序实体在定位过程中应该更重要。
[0005]2.反之,如果一个执行失败的测试用例几乎覆盖了所有的程序实体,那么该测试用例对缺陷定位的贡献几乎为零,应该减少其所执行的程序实体对SBFL技术的影响,减少该测试用例所执行的程序实体的权重。
[0006]然而,传统的SBFL技术忽略了这一有用的信息,认为无论测试用例所覆盖的程序实体数量是多少,测试用例在现有SBFL中被视为相同。
[0007]为了得到不同测试用例对缺陷定位的贡献,本专利技术将测试用例与程序实体看作网络中不同的节点,将调用关系视作不同节点之间的双向边。因此程序的执行过程可以看作在上述节点网络中进行游走。通过随机游走,被多个失败测试用例访问的函数节点对缺陷定位贡献更大,反映到程序中就是被失败的测试用例反复调用的函数对缺陷定位贡献更大,在计算SBFL分数时该函数的频谱应该有更高的权重。PageRank是一种分析网页重要性的算法,其基本假设是:更重要的页面往往更多地被其他页面引用。该假设可类比到函数调用,即:函数的重要程度与其被调用次数成正相关,被多个失败的测试用例所调用的函数出错概率更高。
[0008]此外,已有研究人员已经提出数十种SBFL技术,但各类技术有着不同的优势,现有关于缺陷定位的实证研究表明,不存在一个单一的SBFL缺陷定位方法可以在不同的项目中胜过所有其他方法。因此本方法提出利用排序学习,结合多种缺陷定位算法,将不同的怀疑
度定位算法的预测结果作为新的函数特征并再次进行定位的软件缺陷定位模型。

技术实现思路

[0009]本专利技术针对现有技术的不足,提出了基于链接排名算法和排序学习算法的软件缺陷定位方法,以进一步提高基于频谱的软件缺陷定位的准确率。
[0010]本专利技术提供的方法,主要步骤如下:
[0011]步骤1:收集程序频谱并进行函数级聚合。
[0012]程序频谱为所有语句行的执行与否与最终测试用例的通过与否,为了计算测试用例与函数节点之间的调用关系,需要对语句行以函数为基本单位进行聚合,聚合之后得到代表该函数的频谱数据。
[0013]步骤1

1:在被测程序中运行所有测试用例,得到所述测试用例集中每个测试用例的程序频谱,所述程序频谱包括被执行的语句和执行结果;
[0014]步骤1

2:使用SBFL技术对步骤1

1中的频谱进行怀疑度计算,得到所有被执行语句的怀疑度分数;包括Tarantula、Ochiai、Jaccard、Ample、M2、Wong3、Op2共7种方法;
[0015]步骤1

3:对步骤1

2得到结果进行函数级聚合,具体为:计算语句行的SBFL分数,并从函数所包含的语句行中抽取最高的分数,用以替代对应函数的整体频谱;
[0016]与使用方法覆盖率计算SBFL的技术相比,该函数聚合对不同测试用例的聚合结果进行了区分,解决了覆盖率计算SBFL导致的怀疑度分数并列问题。此外还考虑了只执行缺陷函数的非缺陷部分的测试用例,避免了执行并通过的测试用例数量偏高的问题。
[0017]步骤1

4:处理步骤1

3的结果,将频谱矩阵转换为一个四元组矩阵(e
f
,e
p
,n
f
,n
p
),分别代表执行并通过的测试用例数量、执行并失败的测试用例数量、为执行并通过的测试用例数量、为执行并失败的测试用例数量。
[0018]步骤2:基于链接排名算法的权重获取;
[0019]基于链接排名算法的指导思想,将测试用例与程序函数看作一系列的节点,将调用关系视作不同节点之间的双向边。构建函数——测试用例双向关系图后通过链接排名算法,得到对应函数与测试用例的权重,用于后续对程序函数的加权。
[0020]步骤2

1:收集程序执行过程中的调用关系,以函数、测试用例为网络节点,以函数与函数、函数与测试用例之间的调用关系为双向边,构建网络图用以计算PageRank分数。
[0021]步骤2

2:根据步骤2

1所得到的网络图,构建n*n的转移矩阵P,其中n代表函数节点的数量与失败测试用例的数量之和。P
i,j
代表从节点j直接转移到节点i的概率,计算方法为
[0022]步骤2

3:计算所有节点权重。
[0023]迭代公式(3)得到代表图中各节点的权重。
[0024][0025]其中P为步骤2

2所得到的转移矩阵。在某些情况下,存在节点没有输出边,其PageRank分数无法传导给其它节点。为了解决这个问题,额外给公式(1)增加阻尼系数d:
[0026][0027]根据研究人员的经验,阻尼系数d取值为0.7。其中代表在第一次随机游动过程中
落在各节点的概率,计算方法为c
i
代表第i个测试用例的出边数量。
[0028]而当网络规模增长时,很难在合理的时间内计算得到公式(2)的确切解,因此有研究人员引入了一种迭代方法来得到近似解,其迭代公式如下:
[0029][0030]的初始值设置为或随着迭代次数的增加,会越来越接近准确解,考虑到程序实体之间关系图规模较小,迭代25次就能得到足以精确的近似解。最终得到的代表图节点的权重。
[0031]步骤本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于链接排名算法和排序学习的缺陷定位方法,其特征在于,包括以下步骤:步骤1:收集程序频谱并进行函数级聚合;步骤2:基于链接排名算法的权重获取;步骤3:加权计算SBFL分数并进行特征组合矩阵的获取;步骤4:使用排序学习算法进行模型构建;步骤5:结合SBFL特征与模型进行缺陷定位。2.根据权利要求1所述的一种基于链接排名算法和排序学习的缺陷定位方法,其特征在于所述的步骤1包括以下子步骤:S1

1.频谱结果统计;在被测程序中运行所有测试用例,得到测试用例集中每个测试用例的程序频谱;所述程序频谱包括:被执行的语句和执行结果;S1

2.怀疑度计算;使用SBFL技术对频谱进行怀疑度计算,得到所有被执行语句的怀疑度分数;S1

3.函数级聚合;抽取函数中怀疑度最高的语句行频谱,将其汇总到整个函数的频谱;S1

4.频谱统计;将函数级聚合的频谱矩阵转换为一个四元组矩阵(e
f
,e
p
,n
f
,n
p
),分别代表执行并通过的测试用例数量、执行并失败的测试用例数量、为执行并通过的测试用例数量、为执行并失败的测试用例数量。3.根据权利要求1所述的一种基于链接排名算法和排序学习的缺陷定位方法,其特征在于步骤2所述的函数权重的获取包括以下子步骤:S2

1.测试用例调用关系获取;收集程序执行过程中的调用关系,以函数、测试用例为网络节点,以函数与函数、函数与测试用例之间的调用关系为双向边,构建调用网络图;S2

2.根据所得到的调用网络图,构建n*n的转移矩阵P,其中n代表函数节点的数量与失败测试用例的数量之和;P
i,j
代表从节点j直接转移到节点i的概率,计算方法为S2

3.所有节点权重计算;根据S3

1得到的转移矩阵计算,所有节点权重,公式如下:其中P为上一步所得到的转移矩阵;引入阻...

【专利技术属性】
技术研发人员:王兴起陈伟昌魏丹陈滨
申请(专利权)人:杭州电子科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1