APP下载

融合测试异味的即时缺陷预测模型探究

2022-05-10殷瑞笛吴海涛高建华黄子杰

小型微型计算机系统 2022年4期
关键词:度量异味代码

殷瑞笛,吴海涛,高建华,黄子杰

1(上海师范大学 计算机科学与技术,上海 200234)

2(华东理工大学 计算机科学与技术,上海 200237)

1 引 言

在软件维护和进化过程中,开发人员不断修改源代码,以引入新功能或修复缺陷.然而,这些修改可能会引入新的缺陷[1],因此开发人员必须仔细验证代码的可靠性,进行软件质量保障(SQA)活动.SQA往往在开发或测试过程中进行[2],或者在代码审查时执行[3].然而,对所有的代码执行SQA将耗费大量的人力资源,研究人员通过缺陷预测为SQA的计划提供依据.缺陷预测[4]是一种关于源代码或开发过程的信息构建统计模型来预测软件的缺陷,进而将检查和测试资源分配给更可能存在缺陷的源代码部分的有效方法.

大多数现有的缺陷预测方法都是通过进行长期预测即分析以前软件版本中积累的信息,来预测哪些工件在未来版本中更容易出现缺陷.但Kamei等人[5,6]发现粗粒度、非即时的缺陷预测模型在实践中的作用可能有限,因为它们不能为开发人员提供即时的反馈,因此不能避免在将工件提交到存储库的过程中引入缺陷.为了克服这一限制,Kamei等人[5,6]提出了即时缺陷预测,即针对细粒度的代码提交特征进行预测,使开发人员可以关注具体的代码提交,从而提高缺陷预测对开发活动的响应性.然而Kamei等人实验研究的即时缺陷预测模型中,所利用的也只是提交信息中的一部分,即代码度量、过程度量和开发人员相关的因素.软件测试作为软件开发过程中的一个重要部分与生产代码的质量息息相关[7],并没有在Kamei等人的研究中被利用.

为了保证软件在更新迭代过程中的可靠性,开发者们引入了回归测试以求保障新增的生产代码的功能的正确性.然而,有研究发现[8,9],大部分开发人员更为重视软件生产代码的质量,而忽略了测试代码中存在的问题,从而使测试代码的质量普遍较低.Van Deursen 等人[10]对测试代码的质量进行了系统的研究,归纳总结出了测试代码中反复出现的设计问题,提出了测试异味这一概念.最近已有不少研究证明了测试异味的存在对生产代码的质量有着不良影响[7,11,12].然而,这些研究并没有对测试异味与生产代码可靠性的关联进行进一步探究,例如,测试异味是否也可以作为一类有效的特征属性来预测生产代码中可能存在的缺陷.

为了探究上述问题,本文在Kamei等人[5,6]研究的基础上,将提交信息中的测试代码所包含的测试异味作为一个新角度的特征属性融合到原有的即时缺陷预测模型中,构建一个包含更多软件开发过程信息的即时缺陷预测模型.在衡量新构建的预测模型性能的同时,本文也将对测试异味作为缺陷预测的特征属性的有效性和不同测试异味对预测输出的影响的差异性进行探究.

本文的主要贡献如下:

1)在原有的即时缺陷预测模型中[5],本文加入了测试异味这一新的特征属性,构建了一个包含软件编写、软件测试以及软件维护的更多角度的即时缺陷预测模型.

2)通过可加性解释模型SHAP[13]对特征贡献度进行了分析,本文研究发现ECT,UT,AR,GF,MNT,ET这6种测试异味对模型输出的影响更为突出,这也为开发人员在关注提交记录和进行问题诊断时,提供了可着重关注的测试异味类型,节省了开发人员的工作量.

3)通过跨系统项目的探究,本文发现不同系统项目中的测试异味对即时缺陷模型的预测输出的影响存在较大差异,但每个项目中都有多种测试异味对缺陷预测的贡献度排在前20位,这也再次证明了开发人员在进行SQA时应该对测试异味给予一定的关注.

本文的结构安排如下,第2节讨论了与研究相关的工作.第3节说明了即时缺陷预测模型的构建.在第4节简述了实验的流程设计,分析并讨论了实验研究的结果,第5节讨论了有效性威胁.最后,第6节总结了论文并概述了未来工作的方向.

2 相关工作

2.1 测试异味

