CN115576851B - 一种结合动态切片的软件多故障聚类定位方法及装置 - Google Patents

一种结合动态切片的软件多故障聚类定位方法及装置 Download PDF

Info

Publication number
CN115576851B
CN115576851B CN202211453054.4A CN202211453054A CN115576851B CN 115576851 B CN115576851 B CN 115576851B CN 202211453054 A CN202211453054 A CN 202211453054A CN 115576851 B CN115576851 B CN 115576851B
Authority
CN
China
Prior art keywords
program
spectrum
fault
test cases
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202211453054.4A
Other languages
English (en)
Other versions
CN115576851A (zh
Inventor
张明星
王世海
刘斌
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beihang University
Original Assignee
Beihang University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beihang University filed Critical Beihang University
Priority to CN202211453054.4A priority Critical patent/CN115576851B/zh
Publication of CN115576851A publication Critical patent/CN115576851A/zh
Application granted granted Critical
Publication of CN115576851B publication Critical patent/CN115576851B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明公开了一种结合动态切片的软件多故障聚类定位方法及装置,属于软件故障定位技术领域,该方法包括执行用于软件故障定位的测试用例集合,获得程序谱;利用程序切片信息对程序谱中的程序语句进行筛选,获取子程序谱;计算每个子程序谱中的程序语句的代码可疑度,并进行排序;利用聚类算法对失败测试用例的排名进行聚类,获取多个分类簇;根据分类结果,再次计算每个分类簇中的程序语句的代码可疑度,按照新的代码可疑度排名从高到低进行筛查,完成故障修复。本发明利用无监督学习的聚类方法,解决了多故障聚类过程中分类个数过多的问题,并达到对故障用例进行预处理、降低聚类过程时间、提高预测效果、减少检查行数的需求。

Description

一种结合动态切片的软件多故障聚类定位方法及装置
技术领域
本发明涉及软件故障定位技术领域,特别涉及一种结合动态切片的软件多故障聚类定位方法及装置。
背景技术
近年来,软件多故障定位已经在软件工程中成为一个活跃的领域,通过软件执行信息及执行结果对软件中故障位置或模块进行定位,可以预先对软件失败测试用例进行分类,再执行传统的基于程序谱的软件故障定位。这样,可以为软件测试人员、管理人员、可靠性设计人员等相关人员提供一定的指导,使其合理地分配相关的人力、资源,节约开发成本,提高软件开发效率。
软件故障定位在过去一直是一项人工作业,考虑到如今大型软件系统的规模与复杂程度,该任务是耗时、繁琐且昂贵的。即使通过软件测试用例失败或其他表现形式发现了软件中的错误,找到并修复它们依旧十分困难,很大一部分原因在于人工故障定位严重依赖与软件开发人员的经验、判断和直觉来识别出可能出现问题的代码并对其进行优先级排序。软件故障定位技术旨在利用程序信息和测试信息大体确定故障所在位置,帮助测试人员更好的定位故障位置,缩小测试人员的搜索范围。目前大多数研究中假设程序中仅存在一个故障,然而现实中程序中往往存在若干故障,并且缺陷之间存在各种耦合关系,降低了故障定位效率,因此本发明提出了一种多故障场景下的软件故障定位技术,以降低故障间的耦合关系,并最终提高软件故障定位效率。
传统的基于程序谱的软件故障定位技术利用软件的执行信息以及执行结果进行分析,例如测试用例的语句覆盖信息,通过怀疑度公式生成怀疑度排名,该公式通常考虑语句在在测试用例中是否执行、以及用例执行结果是否通过。
程序切片技术是一种重要的程序分析技术,广泛应用于程序的调试、测试与维护等领域。程序切片主要通过寻找程序内部的相关特性,从而分解程序,然后对分解所得的程序切片进行分析研究,以此达到对整个程序理解和认识的目的。而动态程序切片主要是指在某个给定输入的条件下,源程序执行路径上所有对程序某条语句或兴趣点上的变量有影响的语句。
以上两类方法均假设软件中存在单一故障,然而实际中存在很多多故障场景,即失败测试用例不仅由单一故障导致,而且由若干故障源之间耦合作用导致。对此,研究人员Eric Wang提出了一种软件多故障聚类定位方法Mseer,通过特定距离公式将失败测试用例进行聚类,从而得到若干簇,理想状态下,每个簇都与特定故障相关。将每个簇分别与包含所有成功测试用例的集合结合,再对其进行怀疑度计算,得到若干故障语句怀疑度排名,每个排名对应一种个故障。这种方法能够同时定位多个故障,采用并行调试,从而减少修改故障的时间。但是,目前多故障定位技术在实际应用中存在分类数目不准确,聚类时间过长等问题。
发明内容
本发明的目的在于,提供一种结合动态切片的软件多故障聚类定位方法,旨在解决目前基于聚类的软件多故障定位技术中分类过多、聚类时间过长的问题,在利用软件报错信息的同时,提高软件故障定位模型的性能。
为了实现上述目的,本发明采用如下技术方案:
第一方面,本发明公开了一种结合动态切片的软件多故障聚类定位方法,包括:
S1,执行用于软件故障定位的测试用例集合,获得测试信息,并根据所述测试信息获得程序谱;
S2,利用动态切片工具获取程序切片信息;
S3、利用程序切片信息对程序谱中的程序语句进行筛选,获取子程序谱;
S4,计算每个子程序谱中的程序语句的代码可疑度,基于所述代码可疑度对子程序谱中的程序语句进行排序,并用所述子程序谱中程序语句的可疑度排名表示测试用例;所述测试用例表示包括失败测试用例,及成功测试用例;
S5、利用聚类算法对失败测试用例进行聚类,获取多个分类簇;
S6、根据分类结果,再次计算每个分类簇中的程序语句的代码可疑度,按照新的代码可疑度排名从高到低进行筛查,直至筛查到故障语句,并完成故障修复。
优选的,上述方法,还包括采用expense分数对故障语句的定位效果进行评估。
优选的,步骤S4中,计算每个子程序谱中的程序语句的代码可疑度,具体包括:
利用4种故障定位特征算子来对程序中语句进行怀疑度赋值,构建怀疑度函数,得到每个子程序谱中的程序语句的代码可疑度,计算公式为:
nef(q)是指对于程序语句q,在测试用例集中,执行了程序语句q且测试结果与实际结果不一致的测试用例数量;
nnf(q)是指对于程序语句q,在测试用例集中,没有执行程序语句q且测试结果与实际结果不一致的测试用例数量;
nep(q)是指对于程序语句q,在测试用例集中,执行了程序语句q且测试结果与实际结果一致的测试用例数量;
nnp(q)是指对于程序语句q,在测试用例集中,没有执行程序语句q且测试结果与实际结果一致的测试用例数量。
优选的,步骤S5中,利用聚类算法对失败测试用例进行聚类,获取多个分类簇,具体包括:
S51、计算任意两个失败测试用例之间的距离,所述距离即两个子程序谱中程序语句的可疑度排名之间的肯德尔距离
其中,ω,σ分别代表两个失败测试用例,si,sj分别代表子程序谱中第i,j行代码的可疑度排名,N表示子程序谱中代码总行数,K'()表示K函数;
S52、根据任意两个失败测试用例之间的肯德尔距离为每个失败测试用例可疑度排名分配隐藏值;
S53、迭代更新隐藏值,获取初始聚类中心;
S54、根据初始聚类中心利用K-medoids聚类算法完成失败测试用例的聚类。
优选的,步骤S54中,利用K-medoids聚类算法完成失败测试用例的聚类,具体包括:
S541、根据其余各点到各中心点的距离,把距离最近的中心点作为自己所属的簇;计算每一簇群中所有代码可疑度排名的排列与其中心点之间距离总和dc
S542、在每一簇群中,依次选取其他排列,计算该排列与同一簇群中其他排列的距离总和de,并与步骤S541中的dc比较,若存在de< dc则选取对应排列作为新的聚类中心,并重复步骤S541-S542,直到聚类中心不再变化,得出聚类结果。
本发明另一方面公开了一种结合动态切片的软件多故障聚类定位装置,其特征在于,包括:
测试执行模块,用于获取对于软件的测试用例集并自动执行测试,获得测试信息;
程序谱生成模块,用于基于所述测试信息获得程序谱;其中,所述程序谱中包括:测试成功的成功测试用例、测试失败的失败测试用例、以及成功测试用例、失败测试用例分别对应的代码执行和覆盖信息;
程序谱筛选模块,用于利用动态切片工具对程序谱进行筛选,获取子程序谱;
可疑度计算模块,用于针对每一个子程序谱,计算此子程序谱中每个程序语句的代码可疑度,并基于所述代码可疑度对此子程序谱中的程序语句进行排序,用以生成与多个子程序谱相对应的多个代码可疑度排名,并将代码可疑度排名用以表示失败测试用例及成功测试用例;
聚类分析模块,用于运用K-medoids聚类算法对多个失败测试用例进行聚类分析,生成多个分类簇;
新程序谱生成模块,用于根据分类结果对每个分类簇再次计算进行代码可疑度计算并排名,得到新的子程序谱;
故障修复模块,用于针对每一个新的子程序谱中的代码可疑度排名,从高到低进行筛查,直至筛查到故障语句,并完成故障修复。
优选的,所述装置还包括评估模块,所述评估模块用于采用expense分数来评估故障语句的故障定位的效果。
与现有技术相比,本发明具有以下有益效果:
本发明提出的结合动态切片的软件过故障聚类定位方法可以通过切片筛选突出故障特征,从而提高分类准确度并且减少聚类时间。本发明针对软件故障定位中的多故障任务,以简单、易用的基于程序谱分析的故障定位技术为基础,结合动态切片技术进行程序谱优化筛选,对失败测试用例进行表征,并且利用无监督学习的聚类方法,对失败测试用例进行聚类,解决了多故障聚类过程中分类个数过多的问题,并且实现对软件执行报错信息的利用,满足存在软件源码以及程序执行信息情况下,对失败测试用例进行分类,达到对故障用例进行预处理、降低聚类过程时间、提高预测效果、减少检查行数的需求。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的方法流程示意图。
图2为本发明提供的一种结合动态切片的软件多故障聚类定位方法的框图;
图3为本发明实施例提供的试验评估方法流程图;
图4为本发明实施例提供的聚类方法对比效果图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1
实施例1公开了一种结合动态切片的软件多故障聚类定位方法,包括:
S1,执行用于软件故障定位的测试用例集合,获得测试信息,并根据所述测试信息获得程序谱;
S2,利用动态切片工具获取程序切片信息;
S3、利用程序切片信息对程序谱中的程序语句进行筛选,获取子程序谱;
步骤S2、S3可通过java动态切片工具slicer4j,利用程序报错信息对原程序进行切片,筛选出与故障变量相关的程序切片信息。slicer4J使用低开销的工具来收集运行时执行跟踪;具体的,通过构建一个线程感知的、过程间的动态控制流图,并使用该图计算程序切片信息,获取程序切片的子程序谱,子程序谱相对于原本的程序谱与故障变量更加密切相关,并且特征更少。
此外为了进一步减少程序谱中的特征,还包括将程序切片信息中与故障变量无关的程序语句删除,如将程序切片信息中的print语句删除。
S4,计算每个子程序谱中的程序语句的代码可疑度,基于所述代码可疑度对子程序谱中的程序语句进行排序,并用所述子程序谱中程序语句的可疑度排名表示测试用例;所述测试用例表示包括失败测试用例,及成功测试用例;
步骤S4中,计算每个子程序谱中的程序语句的代码可疑度,具体包括:
利用4种故障定位特征算子来对程序中语句进行怀疑度赋值,构建怀疑度函数,得到每个子程序谱中的程序语句的代码可疑度,计算公式为:
nef(q)是指对于程序语句q,在测试用例集中,执行了程序语句q且测试结果与实际结果不一致的测试用例数量;
nnf(q)是指对于程序语句q,在测试用例集中,没有执行程序语句q且测试结果与实际结果不一致的测试用例数量;
nep(q)是指对于程序语句q,在测试用例集中,执行了程序语句q且测试结果与实际结果一致的测试用例数量;
nnp(q)是指对于程序语句q,在测试用例集中,没有执行程序语句q且测试结果与实际结果一致的测试用例数量。
在一个实施例中,对失败测试用例进行特征表示,统计测试用例结果,记为ei,i为自然数,i表示第i个测试用例,e=0,1(ei的值取0或1),其中1表示实际结果与测试结果不一致,测试用例失败,0表示实际结果与测试结果一致,测试用例成功;
统计测试用例语句执行信息,记为aiq,aiq=1时表示第i个测试用例在执行时执行了语句q,反之,aiq=0表示第一个测试用例在执行时没有执行语句q;
根据特征谱矩阵,此时4种故障定位特征算子nef(q)、nnf(q)、nep(q)和nnp(q)用来确定用例覆盖率向量和用例执行结果向量的相似度和不匹配程度,可由以下公式得到:
nef(q) =|{i|aiq = 1 Λ e=1}|
nnf(q) =|{i|aiq = 0 Λ e=1}|
nep(q) =|{i|aiq = 1 Λ e=0}|
nnp(q) =|{i|aiq = 0 Λ e=0}|
S5、利用聚类算法对失败测试用例进行聚类,获取多个分类簇;
具体包括:
S51、计算任意两个失败测试用例之间的距离,所述距离即两个子程序谱中程序语句的可疑度排名之间的肯德尔距离
其中,ω,σ分别代表两个失败测试用例,si,sj分别代表子程序谱中第i,j行代码的可疑度排名,N表示子程序谱中代码总行数,K'()表示K函数;
通过使用程序切片信息获取子程序谱,由于子程序谱中的特征数量减少,因此计算得到的肯德尔距离也相应减小;
考虑到程序切片会大大减少程序谱中的程序语句数量,
当(ω(si)-ω(sj))×(σ(si)-σ(sj)) < 0时,
则K'(si,sj)= (ω(si)‐1 +ω(sj)‐1 +σ(si)‐1 +σ(sj)‐1);
否则K'(si,sj)= 0。
这里,ω(si)代表在失败测试用例ω中的第i行代码si的可疑度排名,ω(sj)代表在失败测试用例ω中的第j行代码sj的可疑度排名;σ(si)代表在失败测试用例σ中的第i行代码si的可疑度排名,σ(sj)代表在失败测试用例σ中的第j行代码sj的可疑度排名;排名越高,对距离的影响越大。
S52、根据任意两个失败测试用例之间的肯德尔距离为每个失败测试用例可疑度排名分配隐藏值:
值得说明的是本发明中,使用子程序谱中程序语句的可疑度排名表示失败测试用例以及成功测试用例。
为每个失败测试用例可疑度排名ri分配隐藏值,其中1≤i≤n,n表示失败测试用例总个数,计算公式如下,
公式中,表示每个失败测试用例可疑度排名的隐藏值,α表示相关参数;
S53、迭代更新隐藏值,获取初始聚类中心;
在每次迭代过程中,更新隐藏值,
其中,表示θ轮时的隐藏值,表示θ+1轮时的隐藏值,Rθ表示在θ轮中隐藏值最高的失败测试用例可疑度排名,Mθ表示θ轮中可疑度排名的隐藏值最高的隐藏值,β表示相关参数。可见,在下一轮迭代过程中,距离之前中心点越近的点,其隐藏值下降越大。当所有节点的最高隐藏值下降到一定程度时,停止聚类中心选取的迭代。
S54、根据初始聚类中心利用K-medoids聚类算法完成失败测试用例的聚类。
步骤S54中利用K-medoids聚类算法完成失败测试用例的聚类,具体包括:
S541、根据其余各点到各中心点的距离,把距离最近的中心点作为自己所属的簇;计算每一簇群中所有代码可疑度排名的排列与其中心点之间距离总和dc
S542、在每一簇群中,依次选取其他排列,计算该排列与同一簇群中其他排列的距离总和de,并与步骤S541中的dc比较,若存在de< dc则选取对应排列作为新的聚类中心,并重复步骤S541-S542,直到聚类中心不再变化,得出聚类结果。
S6、根据分类结果,再次计算每个分类簇中的程序语句的代码可疑度,按照新的代码可疑度排名从高到低进行筛查,直至筛查到故障语句,并完成故障修复。
为了进一步优化上述技术方案,上述方法还包括采用expense分数对故障语句的定位效果进行评估;
将所述失败测试用例集的特征表示构成数据集,并根据聚类算法构建故障分类,采用expense分数来评估其故障定位的效果:
其中,sf表示程序中某一故障语句,Examined表示成功定位故障语句sf需要检查的程序语句数量,Total表示程序所有语句数量。expense分数表示在首个故障被成功定位前需要检查语句占程序所有语句数量的百分比,其值越小,说明调试人员需要检查的语句数量越少,故障定位算法效率越高,反之则越低。
实施例2
另一方面,本发明还提供一种结合动态切片的软件多故障聚类定位装置,包括:
测试执行模块,用于获取对于软件的测试用例集并自动执行测试,获得测试信息;
程序谱生成模块,用于基于所述测试信息获得程序谱;其中,所述程序谱中包括:测试成功的成功测试用例、测试失败的失败测试用例、以及成功测试用例、失败测试用例分别对应的代码执行和覆盖信息;
程序谱筛选模块,用于利用动态切片工具对程序谱进行筛选,获取子程序谱;
可疑度计算模块,用于针对每一个子程序谱,计算此子程序谱中每个程序语句的代码可疑度,并基于所述代码可疑度对此子程序谱中的程序语句进行排序,用以生成与多个子程序谱相对应的多个代码可疑度排名,并将代码可疑度排名用以表示失败测试用例及成功测试用例;
聚类分析模块,用于运用K-medoids聚类算法对多个失败测试用例进行聚类分析,生成多个分类簇;
新程序谱生成模块,用于根据分类结果对每个分类簇再次计算进行代码可疑度计算并排名,得到新的子程序谱;
故障修复模块,用于针对每一个新的子程序谱中的代码可疑度排名,从高到低进行筛查,直至筛查到故障语句,并完成故障修复。
为了进一步优化上述方案,所述装置还包括评估模块,所述评估模块用于采用expense分数来评估故障语句的故障定位的效果。
为评估本发明故障定位性能,其实验评估方法如图3所示,由于现实中多故障数据集中的每个项目的不同版本中只存在1-2个故障,因此本实验中采用对实际项目进行故障注入的方式获取多故障版本的程序,研究本发明在软件多故障定位领域的效果。
实验步骤如下所示:
步骤一:选择用于软件故障定位任务的Defects4J数据集,来源于17个Java开源项目(比如可从网址为https://github.com/rjust/defects4j上下载开源数据),数据集的基本描述信息如表1所示。
表 1 Defects4J数据集项目信息
本发明以Math项目的41版本为例进行故障注入,部分故障信息如表2所示,为评估本发明方法针对多故障场景的有效性,将利用故障信息,生成包含2、3、4、5个故障语句的故障版本。
表 2 部分故障信息
以Math项目41版本的故障注入项目v_6_8_11_12为例,其中6,8,11,12表示将表 2中编号为6,8,11,12的故障语句注入。
步骤二:通过slicer4j工具获取每个失败测试用例的动态切片。具体步骤如下:
步骤2.1:项目打包,并根据报错信息执行动态切片脚本。以math项目41版本,注入故障v_6_8_11_12为例,出现故障:
org.apache.commons.math.stat.descriptive.moment.VarianceTest#testWeightedVarianc
针对该故障报错信息,执行slicer4j获得程序切片,切片信息如下:
org.apache.commons.math.stat.descriptive.moment.Variance:318
org.apache.commons.math.stat.descriptive.AbstractUnivariateStatistic:222
org.apache.commons.math.stat.descriptive.AbstractUnivariateStatistic:267
org.apache.commons.math.stat.descriptive.AbstractUnivariateStatistic:274
org.apache.commons.math.stat.descriptive.AbstractUnivariateStatistic:268
通过执行所有的报错信息,得到所有切片结果。
步骤2.2:合并每个故障的切片结果,合并重复语句,最终获得一个集合,以v_6_8_11_12项目为例,最终形成切片的代码行数66行,原来程序谱1883行占比3.5%。
步骤三:利用切片信息对原本失败测试用例执行语句进行筛检,即故障变量程序切片(与故障变量值变化相关的若干行代码)与原始程序谱程序语句的交集。
步骤四:利用筛检后的失败测试用例特征表示计算聚类的初始中心点,初始中心点根据每次迭代过程中的隐藏值确定,隐藏值计算如步骤S52所示,隐藏值迭代可由步骤S53得出。
经计算,以v_6_8_11_12为例,生成2个初始中心点。
步骤五:依据初始中心点对失败测试用例的特征表示进行聚类,以步骤S54为标准进行迭代更新。
步骤六:使用最终的分类结果与成功测试用例集合结合,使用基于程序谱的故障定位技术对程序语句赋予怀疑度,并采用分类任务的性能评价指标对其性能进行评估。例如v_6_8_11_12项目3个类别的最优性能为99.85%、99.93%,最差性能分别为99.63%、96.49%。
为了和本发明提出的方法进行比较,选择了两种对比方法,分别为:无聚类方法,和不采用特征筛选的Mseer多故障定位方法(Mseer方法为目前现有技术中多故障定位算法中效果最好的方法)与本发明改进的故障定位方法进行比较。实验比较中随机对Math项目的41无故障版本注入2、3、4、5个故障,每种故障版本生成10个,实验结果采用均值。
采用常用的故障定位性能指标expense进行评价,每个方法的特定版本的评价指标有两个,分别为最优与最差情况下的expense,实际情况位于这两种情况中间。由于在多故障场景下,需要考察的内容还有分类的准确度,因此不同算法分析项目生成的故障数目也进行对比。
表3 部分实验结果
通过上面表3的实验结果,可以发现,在expense指标上,本发明改进方法普遍优于原本多故障定位方法,对比无聚类方法也略有提升。
表4最优情况下expense分数
表5 最差情况下expense分数
通过表4数据显示,本发明改进方法在最优情况下,expense分数对比无聚类方法提升了0.95%,且相对无聚类方法产生了更多类别,对比原本Mseer方法提升了2.88%,且在聚类数量上比Mseer更加接近真实值也更少;
通过表5数据显示,本发明改进方法在在最差情况下,expense分数对比无聚类方法提升了0.21%,对比原本Mseer方法提升了7.61%;
另外在聚类数量方面,如图4所示,原本Mseer方法平均预测的故障数量在8.65左右,预测数量比实际数量多,与实际故障数量有较大差距,且随着实际故障数量的增加,预测数量并没有随着实际故障的增加产生变化;本发明改进方法平均预测故障数量是2.15,预测数量比实际数量少,由于本发明案例中不同故障源导致的失败测试用例数量差别较大,因此预测数量较少更加接近真实值,可以发现,当软件中故障增多时,本发明改进方法对故障数量的感知更加明显,而原本方法Mseer由于选取的特征中存在大量无关语句,导致数量增多时,聚类数量变化不明显;并且,Mseer分类数量过多,产生较大误差,而本发明产生的分类数量较少,有利于在进行并行调试的同时提高故障定位效率。
本发明利用动态切片在原始程序语句中选择特征,通常在程序切片中的语句与故障的相关性越高,相关性越高,越容易体现数据的特性,通过这些特性,越能找出合适的初始中心点以及聚类结果。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (6)

1.一种结合动态切片的软件多故障聚类定位方法,其特征在于,所述方法包括以下步骤:
S1、执行用于软件故障定位的测试用例集合,获得测试信息,并根据所述测试信息获得程序谱;
S2、利用动态切片工具获取程序切片信息;
S3、利用程序切片信息对程序谱中的程序语句进行筛选,获取子程序谱;
具体包括通过构建一个线程感知的、过程间的动态控制流图,并使用该图计算程序切片信息,获取程序切片的子程序谱;
还包括将程序切片信息中与故障变量无关的程序语句删除,所述与故障变量无关的程序语句包括程序切片信息中的print语句;
S4、计算每个子程序谱中的程序语句的代码可疑度,基于所述代码可疑度对子程序谱中的程序语句进行排序,并用所述子程序谱中程序语句的可疑度排名表示测试用例;所述测试用例表示包括失败测试用例,及成功测试用例;
S5、利用聚类算法对失败测试用例进行聚类,获取多个分类簇;具体包括:
S51、计算任意两个失败测试用例之间的距离,所述距离即两个子程序谱中程序语句的可疑度排名之间的肯德尔距离
Figure FDA0004094640650000011
其中,ω,σ分别代表两个失败测试用例,si,sj分别代表子程序谱中第i,j行代码的可疑度排名,N表示子程序谱中代码总行数,K'()表示K函数;
S52、根据任意两个失败测试用例之间的肯德尔距离为每个失败测试用例可疑度排名分配隐藏值;
S53、迭代更新隐藏值,获取初始聚类中心;具体包括,
Figure FDA0004094640650000012
其中,Pi θ表示θ轮时的隐藏值,Pi θ+1表示θ+1轮时的隐藏值,Rθ表示在θ轮中隐藏值最高的失败测试用例可疑度排名,Mθ表示θ轮中可疑度排名的隐藏值最高的隐藏值,β表示相关参数;
S54、根据初始聚类中心利用K-medoids聚类算法完成失败测试用例的聚类;
S6、根据分类结果,再次计算每个分类簇中的程序语句的代码可疑度,按照新的代码可疑度排名从高到低进行筛查,直至筛查到故障语句,并完成故障修复。
2.根据权利要求1所述的结合动态切片的软件多故障聚类定位方法,其特征在于,上述方法还包括采用expense分数对故障语句的定位效果进行评估。
3.根据权利要求1所述的结合动态切片的软件多故障聚类定位方法,其特征在于,步骤S4中,计算每个子程序谱中的程序语句的代码可疑度,具体包括:
利用4种故障定位特征算子来对程序中语句进行怀疑度赋值,构建怀疑度函数,得到每个子程序谱中的程序语句的代码可疑度,计算公式为:
Figure FDA0004094640650000021
nef(q)是指对于程序语句q,在测试用例集中,执行了程序语句q且测试结果与实际结果不一致的测试用例数量;
nnf(q)是指对于程序语句q,在测试用例集中,没有执行程序语句q且测试结果与实际结果不一致的测试用例数量;
nep(q)是指对于程序语句q,在测试用例集中,执行了程序语句q且测试结果与实际结果一致的测试用例数量;
nnp(q)是指对于程序语句q,在测试用例集中,没有执行程序语句q且测试结果与实际结果一致的测试用例数量。
4.根据权利要求1所述的结合动态切片的软件多故障聚类定位方法,其特征在于,步骤S54中,利用K-medoids聚类算法完成失败测试用例的聚类,具体包括:
S541、根据其余各点到各中心点的距离,把距离最近的中心点作为自己所属的簇;计算每一簇群中所有代码可疑度排名的排列与其中心点之间距离总和dc
S542、在每一簇群中,依次选取其他排列,计算该排列与同一簇群中其他排列的距离总和de,并与步骤S541中的dc比较,若存在de<dc则选取对应排列作为新的聚类中心,并重复步骤S541-S542,直到聚类中心不再变化,得出聚类结果。
5.一种结合动态切片的软件多故障聚类定位装置,其特征在于,包括:
测试执行模块,用于获取对于软件的测试用例集并自动执行测试,获得测试信息;获取子程序谱,
具体包括通过构建一个线程感知的、过程间的动态控制流图,并使用该图计算程序切片信息,获取程序切片的子程序谱;
还包括将程序切片信息中与故障变量无关的程序语句删除,所述与故障变量无关的程序语句包括程序切片信息中的print语句;
程序谱生成模块,用于基于所述测试信息获得程序谱;其中,所述程序谱中包括:测试成功的成功测试用例、测试失败的失败测试用例、以及成功测试用例、失败测试用例分别对应的代码执行和覆盖信息;
程序谱筛选模块,用于利用动态切片工具对程序谱进行筛选,获取子程序谱;
可疑度计算模块,用于针对每一个子程序谱,计算此子程序谱中每个程序语句的代码可疑度,并基于所述代码可疑度对此子程序谱中的程序语句进行排序,用以生成与多个子程序谱相对应的多个代码可疑度排名,并将代码可疑度排名用以表示失败测试用例及成功测试用例;
聚类分析模块,用于运用K-medoids聚类算法对多个失败测试用例进行聚类分析,生成多个分类簇;具体包括:
S51、计算任意两个失败测试用例之间的距离,所述距离即两个子程序谱中程序语句的可疑度排名之间的肯德尔距离
Figure FDA0004094640650000031
其中,ω,σ分别代表两个失败测试用例,si,sj分别代表子程序谱中第i,j行代码的可疑度排名,N表示子程序谱中代码总行数,K'()表示K函数;
S52、根据任意两个失败测试用例之间的肯德尔距离为每个失败测试用例可疑度排名分配隐藏值;
S53、迭代更新隐藏值,获取初始聚类中心;具体包括,
Figure FDA0004094640650000041
其中,Pi θ表示θ轮时的隐藏值,Pi θ+1表示θ+1轮时的隐藏值,Rθ表示在θ轮中隐藏值最高的失败测试用例可疑度排名,Mθ表示θ轮中可疑度排名的隐藏值最高的隐藏值,β表示相关参数;
S54、根据初始聚类中心利用K-medoids聚类算法完成失败测试用例的聚类;
新程序谱生成模块,用于根据分类结果对每个分类簇再次计算进行代码可疑度计算并排名,得到新的子程序谱;
故障修复模块,用于针对每一个新的子程序谱中的代码可疑度排名,从高到低进行筛查,直至筛查到故障语句,并完成故障修复。
6.根据权利要求5所述的结合动态切片的软件多故障聚类定位装置,其特征在于,所述装置还包括评估模块,所述评估模块用于采用expense分数来评估故障语句的故障定位的效果。
CN202211453054.4A 2022-11-21 2022-11-21 一种结合动态切片的软件多故障聚类定位方法及装置 Active CN115576851B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211453054.4A CN115576851B (zh) 2022-11-21 2022-11-21 一种结合动态切片的软件多故障聚类定位方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211453054.4A CN115576851B (zh) 2022-11-21 2022-11-21 一种结合动态切片的软件多故障聚类定位方法及装置

Publications (2)

Publication Number Publication Date
CN115576851A CN115576851A (zh) 2023-01-06
CN115576851B true CN115576851B (zh) 2023-05-05

Family

ID=84588372

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211453054.4A Active CN115576851B (zh) 2022-11-21 2022-11-21 一种结合动态切片的软件多故障聚类定位方法及装置

Country Status (1)

Country Link
CN (1) CN115576851B (zh)

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112085065A (zh) * 2020-08-12 2020-12-15 杭州电子科技大学 基于电压和有功功率读数的低压用户入户相别识别方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107643905B (zh) * 2017-09-13 2021-01-12 扬州大学 一种面向软件版本一致性缺陷的自动修复方法
US20200371902A1 (en) * 2019-05-21 2020-11-26 Servicenow, Inc. Systems and methods for software regression detection
CN110362484B (zh) * 2019-07-03 2022-03-01 北京航空航天大学 软件多故障的定位方法、装置、电子设备以及存储介质
CN112711537B (zh) * 2020-12-31 2022-08-12 武汉船舶通信研究所(中国船舶重工集团公司第七二二研究所) 软件缺陷定位方法及装置、电子设备及存储介质

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112085065A (zh) * 2020-08-12 2020-12-15 杭州电子科技大学 基于电压和有功功率读数的低压用户入户相别识别方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Ruizhi Gao 等.MSeer—An Advanced Technique for Locating Multiple Bugs in Parallel.《IEEE TRANSACTIONS ON SOFTWARE ENGINEERING》.2019,第第45卷卷(第第3期期),第301-318页. *
孟颖 ; 罗可 ; 姚丽娟 ; 王琳 ; .一种基于ACO的K-medoids聚类算法.计算机工程与应用.2011,(第16期),全文. *

Also Published As

Publication number Publication date
CN115576851A (zh) 2023-01-06

Similar Documents

Publication Publication Date Title
Natella et al. On fault representativeness of software fault injection
EP2960799A1 (en) Defect localization in software integration tests
Ghandehari et al. A combinatorial testing-based approach to fault localization
US20160342720A1 (en) Method, system, and computer program for identifying design revisions in hardware design debugging
Liu et al. Localizing multiple faults in simulink models
CN110515826A (zh) 一种基于次数频谱与神经网络算法的软件缺陷定位方法
Neelofar et al. Improving spectral‐based fault localization using static analysis
CN111831556A (zh) 软件多故障解耦及并行定位方法及装置
Ye et al. Adaptive board-level functional fault diagnosis using incremental decision trees
Tang et al. Compiler testing: a systematic literature analysis
Yang et al. A lightweight fault localization approach based on xgboost
CN111782532A (zh) 一种基于网络异常节点分析的软件故障定位方法及系统
CN112685320B (zh) 一种基于多候选程序的软件缺陷修复方法及装置
Gao et al. Research on software multiple fault localization method based on machine learning
Baresi et al. Test oracles for simulink-like models
CN115576851B (zh) 一种结合动态切片的软件多故障聚类定位方法及装置
Wong et al. Software Fault Localization: an Overview of Research, Techniques, and Tools
CN115145751A (zh) 微服务系统故障根因定位方法、装置、设备及存储介质
Zhang et al. Improving fault-localization accuracy by referencing debugging history to alleviate structure bias in code suspiciousness
Motwani High-quality automated program repair
Maksimovic et al. Clustering-based revision debug in regression verification
Bodhe et al. Diagnostic Fail Data Minimization Using an $ N $-Cover Algorithm
CN109165155B (zh) 一种基于聚类分析的软件缺陷修复模板提取方法
Tong et al. An approach to pinpointing bug-induced failure in logs of open cloud platforms
Debroy et al. On the consensus-based application of fault localization techniques

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant