论文部分内容阅读
在软件的开发过程中,缺陷的查找和修复是保证软件质量非常重要的一环。然而,这一过程往往耗费大量的时间和人力。如果能够在软件测试阶段,甚至在每次代码变更结束后,立即预测其是否会引入缺陷,以便快速修复,对软件开发效率将会有一个显著的提升。软件的开发过程中,通常会使用一些版本控制系统工具来记录软件的历史演变信息,包括开发过程中的缺陷修复信息。而机器学习的思想是通过已有的信息和知识,来对新的事物进行推测和评估。本文从软件的缺陷修复信息入手,从缺陷修复变更追溯到那些引入缺陷的变更,然后根据这些带有缺陷倾向的变更的属性特征,应用机器学习的方法,对什么样的变更容易引入缺陷进行建模。依据这些模型,可以预测软件开发中新产生的代码变更是否会引入缺陷,进而采取相应的措施及早发现、定位和修复潜在的缺陷。成熟的项目一般可以提供丰富的历史信息,用以进行机器学习建立预测模型,预测代码变更是否会引入缺陷,而对于一些新项目,或者一些特殊领域的项目,缺乏足够多的历史数据,这时候可以借鉴跨项目学习的思想,在数据源丰富的项目中学习知识,然后应用于数据稀少的项目中。目前,对于跨项目的缺陷预测有许多研究,但是普遍预测效果不理想,在一个项目中训练学习得到的预测模型,在另外一个项目上往往不是很适用。出现这样现象的原因主要是两个项目间数据分布差异过大,而传统的机器学习方法在训练集和测试集数据分布一致时才适用。其次,这些研究大都是基于文件级别的变更进行预测的,粒度过大,这样导致的问题是判定有缺陷倾向的文件后,还需要花费一定的开销来寻找具体产生缺陷的代码行位置,当文件过大时,这样的开销也是难以接受的。本文从软件的历史演变信息出发,将文件级别的代码变更转换为细粒度的代码变更实体,从细粒度的角度来预测缺陷倾向。对于跨项目缺陷预测效果不好的原因——项目间数据分布不一致,本文应用迁移学习的思想,提出了基于迁移学习的跨项目缺陷预测方法,通过将两个项目的数据集映射到一个潜在的特征空间来最小化项目间数据分布差异,然后应用传统的机器学习中的分类方法来预测代码变更的缺陷倾向。同时,为了进一步提高缺陷预测的效果,本文还提出了特征值选择方法、归一化选择方法、类别不平衡处理方法来逐步提高预测效果。实验中,本文选取了数据集ReLink和数据集AEEEM。设计了 3组对照实验,分别通过比较说明了特征值选择方法、归一化选择方法、类别不平衡处理方法对缺陷预测效果的提升,同时通过与其他方法的对比,说明了本文细粒度代码变更的跨项目缺陷预测方法的有效性。最后,从经验性的角度评估了采用细粒度级别的代码变更预测缺陷的优势。