作为源代码的一个子集,测试代码也可能存在设计问题,人们对正确维护和改进测试代码的设计越来越感兴趣[14-16].研究人员和开发者已经开始研究测试用例的质量、识别测试代码中的各种问题[8,9],并创造了“测试异味”这个术语来描述反复出现的测试设计问题,它们可能会损害测试的可靠性和可维护性.近期的研究[9,17,18]发现测试异味在软件系统中广泛存在,并且它们可能不会随着系统的发展而消除.其他研究通过测量存在/不存在测试异味时理解测试代码所花费的时间,研究了测试异味对代码理解的影响[19].此外,Athanasiou等人[20]通过衡量测试异味与软件发布后出现缺陷的相关性,研究了测试异味对软件质量的影响.然而,这些研究仅强调了测试异味对软件可靠性和可维护性的影响分析,而并未将测试异味作为软件质量保障(SQA)活动的资源分配依据,例如将其添加进缺陷预测模型中,以探究测试异味对预测生产代码缺陷的有效性.

2.2 代码度量

代码的结构数据是用诸如McCabe的圈复杂度[21]或Chidamber和Kemerer等人研究中的结构度量[22]等度量来计算的.上述而这些度量的有效性已在缺陷预测的实证研究中被广泛证实[23-27].例如,Nagappan等人[28]发现,基于代码度量的模型在识别容易出现缺陷的类时可以达到高达83%的准确率.而本次试验研究选择部分Chidamber和Kemerer等人实验中的结构度量指标[22]作为代码度量的数据,共6个代码度量,如表1所示.同时使用Chidamber和Kemerer等人实验中使用的代码度量挖掘工具CK,来获取所有项目的代码度量数据.

表1 代码度量描述Table 1 Code metric description

2.3 过程度量

历史数据是用诸如代码行变更、变化熵或与开发人员相关的因素等度量来计算的[26,29-34].同时,也有不少研究人员通过实验验证了历史数据对于提升缺陷预测模型性能的有效性.例如,Moser等人[31]进行了一项比较研究,分析了基于静态分析度量和历史信息度量的分类预测器并得出结论,在项目历史信息上计算的度量表现更佳.

2.4 即时缺陷预测

即时缺陷预测指的是能够对细粒度的代码提交是否存在缺陷进行预测的模型是由Kamei等人[5,6]提出的,它试图进一步减少开发人员的工作量.后来,Kamei等人还评估了即时模型在跨项目缺陷预测中的表现[6].他们发现模型在精确度和召回率方面具备良好性能,同时也节省了开发人员用于代码审查的精力.

2.5 可加性解释模型框架SHAP

SHAP[13,35,36]是基于Shapley值启发的可加性模型解释框架.对于每个预测样本,模型都产生一个预测值,SHAP 值就是该样本中每个特征所分配到的数值.假设第i个样本为xi,第i个样本的第j个特征为xij,模型对于第i个样本的预测值为yi,整个模型的基线(通常是所有样本目标变量的均值)为ybase,

那么SHAP值服见式(1):

yi=ybase+f(xi1)+f(xi2)+f(xi3)+…+f(xik) (1)

其中,f(xik)为xik的SHAP值.f(xik)就是第i个样本中第k个特征对最终预测值yi的贡献值,当f(xik)>0,说明该特征提升了预测值,反之,说明该特征使得预测值降低.

与简单的特征重要性相比,SHAP值最大的优势是它能反映出每一个样本中每个特征的影响力,而且还可以表现出其影响的正反作用.

3 即时缺陷预测模型的构建

本次实验的即时缺陷预测模型的构建主要分为3个步骤:1)确定进行缺陷预测的3个角度所包含的特征属性;2)对已选择的特征进行相关性分析;3)特征筛选和机器分类模型的选择.

3.1 模型特征的确定

由于软件开发涉及软件开发、软件测试、软件维护这3个过程,本文受此启发,考虑建立一个涵盖上述3种方面的即时缺陷预测模型.

对于软件开发这一角度的特征属性,本实验决定选用代码度量.通过参考Chidamber和Kemerer等人[22]的实验,选取了他们实验中的部分指标作为本次实验的代码度量,共有6个,如表1所示.

