一种基于频谱法的程序错误定位方法和装置与流程

文档序号:22124406发布日期:2020-09-04 17:01阅读:505来源:国知局
一种基于频谱法的程序错误定位方法和装置与流程

本发明基于错误定位领域广泛使用的频谱方法,实现了对代码缺失问题的错误定位,属于软件测试领域技术。



背景技术:

软件测试是定位、修正程序错误的工程,是现代软件工程中,耗费人力物力最多的一个环节;而在整个软件测试的过程中,错误定位是最困难的步骤之一。为了提高错误定位的效率,研究人员提出了多种错误定位方法。其中,基于覆盖的频谱方法是应用最广泛、效率最高的方法之一。其主要思想是,获取软件单元测试过程中各个测试用例的测试结果,结合程序实体在各个测试用例中的覆盖信息,根据概率模型计算各程序实体的可疑值,表征错误实体和错误的关联程度,然后根据可疑值的数值大小进行降序排列,为程序测试人员提供一个可疑程序实体列表。根据粒度的不同,程序实体包括类、函数、基本块、语句、定值-引用链等等。覆盖信息,即程序实体在具体测试用例下的行为,以及该测试用例成功或失败。

给定错误程序p,假设p=<s1,s2,s3,...,sn>,相应的测试用例t={t1,t2,…,tm}。其中,sn指程序实体,tm指单元测试用例。软件测试过程中,我们可以通过插装,获取程序实体的关键四元组,即其在每个成功或失败用例下覆盖与否的信息,记为其中,对于第i个程序实体,为该实体被成功用例执行的次数,为被失败用例执行的次数,为成功用例未覆盖的次数,为失败用例未覆盖的次数。一般认为,越高而则越低,对应的程序实体错误的可能性越大。根据各种启发式策略,研究人员利用上述变量构造错误可疑度计算公式,如tarantula(该算法以发明人命名,中文名称暂无),即可计算求出每个程序实体的可疑值,表示该语句与错误的关联程度大小。将由此计算的可疑度进行降序排列,可获得可疑语句块排位表。在排位表中从上到下查找错误语句所在的位置,该位置与总行数之比即本次错误定位的效率。

基于频谱的错误定位方法很多,相关的研究也在不断开展。然而,频谱法只能定位程序中存在的错误,还没有一套工具用于定位代码缺失错误。在实际的java工程中,代码缺失错误所占比例很大,因此,发展一套可以定位代码缺失的错误定位工具是有价值的。



技术实现要素:

本发明解决的技术问题:克服现有技术的局限性,提供一种基于频谱覆盖的程序错误定位方法和装置,在传统频谱法基础上,增加对于代码缺失错误的定位能力,并提供相应的实验结果分析工具。

本发明采用的技术方案如下:

一种基于频谱法的程序错误定位方法,包括以下步骤:

采集待测错误程序的代码覆盖信息,从代码覆盖信息中提取频谱法所需的关键四元组;

采集待测错误程序的静态信息;

对采集的代码覆盖信息和静态信息进行分析,生成程序频谱,并在程序频谱中插入表示代码缺失位置的代码块;

根据关键四元组,使用基于概率模型的可疑度计算公式计算得到各代码块的可疑度,并根据程序的结构信息对可疑度进行调整;

根据可疑度大小对程序频谱进行降序排列,得到代码缺失错误的可疑位置列表。

进一步地,所述采集待测错误程序的代码覆盖信息,包括:对待测试错误程序进行插装处理,然后进行批量自动化测试,根据插装程序的输出信息采集待测程序的代码覆盖信息。

进一步地,所述静态信息包括:第一,程序的代码基本单元名、各测试用例函数名,用于结合代码覆盖的关键四元组信息、测试用例执行结果,进行频谱法定位工作;第二,程序的分支结构信息、基本块信息、变量名信息,用于计算部分。

进一步地,所述对采集的代码覆盖信息和静态信息进行分析,生成程序频谱,并在程序频谱中插入表示代码缺失位置的代码块,包括:

根据静态信息中的代码基本单元名、测试用例函数名以及代码覆盖的关键四元组,生成程序频谱信息;

根据静态信息中的分支结构信息、基本块信息,在程序频谱中插入表示代码缺失位置的代码块。

