摘要

基于频谱的故障定位(Spectrum-Based Fault Localization, SBFL)技术已被广泛研究,可以帮助开发人员快速找到程序错误位置,以降低软件测试成本。然而,测试套件中存在一种特殊的测试用例,其执行了错误的语句但却能输出符合预期的结果,这种测试用例被称为偶然正确(Coincidental Correct, CC)测试用例。CC测试用例会对SBFL技术的性能产生负面影响。为了减轻CC产生的负面影响,提升SBFL技术性能,本文提出了一种基于机器学习的CC测试用例识别方法(CC test cases Identification via Machine Learning, CCIML)。CCIML结合怀疑度公式特征和程序静态特征来识别CC测试用例,从而提高SBFL技术的故障定位精度。为了评估CCIML方法的性能,本文基于Defects4J数据集进行对比实验。实验结果表明,CCIML方法识别CC测试用例的平均召回率、准确率和F1分数分别为63.89%、70.16%和50.64%,该结果优于对比方法。除此之外,采用清洗和重标策略处理CCIML方法识别出的CC测试用例后,最终取得的故障定位效果也优于对比方法。其中,在清洗策略和重标策略下,错误语句怀疑度值排在第一位的数量分别为328、312,相比于模糊加权K近邻(Fuzzy Weighted K-Nearest Neighbor, FW-KNN)方法,定位到的故障数量分别增长了124.66%、235.48%。