在软件测试方面,本次实验选择Bavota等人[9]提出的测试异味中的17种,如表3所示,作为软件测试这一角度的特征属性添加进由Kamei等人[5,6]提出的即时缺陷预测模型中.这些测试异味在以前的工作中被广泛研究[9,37-40],它们与Java中的单元测试实践相关.为了识别测试异味,本文采用了由Peruma等人[41]实现的测试异味检测工具tsDetect来分析所研究的系统.而选择tsDetect的原因主要有:1)tsDetect是静态分析工具,可以实现测试异味的全自动化检测且无需编译软件;2)tsDetect可以同时检测19种测试异味,可检测的种类较为全面;3)在检测测试异味时,tsDetect能够达到至少85%的准确率和90%的召回率,其F-Score为96.5%[41].因为tsDetect是在文件级的粒度上进行测试异味的挖掘,且每条提交记录中涉及多个系统文件的变更,所以本次实验选择统计每条提交记录中具有测试异味的文件数量,作为该条提交记录所包含的测试异味数量特征.

表2 过程度量描述Table 2 Process metric description

表3 测试异味描述Table 3 Test smells description

在软件维护方面,本文参考Kamei等人[5,6]采用的由项目历史信息计算得到的过程度量指标,如表2所示,共包含14个度量,分别从系统各组成部分的变更、代码行的变更、是否修复了缺陷、文件修改变更频率和关联开发者的经验等五个角度描述了提交的特征.为了获取每条提交记录的过程度量数据,本文采用了由Rosen等人[42]实现的一种语言无关的自动化分析和预测工具Commit Guru,为本次实验提供了所有代码提交的完整数据以及相关的历史信息度量.

3.2 特征选择

由于本次实验共有37个特征属性,包含了17种测试异味,14种过程度量指标和6种代码度量指标,为了防止因特征间存在多重共线性以及因特征属性过多而导致的机器学习模型的泛化能力降低,本文对过程度量和代码度量的特征属性进行了相关性分析.

本文通过相关性热力图对代码度量和过程度量的指标进行了特征间的相关性分析,鉴于文章版面有限,只展示了代码度量的相关性热力图,如图1所示,并将代码度量和过程度量指标的最终筛选结果展示在表4中.

表4 代码度量以及过程度量筛选结果Table 4 Code metric and process metric screening results

(2)

r描述的是两个变量间线性相关强弱的程度,r的绝对值越大表明相关性越强.一般认为:|r|≥0.8时,可认为两变量间极高度相关;0.6≤|r|<0.8,可认为两变量高度相关;0.4|r|<0.6,可认为两变量中度相关;0.2≤|r|<0.4,可认为两变量低度相关;|r|<0.2,可认为两变量基本不相关.

根据图1所示的关于代码度量各特征属性间的相关系数,本文将相关系数绝对值大于0.6的两个特征属性中的一个剔除,例如代码度量中的特征属性CBO和RFC的相关系数为0.62,表明这两种特征属性是高度相关的,所以实验中随机选择将RFC剔除,保留CBO.同理,根据基于过程度量的相关性热力图分析得出的各特征属性间的相关系数,本文将相关系数绝对值大于0.6的两个特征属性中的一个剔除,例如过程度量中的特征属性ND和NF的相关系数为0.9,表明这两种特征属性高度相关,所以实验中随机将ND剔除,保留NF.

图1 代码度量属性相关性热力图Fig.1 Code metric characteristic correlation heatmap

经过筛选,最终保留了10个过程度量和4个代码度量,如表4所示.

3.3 分类算法和模型验证

如表5所示,实验数据集存在类不平衡的现象.为了减轻非平衡数据集对即时缺陷预测模型的性能造成的影响,本次实验对数据集进行了欠采样[43],即减少大类的数据样本个数,以使包含缺陷的提交记录与不包含缺陷的提交记录数据量更加相近.同时,鉴于本次实验包含较多特征属性且数据集不平衡,实验中首选了随机森林作为机器分类学习模型.随机森林分类模型是通过建立多个决策树并将他们融合起来得到一个更加准确和稳定的模型,是bagging 思想和随机选择特征的结合.随机森林[44]构造了多个决策树,当需要对某个样本进行预测时,统计森林中的每棵树对该样本的预测结果,然后通过投票法从这些预测结果中选出最后的结果.其最大的优点就是对于类别不平衡数据,随机森林能够平衡误差,且不用降维也可以处理高维特征.

表5 实验项目描述Table 5 Experimental systems description