进一步地,所述根据程序的结构信息对可疑度进行调整,包括:利用分支结构信息,修改条件表达式所在代码块的可疑度;对频谱列表的可疑度进行平滑操作;利用变量信息修改各代码块的可疑度。

一种基于频谱法的程序错误定位装置,其包括代码覆盖信息采集模块、程序信息采集存储模块、信息输入整合模块、计算模块、结果分析模块;

代码覆盖信息采集模块:对待测试错误程序进行插装处理,然后进行批量自动化测试,根据插装程序的输出信息,采集待测程序的代码覆盖率信息;从代码覆盖率信息中,提取频谱法所需的关键四元组,即:代码执行时的正确测试用例覆盖数、失败测试用例覆盖数,以及正确测试用例未覆盖数和失败测试用例未覆盖数。程序将保存关键四元组的信息。

程序信息采集存储模块:实验平台将采集待测错误程序的静态信息,用以辅助错误定位工作。静态信息包括:第一,程序的代码基本单元名、各测试用例函数名,用于结合代码覆盖的关键四元组信息、测试用例执行结果,进行频谱法定位工作。第二,程序的分支结构信息,基本块信息,使用的变量信息,用于实验的计算部分。

信息输入整合模块:对于收集的程序静态信息和代码覆盖信息进行分析。根据静态信息中的代码基本单元名、测试用例函数名,以及代码覆盖的关键四元组,生成程序频谱信息。然后,根据静态信息中的分支结构信息、基本块信息,在程序频谱中插入表示代码缺失位置的代码块。在本平台中,代码基本单元使用的粒度为代码行。

计算模块:使用基于概率模型的可疑度计算公式,处理程序静态信息和代码覆盖信息,计算得到各代码块的可疑值。然后,利用收集的程序信息,重新修饰可疑值:利用分支结构信息,修改条件表达式所在代码块的可疑值;对频谱列表的可疑值进行平滑操作;利用变量信息,修改各代码块的可疑值。

结果分析模块:根据可疑值大小,对程序频谱进行降序排列,从而得到代码缺失错误的可疑位置列表。实验平台将以csv列表形式反馈给用户可疑位置列表。如果提供待测程序错误位置,则可以进一步分析实验结果。错误位置对应的排序位置与总列表长度的比值即为本次错误定位实验的定位效率。实验平台会对比分析本方法和传统频谱法的定位效率。用户可以获得待测程序的若干版本的综合报告。

可选地,本发明的基于频谱法的程序错误定位方法,具体实现步骤如下:

(1)对于待测的java程序错误版本,使用ant、javac等工具编译源代码,然后使用gzoltar工具进行插装。使用junit工具运行程序的测试用例,根据其输出结果判断是否产生错误。根据插装代码的打印结果,生成频谱信息,保存在csv文件中。

(2)程序的执行信息保存在matrix.txt中,以矩阵形式存储程序执行结果;其中,行、列分别表示代码块和测试用例,矩阵保存了代码块在测试用例中是否覆盖,以及测试用例是否通过的信息。程序的代码块、测试用例分别保存在对应的csv文件中,记录了代码块和测试用例的基本信息;结合matrix.txt,程序生成了频谱信息,记录了每个代码块的位置以及关键四元组,并保存在spectra.csv中。

(3)用户可以自行决定错误定位的数据流程。平台内置超过十种广泛应用的错误定位公式,并且用户可以使用自行定义的公式。错误定位过程中使用的各个参数,平台提供了默认值,同时用户也可以自行指定。数据流程的控制使用简单的控制脚本完成,易于掌握。

(4)根据代码块的关键四元组信息,结合程序的分支结构、变量分布等信息,计算各个代码块的可疑值,并进行降序排列,获得当前错误版本的可疑语句列表。

(5)用户可以对错误定位的实验结果进行进一步分析。在可疑代码块列表中查找错误所在位置,其序数与代码块列表长度之比,即为本次实验的定位效率。在批量实验中,用户可以对实验数据进行横向对比,比较同一算法在不同待测程序上的定位效率,也可以比较不同算法的定位效果差异。

本发明与现有技术相比的优点在于:

(1)定位范围扩大:在频谱法定位程序已有代码块的基础上,增加了对代码缺失错误的定位能力,更适用于实际工程;

(2)定位能力增强:相比传统频谱法,提高了代码的定位效率;

(3)计算流程可编辑:实验中,可疑度计算公式和具体计算流程可以在控制脚本中修改,不需要修改代码结构,提高实验灵活性;

(4)中间数据保留:实验中,频谱信息、程序静态信息等信息本地保存,便于复现实验,减少重复计算量。

附图说明

图1为实验工具体系图;

图2为代码覆盖信息采集模块结构图;

图3为程序信息采集存储模块结构图;

图4为信息输入整合模块结构图;

图5为计算模块结构图;

图6为样例程序输出结果。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步说明。

如图1所示,本发明的平台基于ubuntu18.04lts操作系统,对java程序进行错误定位工作。平台使用csv文件存储错误定位的中间信息和最终结果。更具体地,包含以下几个模块:代码覆盖信息采集模块、程序信息采集存储模块、信息输入整合模块、计算模块、结果分析模块。

(1)对于ubuntu环境下的java工程,使用ant及javac进行编译,获得可执行的java文件。然后,使用gzoltar工具对java字节码进行插装。然后,使用junit运行待测程序的各个单元测试用例。然后,读取插装代码的打印文件(gzoltar.exec),分析可得每个代码块在单元测试用例下的覆盖信息,并将信息进行写入存储文件中。

(2)定位工具将采集待测错误程序的静态信息,结合动态动态分析结果,进行存储。存储信息包括,第一,程序的代码基本单元名、各单元测试用例函数名,用于结合插装获得的代码覆盖的关键四元组信息、测试用例执行结果,进行频谱法定位工作。这部分信息存储于spectra_gzoltar文件夹中,对应程序名的csv文件中,如lang_01.csv。第二,用于实验的计算部分的其他信息,包括程序的分支结构信息,基本块信息,使用的变量信息。这部分信息存储于variable、block、branch等文件夹中,对应程序名的csv文件中,如variable/lang_01.csv。

(3)用户可以自行编辑控制脚本,控制错误定位的实验流程。每次错误定位可以选取若干完成信息采集的错误程序及错误版本。用于排序的可疑度计算公式可以由用户自行选择,用户也可以自己编写可疑度计算公式。在读取错误版本的程序代码块列表后,程序会根据程序基本块信息,添加表示代码缺失错误的频谱项,根据缺失位置附近的频谱项确认插入频谱项的关键四元组。

(4)读取存储文件中保存的关键四元组信息,根据控制脚本中的指定的可疑度计算公式,计算各代码块的可疑值,判断各程序单元包含错误的可能性。随后,根据程序的结构信息,对程序可疑度进行调整。利用程序中分支结构的信息,重新调整各个条件语句的可疑度。对程序相邻元素(元素包含代码块和插入位点)的可疑度进行平滑操作。根据程序各代码结构的相关变量信息,重新调整各个代码块的可疑度。使用最终得到的可疑度,按照可疑度降序进行排序,以csv形式返回可疑列表作为输出结果。

(5)根据输出结果,工具可以进一步分析实验结果。错误位置对应的排序位置占总列表长度的比例,即为本次错误定位实验的定位效率。实验平台会对比分析本方法和传统频谱法的定位效率。用户可以获得待测程序的若干版本的综合报告。

上述实现过程具体实施如下:

1.代码覆盖信息采集模块

该模块的实现过程如图2所示:

(1)对待测java程序进行编译,获得字节码文件。

(2)使用gzoltar工具,在生成的字节码文件上进行插装,在程序中以语句为粒度增添打印语句;

(3)执行程序的单元测试用例,插装语句将打印代码的单元测试用例覆盖状况,以及单元测试用例是否通过,插装语句的打印结果保存在gzoltar.exec文件中。

(4)解析gzoltar.exec文件,结合函数单元测试函数文件tests.csv,生成程序频谱文件spectra_gzoltar/程序.csv。对于每个代码块,读取插装输出文件,覆盖的失败测试用例的数量之和,即为该代码块的失败用例覆盖数。四元组中的其他元素也是类似方法累加得到。

2.程序信息采集存储模块

该模块的实现过程如图3所示:

(1)程序相关静态信息均存储在名称为程序名的csv文件中。标准计算流程使用的静态信息包括程序分支信息,程序基本块信息,程序变量信息,分别保存在branch、block、variable等文件夹中。csv文件中,一列为代码块名称,其他列为该代码块对应的性质。

