开源软件项目很难集中管理。对于存在缺陷的开源软件项目,人们倾向于使用自动化或半自动的工具来管理和维护整个系统,例如使用缺陷跟踪系统来报告、记录、管理和跟踪软件缺陷。随着软件项目的不断扩展,缺陷报告的数量也在不断增加。截至2014年12月,Eclipse开源社区有超过40万个缺陷报告,Mozilla开源社区有超过19万个缺陷报告。由于这些缺陷报告包含了大量的知识,分析和挖掘缺陷报告可以更好地帮助开发人员管理和理解缺陷,从而提高生产效率。但与此同时,提交给缺陷跟踪系统的大量缺陷报告也给缺陷分布带来了压力。例如,在2005年,Eclipse社区每天都会收到大约200个缺陷报告,如此多的缺陷报告增加了开发人员分发和处理这些报告的负担。在Mozilla社区中,管理人员平均每天需要为300个缺陷报告找到合适的开发人员。
典型的软件缺陷报告通常包括许多字段,如状态、摘要、描述、报告者、修复者、建立时间、修改时间、优先级、严重性、操作系统、缺陷版本、平台和注释列表。其中“摘要”和“描述”字段用自然语言描述,如缺陷是如何被发现的、缺陷抛出的异常、缺陷重现的步骤等。“修复者”字段指示当前缺陷报告的修复者;“严重性”和“优先级”从两个不同的方面解释了缺陷报告的重要性。“严重程度”主要由缺陷报告的提交者根据缺陷对软件系统的危害性来决定。“优先级”主要由修复缺陷的开发人员根据当前的工作量和缺陷的严重程度来决定。研究表明,高质量的缺陷报告可以帮助开发人员更好地修复缺陷。
此外,缺陷报告具有各种状态,如“新的”、“已解决”、“已修复”、“已关闭”、“无效”、“重复”、“已重新打开”等。这些状态构成了缺陷报告的生命周期。当提交缺陷报告时,其状态为“未确认”,这要求开发人员验证报告是否包含真实缺陷。如果报告中描述的缺陷不是真正的缺陷,则报告的状态变为“已解决”和“无效”;如果此缺陷报告与之前提交的缺陷报告之间存在重复关系,其状态将变为“已解决”和“重复”。如果不满足上述两个条件,可以确认缺陷报告中包含真实缺陷,报告状态将变为“新”。之后,系统人员将此缺陷分配给合适的开发人员,报告的状态将变为“已分配”。开发人员修复缺陷后,会将缺陷的状态更改为“已解决”和“已修复”。然后,其他开发人员评估缺陷并审查代码。如果缺陷被验证成功修复,缺陷报告的状态将变为“已验证”。最后,缺陷报告状态为“关闭”。有时,缺陷会在未来的某个时间重新出现,缺陷报告的状态会变为“重新打开”。项目经理需要重新分配缺陷,然后开发人员可以修复缺陷。
围绕缺陷报告的生命周期有几个研究点:当缺陷报告的状态从“新”变为“已分配”时,需要推荐合适的开发人员,并预测缺陷的严重程度和优先级。由于一个开源软件有成千上万的开发人员,及时将缺陷报告分发给合适的修复人员可以缩短缺陷修复的时间。此外,为了提高开发人员的工作效率,预测缺陷的严重性和优先级可以使开发人员更合理地安排工作,提高工作效率。
缺陷报告的状态由“已分配”变为“已解决”,需要:判断缺陷报告是否为重复缺陷报告;识别缺陷的类型;预测整个缺陷修复过程所需的时间;找到与此缺陷相关的源代码。此外,当缺陷报告的状态从“已解决”变为“已关闭”时,需要判断缺陷是否会“重新打开”。
1.维修人员推荐的缺陷报告
修复者推荐是指找到合适的开发人员进行缺陷修复,可以减少相关人员的工作量,提高缺陷修复的效率。有人用机器学习技术推荐缺陷报告修复者。首先提取缺陷报告的摘要和描述字段,通过词干提取、停用词去除等自然语言处理方法将文本转化为词包,然后通过机器学习相关算法推荐修复者。有人提出了一种基于模糊集的算法Bugzie,缓冲每个开发人员的最佳描述词,然后用这些词来衡量开发人员对缺陷报告的适用性。有人讨论了Mozilla和Eclipse开源社区中的缺陷报告修复器重置现象,通过建立修复器关系重置图,采用基于马尔可夫链的图模型,提高了推荐缺陷报告修复器的准确性。
缺陷报告修复者推荐是缺陷管理和分析自动化的经典研究问题,目前已经有很多相对成熟的工作。这类问题的难点之一就是如何从大量的开发者中找到最合适的与缺陷相关的修复人员。因此,可以将推荐系统、文本挖掘和社会网络挖掘结合起来,进一步提高预测精度。
2.预测缺陷严重程度和优先级
对缺陷严重性和优先级的预测可以帮助开发人员安排工作进度。一般严重程度高的缺陷修复优先级较高。有人通过分析NASA相关系统的缺陷报告,提出了预测缺陷报告严重程度的问题。在此基础上,有人预测缺陷报告是否严重。有些人使用不同的分类算法来预测缺陷报告的严重程度。实验结果表明,多项式朴素贝叶斯效果最好。有人通过集成最近邻搜索和扩展BM25方法来预测缺陷报告的严重程度。
目前,关于缺陷优先级预测的研究很少。缺陷的优先级别不同于缺陷的严重级别。田等指出,“缺陷的严重程度由缺陷报告的提交者决定,而缺陷的优先级由最终修复缺陷的开发者决定”。因此,需要不同的策略来预测缺陷的优先级。田等分析了多特征缺陷报告的优先级别,并建立了logistic回归模型来预测新的缺陷报告优先级别。
预测缺陷的严重程度和优先级的难点在于数据集的不平衡,即只有少数缺陷报告属于严重程度,使得预测精度难以达到理想值,从而影响实际使用效果。这个问题的未来解决方案可以集中在提取表示严重缺陷报告的特征和研究先进的不平衡数据处理机器学习的相关算法。
3.重复缺陷报告的发现
开源软件项目中存在大量的历史缺陷报告,用户和开发者会不断提交新的缺陷报告。新提交的缺陷报告可能会重复历史缺陷报告。开发人员修复这些重复的缺陷会造成资源的极大浪费,导致那些真正的缺陷无法及时修复。因此,研究重复缺陷报告的发现具有重要意义。信息检索算法可以帮助解决发现重复缺陷的问题。这种方法的基本思想是给出一个缺陷报告,并推荐与其相似度最高的缺陷报告作为可能的重复报告。有些人使用vector 空之间的模型来建模缺陷报告,并将其转换为文本特征向量。每个文本向量的值是对应单词的词频和逆文件频率。已经提出将向量空模型与自然语言处理技术相结合来提高预测性能。有些人使用执行轨迹上的信息来发现重复的缺陷报告。有人将BM25与主题模型相结合,提高发现重复缺陷报告的效率。
机器学习相关算法也可以用来解决发现重复缺陷的问题。有人根据缺陷报告的文本特征,利用线性回归方法形成二进制分类器。有人提出了一种判别模型,利用支持向量机来识别重复的缺陷报告。有人基于缺陷报告的不同领域对发现重复缺陷报告的影响,对BM25算法进行了扩展。目前,在重复缺陷报告的发现方面已经做了大量的工作,研究方向也比较成熟。其中,国际会议ASE2013优秀论文奖提出的算法将主题模型与信息检索模型相结合。未来对重复缺陷报告发现的研究需要更加注重与深度学习技术的结合,从而提出更加完善的解决方案。
4.重新打开缺陷预测报告
在软件缺陷生命周期中,有时一个“关闭的”缺陷会被“重新打开”。“重新开放”的缺陷会延长修复时间。希哈布等人研究了Eclipse社区中的缺陷重新打开现象,提取了四类特征,并应用机器学习相关算法预测缺陷是否会重新打开。考虑到重新打开的缺陷数量相对较少,希哈布等人提出使用不平衡数据挖掘算法。之后,他们进一步研究了在Apache Http和OpenOffice上“重新打开”的缺陷。一些人将希哈布等人提出的特征与缺陷报告的文本特征相结合,开发了一种称为重新手术预测器的预测器。有人分析了微软Windows操作系统中的缺陷“重新打开”,并提出了一种逻辑方法来预测缺陷是否会被重新打开。这部分缺陷报告的难点在于如何提取与重新打开缺陷报告相关的特征。目前的研究主要基于缺陷报告本身的特征挖掘。未来,重新打开缺陷报告的预测应该考虑更多的补丁文件和每个缺陷报告对应的其他材料,并从中提取更多的特征,进一步提高预测精度。
5.缺陷修复时间的预测
缺陷修复时间预测主要是预测某一给定缺陷将在何时修复,有助于项目经理掌握项目进度,制定合适的项目计划。有人调查过ArgoUML和PostgresQL的缺陷生命周期,发现缺陷的修复时间中位数为200天。为了有效预测缺陷的修复时间,有人使用机器学习模型;有人在NASA 空的数据集上使用过人工神经网络。有人把缺陷报告的修复时间分为两类,并据此建立分类器。该算法的预测准确率为65%;有人提出了一种基于关联规则挖掘的算法。有些人已经了解了缺陷的生命周期,并在JBoss项目上使用k-近邻算法来预测缺陷的修复时间。有人利用马尔可夫模型预测一定时间内修复的缺陷数量,提出了基于蒙特卡罗抽样的缺陷修复时间预测模型。目前,关于缺陷修复时间预测的研究工作并不多,主要是因为很难得到花费在缺陷修复上的真实时间。如何自动识别缺陷修复参与者的行为以及这些行为所占用的时间将是一个值得研究的问题。
6.缺陷位置
缺陷位置是指定位与缺陷报告相关的源代码位置。缺陷定位是软件工程中的核心问题。准确的缺陷定位工具可以大大节省开发人员的调试时间,提高工作效率。目前,相关算法主要基于信息检索和机器学习。提出了PROMESIR算法,利用隐藏语义电缆和基于概率的排序技术对源代码文件进行排序。已经提出使用潜在的狄利克雷分配算法来定位相关的源代码文件。有人用不同的信息检索技术验证缺陷定位的效果,发现UM和ⅴ SM对iBUgs的缺陷定位效果最好。有人提出了BugLocator算法,主要考虑基于相似源代码文件的排序和基于相似缺陷报告的排序。有些人利用缺陷报告和源代码文件的结构信息来帮助提高缺陷报告定位的性能。有人利用常规排序算法来提高缺陷定位算法的效果。
目前缺陷定位的算法精度有待进一步提高,相关算法只能定位与缺陷相关的源代码文件级,属于粗粒度定位,影响了相关算法的工程实用性。未来可以考虑结合深度学习提出更高效的算法。此外,还应考虑与编程语言分析和模型检查的相关技术相结合,使缺陷定位技术能够精确到代码片段的粒度。
7.缺陷分类
缺陷分类是指自动识别给定缺陷报告的类别。通过分析项目中存在的缺陷类型,可以更好地理解和总结项目开发和测试中存在的问题,对以后的项目具有指导意义。但是在实践中,由于开发团队资源有限,项目发布时间紧,很少有项目团队对缺陷进行总结,因此自动缺陷分类技术非常必要。有些人使用机器学习算法根据缺陷报告的影响对其进行分类;有人提出了一种基于文本挖掘的算法来识别安全相关的缺陷报告。有人通过缺陷报告摘要和描述字段的语言特征来论证缺陷报告和需求的区别;有人提出了一种自动识别缺陷报告和需求的方法。基于正交缺陷分类,有人基于数据和控制流、结构缺陷和非功能缺陷定义缺陷,通过提取缺陷报告和源代码的特征,对缺陷报告进行自动分类;有人利用集成学习的相关算法,提出了一种自动识别和定位缺陷的算法。
由于缺陷报告的分类标准不统一,实际研究需要结合应用场景的具体要求。未来的一个发展方向是建立多维度的缺陷分类技术,即给出缺陷报告并预测其所属的缺陷类别。