为了证实随机森林的适用性,本实验也在逻辑回归、向量空间机、朴素贝叶斯和多层感知器这几种常见的机器分类模型上进行了测试,并采用了10折交叉验证策略[45].该策略允许所有的观察样本都用于训练和测试目的,而且已经在缺陷预测的上下文中被广泛使用[46].该策略将原始数据集随机划分为10个大小相等的子集.在这10个子集中,一个被保留为训练集,其余9个被用作训练集.交叉验证然后重复10次,允许10个子集中的每一个恰好成为测试集一次[45].实验结果进一步证明了随机森林的效果最好.

4 实 验

为了验证测试异味对即时缺陷预测模型的有效性,本文将就以下3个问题展开实验与结果分析:

RQ1:测试异味特征是否可以提高即时缺陷预测模型的性能?

RQ2:加入测试异味的即时预缺陷预测模型中各特征属性对模型预测输出的贡献度如何?

RQ3:测试异味这一类特征属性在不同项目缺陷预测的贡献度上是否存在差别?

4.1 实验准备

本文将通过5个在软件开发领域应用广泛且一直有版本更新的较为活跃的开源系统来验证本次实验设计的3个问题,所选系统的详细信息如表5所示.选择这5个系统的原因是:

1)本次实验挖掘测试异味以及计算代码结构度量的工具只适用于由Java语言编写的项目,而这5个系统都是基于编程语言Java开发设计的.

2)这5个系统的量级大小不一,开发并投入实际应用以及版本更替的时长也不相同,提交记录的数量也有很大差别,这有利于本文对模型跨项目的研究.

3)这5个系统提交记录中包含缺陷的提交记录的占比不同,且这5个系统的实际应用领域也互不相同,可以进一步验证本文所提出的即时缺陷预测模型的泛用性.

4.2 实验流程

本次实验的流程主要分为3个步骤,分别是数据集的选择和清洗、即时缺陷预测模型的构建以及结果数据的评估与分析,如图2所示.

图2 实验流程Fig.2 Experiment process

4.2.1 数据的获取及预处理

首先,通过Christoffer 等人[42]开发的系统分析工具Commit Guru,获取到本次试验所涉及的5个项目的过程度量指标数据集.

因为不同项目的开发时间长短不一,且包含的提交记录数量较多,所以本文只选取了每个项目一段时间内的提交记录,用于本次试验研究.

之后,针对每个项目所选取的提交记录,利用测试异味检测工具,tsDetect[41]来挖掘每条提交记录中Java文件包含的测试异味,因为本次实验研究的对象为生产代码,所以可以将那些存在测试异味但没有对应的生产代码文件的测试文件剔除.

同时,针对每条提交记录中所涉及的Java文件,本文通过Chidamber和Kemerer[22]等人实验中代码结构指标的计算工具CK,计算出表1所示的代码度量,因为CK也是在文件级输出每个Java文件的结构指标,并用具体的数字表示,所以本文选择用每条提交记录中所有Java文件的代码结构数据的均值,来表示该条提交记录的代码度量的数据指标.

4.2.2 即时缺陷预测模型的构建

在确定了本次实验包含的软件开发、软件测试、软件维护3个角度的特征属性后,本文针对可能存在高度相关性的特征属性进行了相关性分析,最终筛选得到了4个代码度量和10个过程度量,结果如表4所示.

为了减轻因实验数据集不平衡给实验结果带来的影响,实验首先对获取到的数据集进行了欠采样处理[43],其次首选了随机森林这一对非平衡数据集不敏感的机器分类模型,但是为了保证实验结果的可靠性,本次实验也在逻辑回归,朴素贝叶斯,多层感知机等这类常见的分类模型上进行了测试,并采用了10折交叉验证策略[44],测试结果证实了一开始的选择,随机森林的分类效果最好,被选作本次实验的机器分类学习模型.

4.2.3 模型性能的评估与结果分析

本次实验通过计算经典的性能指标,包括精度、召回率、F1值和AUC-ROC[47-50]来验证测试异味对即时缺陷预测模型的有效性,并且评估本次实验构建的即时缺陷预测模型的跨项目缺陷预测的性能.

实验基于可解释性人工智能算法SHAP[13]计算每个特征对预测结果的贡献度,通过SHAP的3个特性,即局部精确性、允许缺失和一致性以及模拟式的计算思想,考虑各个特征组合关键词对模型结果的影响,以满足即时缺陷预测模型这类高精度复杂集成模型的解释.

4.3 实验结果分析