(2)代码覆盖信息保存在名称为程序名的csv文件中。其中,第一列是代码块名称,之后四列为对应的四元组信息。以lang程序中的一条频谱为例,{org.apache.commons.lang3.math$numberutils#<clinit>():34,1,0,168,1}的第一项是该代码块在程序中的位置,第二项“1”是指代码覆盖的成功测试用例数量为1,第三项“0”表示代码覆盖的失败测试用例数量为0,后两项则为代码未覆盖的成功、失败测试用例数量。其他代码覆盖信息可以用相同的方法解析。

3.信息输入整合模块

该模块的实现过程如图4所示:

(1)读取控制脚本,确定本次错误定位工作的具体数据处理流程。

(2)从存储文件中,读取待测程序的程序静态信息和代码覆盖信息,构建计算使用的程序频谱。

(3)为了实现对代码缺失错误的定位能力,在程序频谱中添加代表代码缺失错误的频谱项。举例来说,“org.apache.commons.lang3.math$numberutils#<clinit>():34”和“org.apache.commons.lang3.math$numberutils#<clinit>():36”是程序中相邻的两个代码块,工具在频谱列表中插入“org.apache.commons.lang3.math$numberutils#<clinit>():34->36”项,表示两个代码块间的代码缺失位点。在本程序定位工具中,只考虑函数内的代码缺失错误。

4.计算模块

该模块的实现过程如图5所示:

(1)根据在控制脚本中选择的可疑度计算公式,计算频谱项列表中,每一个频谱的可疑值。

(2)根据程序的分支结构信息,分析每个条件分支中,true、false分支对应的覆盖信息的可疑值,将条件表达式对应的代码块的可疑值赋值为原代码块、true、false分支三者的最大值。

(3)将各频谱项顺序排列,然后对其可疑值进行平滑操作,将平滑后的结果作为其可疑值。其中平滑操作是指计算加权平方平均数。

(4)对于各频谱项,从静态信息中读取其变量信息。对于代码块,变量信息即为该行代码所包含的变量名;对于缺失位点,变量信息即为其相邻代码块所含的变量名。根据每个频谱对应的变量信息的出现次数之和,与一个常数α求最小值,然后乘以常数β,与常数γ相加得到权重系数,将可疑值与权重系数相乘,得到考虑变量重要性的可疑值。例如一组语句,可疑值为{0.2,0.3,0.1},变量信息出现次数之和为{2,1,4},α为3,β为0.1,γ为0.7,则求最小值之后为{2,1,3},乘以β后得到{0.2,0.1,0.3},与γ相加得到权重系数为{0.9,0.8,1.0},将可疑值与权重系数相乘得到最终结果为{0.18,0.24,0.1}。

(5)将可疑值与代码块信息输出,以csv形式返回给用户。

5.结果分析模块

对待测程序进行错误定位后,可以获得以可疑度排序的列表,包含代码块和代码缺失位点。如图6是待测程序lang的第一个错误版本的可疑度列表;由于程序规模较大,图中仅展示可疑度列表的顶端数项。

在评价实验中,为了评估方法的有效性,使用确定真实错误位置的样例程序进行实验。对于程序进行错误定位后,提供真实错误位置,可以对错误定位工作进行评估。真实错误在可疑度列表中的排位,与列表长度的比值,即为本次错误定位的定位效率。实验工具可以对比本实验方法和纯频谱法的定位效率,确定定位效率的差异。

对多个待测程序及版本进行错误定位后,可以进行横向对比。工具可以按照待测程序种类、错误类型等判据对实验结果进行分类,对比不同实验的定位效率差异;对于同一批程序,工具也可以对比不同实验方法的定位效率。

表1展示了本方法在实际工程中的真实错误上的实验效果。列名ochiai、barinel等是经典错误定位公式,行名closure、chart等是实验室用的软件名称。exam为实验中,检查到错误位置的排位占总代码量的百分比;exam值越小,定位效果越佳。avg(impr)表示程序的各个版本中,与传统频谱法对比,使用本方法带来的平均性能提升。

表1.实验结果

基于同一发明构思,本发明的另一个实施例提供一种电子装置(计算机、服务器、智能手机等),其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明方法中各步骤的指令。

基于同一发明构思,本发明的另一个实施例提供一种计算机可读存储介质(如rom/ram、磁盘、光盘),所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现本发明方法的各个步骤。

以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定,不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。

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