4.3.1 RQ1:即时缺陷预测模型的性能

为了回答RQ1,本文将实验分为两组,第一组实验不添加测试异味作为特征属性,记作BasePrediction,第二组实验将测试异味作为特征属性添加进即时缺陷预测模型中,记作tsBasePrediction.本文通过对比经典的性能指标,包括精度、召回率、F1值和AUC-ROC[47-50]的值来评估测试异味对即时缺陷预测模型的有效性.

精度Precision用于表示所有预测值为1的样本中被正确预测的比例,如式(3)所示.其中TP表示真正例,即预测值是1,真实值是1的样本;FP表示假正例,即预测值是1,真实值是0的样本.

(3)

召回率Recall表示检测率在所有实际值为1的样本中被正确预测为1的比例,如式(4)所示.其中TP表示真正例,即预测值是1,真实值是1的样本;FN表示假反例,即预测值是0,真实值是1的样本.

(4)

F1值是统计学中用来衡量二分类模型精确度的一种指标.它同时兼顾了分类模型的精确率和召回率.F1值可以看作是模型精确率和召回率的一种调和平均,它的最大值是1,最小值是0,如式(5)所示.

(5)

ROC曲线是二值分类问题的一个评价指标.它是一个概率曲线,在不同的阈值下绘制TPR(真正例率)与FPR(假正例率)的关系图,从本质上把“信号”与“噪声”分开.AUC-ROC[47]的值即为ROC曲线下的面积,是分类器区分类的能力的度量,用作ROC曲线的总结.AUC-ROC的值越高,模型在区分正类和负类方面的性能越好(通常认为AUC-ROC值大于0.7时,分类预测模型的性能可评估为优良[51]).

利用从5个系统中获取到的相关特征属性的数据集,对本次实验构建的即时缺陷预测模型进行了验证,结果如表6所示.

表6 模型性能对比Table 6 Model performance comparison

根据表6所示的数据结果可以看出本次实验构建的即时缺陷预测模型的性能效果是较好的(AUC-ROC>0.7).没有加入测试异味作为特征属性的即时缺陷预测模型的精度最差的能到达到64.8%,最好的能达到77.7%,这说明本次试验的模型在预测一个提交记录是否有缺陷时,其预测结果最少也有近65%是正确的.而在加入了测试异味作为特征属性后,即时缺陷预测模型对各项目提交记录是否含有缺陷的预测精度最少提高了1.4%,最多提高了3.9%,同时即时缺陷预测模型的最差精度也由原来64.5%,提高到了68.7%.这一结果说明了测试异味在提高即时缺陷预测模型的预测精度方面是有一定正向作用的.

对于性能评估指Recall和F1值,可以发现不加入测试异味作为特征属性时,模型的Recall和F1值最差也可分别达到64.4%和63.7%,这意味着该模型的预测结果最少也有64%以上是正确的,而在加入了测试异味作为特征属性以后,模型的Recall有了0.8%-4%左右的提升,F1值有2.3%-4.6%左右的提升,同时模型的Recall和F1值最差也可分别达到66.7%和66.9%,总体上来看模型的Recall和F1值也有2.3%和3.2%的提升.针对分类器区分类的能力的度量,AUC-ROC值,可以发现从总体上看,在不加入测试异味作为特征属性前,模型的AUC-ROC值最低为66.6%,而在加入了测试异味作为特征属性之后,模型的AUC-ROC值最低为72.0%,有了5.4%的提升,从每个项目提交记录的预测情况来看,在加入测试异味作为特征属性之后,模型的AUC-ROC值分别有了2.5%-6.7%的提升,而这一结果也再次证明了将测试异味作为特征属性加入到即时缺陷预测模型中,对于模型预测性能的提高是有效的.

4.3.2 RQ2:模型中各特征属性的贡献度排序

为了进一步探究测试异味是否可以作为有效的预测因子来提高即时缺陷预测模型,本文利用SHAP[13]对本次实验构建的即时缺陷预测模型中各特征属性对模型预测结果输出的贡献度进行了排序,结果如图3所示.

图3 各特征属性的贡献度排序Fig.3 Contribution ranking of each feature attribute

图3是基于SHAP值的密度散点图,其中SHAP值代表该特征属性对模型预测输出的影响的大小,密度散点图中的一个点对应于研究中的一条提交记录,点在x轴上的位置代表了该特征对模型预测该提交记录是否含有缺陷的贡献度,x轴上的值的绝对值越大,说明该特征对模型的预测输出影响越大,而x轴上的值的正负代表了特征对模型预测输出影响的正负,本次实验中若SHAP值为正则说明该特征属性提升了预测该条记录有缺陷的可能性,若SHAP值为负则说明该特征属性降低了预测该条记录有缺陷的可能性.当多个点在x轴上同一位置着陆时,它们堆积起来以显示密度.

图3左边展示的即为本次实验模型中对模型预测结果贡献度排在前20位的特征属性的降序排列.可以看到,本次试验构建的即时缺陷预测模型中对模型输出影响最大的特征属性是LD,对模型影响程度排在第20位的是ET,对模型预测输出的贡献度排在前20特征中测试异味共有6种,分别是ECT,UT,AR,GF,MNT,ET.其中对模型预测结果影响最大测试异味是ECT,从图3中散点及其对应的着色分布来看,当测试异味ECT在某条提交记录中的分布密度偏高时,ECT对模型预测该条提交记录含有缺陷的影响要比总体贡献度排在之前的Entropy要大,同样情况的还有测试异味UT和GF,从它们的散点及着色分记录中的分布密度偏高时,UT对模型预测该条提交记录含有缺陷的影响要比总体贡献度排在之前的DIT要大,GF对模型预测该条提交记录含有缺陷的影响要比总体贡献度排在之前的NS要大.这说明对于测试异味分布密度较高的提交记录来说,开发人员给予测试异味更多的关注是有必要的,因为测试异味是可以作为一个有效的参考因素来分析预测该提交记录是否含有缺陷.

4.3.3 RQ3:测试异味在跨项目中缺陷预测输出的贡献度的表现

为了探究测试异味在不同系统中对缺陷预测的贡献度是否存在差异,本文研究了不同系统的提交记录数据中测试异味这一类特征属性对即时缺陷预测模型预测输出的贡献度排序是否不同,考虑到每个项目中的测试异味的分布情况可能不同,所以本文对每个项目中的测试异味的分布情况进行了统计,结果如表7所示.

表7 各项目提交记录中的测试异味分布Table 7 Distribution of test smells in the commits of systems

其中每个项目中都会出现分布极其稀疏的测试异味种类,因为过分稀疏的数据对模型的影响很小,且可能对模型的性能造成影响,本次实验直接删除分布占比低于5%的特征属性.例如ST在项目Crate中的分布占比仅为2.7%,对模型的贡献率很小,所以在Crate这一项目的实验中,删除了ST这一特征属性.

经过数据处理和实验后,各项目中特征属性的贡献度排序如图4-图8所示.

图4 Apache wicket的SAHP散点图Fig.4 SHAP scatter plots of wicket

图5 Apache tomcat的SAHP散点图Fig.5 SHAP scatter plots of tomcat

图6 Hibernate-validator的SAHP散点图Fig.6 SHAP scatter plots of Hibernate-validator

图7 Crate的SAHP散点图Fig.7 SHAP scatter plots of Crate

图8 Apache cassandra的SAHP散点图Fig.8 SHAP scatter plots of cassandra

可以看到,不同的系统中,不同的特征属性对模型预测结果的影响也是不同的.

对于系统Apache wicket,LD,NF,Entropy,EXP这4个特征属性对模型预测一条提交记录是否含有缺陷的影响是最大的,排在前4位.但是,当一条提交记录中删减的代码行数(LD)或者变更的文件数(NF)过多时,LD和NF这两个特征属性对预测这条提交记录是否含有缺陷的影响更大.同样,对那些涉及了具有很长开发经历的开发人员(EXP)的提交记录来说,EXP对预测这条提交记录是否含有缺陷的影响要大于代码信息增益(Entropy).而对于这个系统中存在的测试异味,可以从图4中看出,当UT的存在数量较多时,UT对模型预测该条提交记录是否含有缺陷的影响比变更的文件数量(NF)的影响要大.同样的,当LT这种测试异味的存在数量较多时,LT对模型预测该条提交记录是否含有缺陷的影响比文件上一次涉及的变更数(NUC)要大.

对于系统Apache Tomcat,提交记录中变更子系统数(NS)这一特征属性对模型预测结果的总体影响要比UT这一测试异味的影响大,但是对于少数包含大量UT的提交记录来说,UT对于模型预测结果的影响更大.

对于系统Hibernate-validator,提交记录中文件的平均变更时间间隔(AGE)这一特征属性对模型预测结果的影响总体上要大于MNT和ECT这两种测试异味,但是对于具有较多的MNT和ECT分布的提交记录来说,MNT和ECT对模型的预测输出影响更大.

对于系统Crate,提交记录中文件上一次涉及的变更数(NUC)这一特征属性对模型预测结果的总体影响要比DA这一测试异味的影响大,但是对于少数包含大量DA的提交记录来说,DA对于模型预测结果的影响更大.

对于系统Apache Cassandra,虽然测试异味这一角度的几种特征属性在对模型预测输出的贡献度排在最后几位,但是当这几种测试异味的分布密度较高时,它们对模型的预测输出的影响要大于排在他们之前的提交记录涉及的代码变更行数(LT),提交记录中代码的对象类之间的耦合度(CBO)以及提交记录涉及的变更子系统数(NS)这3个特征属性.

根据对这5个系统实验结果的分析,再一次证实了测试异味对即时缺陷预测模型的预测输出的影响是不可忽略的,对于那些测试异味分布密度较高的系统来说,测试异味对缺陷预测的贡献度要比传统的代码度量和过程度量更大.因此,开发人员在对软件可能存在的缺陷进行判断预测时,应对常见的测试异味类型给予一定的关注,当发现某些测试异味的分布密度较高时,在判断其关联的生产代码是否存在缺陷时,将测试异味加入到缺陷预测的模型中,对提高模型性能是有一定帮助的.

5 有效性威胁分析

5.1 外部有效性分析

首先,本次实验只在5个项目上进行了实验研究,这使得本次实验构建的即时缺陷预测模型的稳定性有待进一步的扩展实验研究.其次是本次实验由于实验工具都是基于Java语言开发的,这使得实验研究的对象也限制在了基于Java语言开发设计的开源系统,这使得本次实验构建的模型对于其他编程语言开发设计的项目的有效性有待进一步研究讨论.

5.2 内部有效性分析

本次实验研究中的数据都是通过相关的工具获取的,测试异味是通过tsDetect[41]这一开源工具捕获的,代码度量则是通过CK[22]计算得到的,而过程度量以及提交记录是否包含缺陷则是通过Commit Guru[42]获得的,虽然这些工具的性能都经过人工验证,但与实际情况相比还是会存在一定程度的误差,使得本次的实验数据会存在一定的错漏,这会对本次实验构建的模型的性能造成一定的影响.

6 总结与展望

本次实验在5个项目上,实验并对比了新模型与旧模型的性能,以探究测试异味对即时缺陷预测模型的有效性和差异性,以及跨项目后测试异味对缺陷预测的贡献度是否存在差别.实验结果显示,加入测试异味后,模型的AUC_ROC值提升了2.5%-6.7%,精度提高1.4%-3.9%,召回率提高0.8%-4%,F1值提高2.3%-4.6%,这表明测试异味对提高即时缺陷预测模型的性能是有效的.根据可加性解释模型SHAP[13]分析的各特征属性对模型预测输出的贡献度的排序,贡献度排在前20位的特征属性中有6种测试异味,分别为ECT,UT,AR,GF,MNT,ET,其中ECT对模型输出贡献度排在第9位,而ET则排在第20位,这表明不同测试异味对缺陷预测的贡献度是有差别.同时,不同的系统中的测试异味对模型预测输出的贡献度排序也存在较大差异,例如,系统 Apache wicket中,UT和LT的贡献度排在了第5和第10位,而在系统Apache tomcat中,UT和LT的贡献度则排在了第18和第19位.

对于未来的工作,首先可以考虑将实验的项目数量增加并且将范围扩展到工业以及其他不同类别的系统,以探究测试异味对即时缺陷预测模型有效性的普遍适用性.其次,本次实验是在提交这一级别上进行的,之后将考虑在不同的粒度上开展实验探究,如文件或者类一级别.最后,针对模型性能提高这一问题,将会考虑将人工智能AI加入到未来的实验当中.

猜你喜欢

度量异味代码
Android 应用程序的代码异味检测工具与方法综述
鲍文慧《度量空间之一》
不欣赏自己的人,难以快乐
突出知识本质 关注知识结构提升思维能力
三参数射影平坦芬斯勒度量的构造
用这些告别异味吧!夏天就要清清爽爽过!
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
生活小窍门2则