1.引用
Mostafa Erfani and Iman Keivanloo and Juergen Rilling. Opportunities for Clone Detection in Test Case Recommendation. In Proceedings of the 37th Annual Computer Software and Applications Conference Workshops, 2013, 65-70.
2.摘要
无论系统类型如何,测试都是任何软件产品及其开发过程的关键方面。在这项研究中,我们研究了使用克隆检测技术向开发人员和维护人员推荐测试用例模板。我们引入了一种新颖的推荐方法,该方法通过挖掘软件仓库派生新的单元测试用例来支持开发人员。 我们的方法使用程序员当前的工作环境,然后推荐与该工作环境紧密匹配的单元测试用例示例。我们首先利用现有的克隆检测工具,利用现有的源代码模块及其相关的单元测试用例创建可追溯的知识库,该工具可用于跨项目边界挖掘克隆。我们使用这些已标识的克隆类将它们与此类克隆类中缺少的单元测试用例进行匹配。案例研究的结果说明了我们方法的适用性。
3.测试用例推荐方法
图 1.完整方法概述。
图 1 概述了我们测试用例推荐方法与不同的处理步骤,我们将在以下各节中详细讨论。
克隆检测。在第一步中,我们使用了 NiCad [8],这是一种源代码克隆检测系统,支持对不同抽象级别的克隆进行检测。在我们的方法中,我们将重点放在功能级别粒度上,因为我们将这些克隆与(功能级别)单元测试用例进行匹配。
JUnit 测试用例。在此处理步骤中,我们提取单元测试用例,然后将其与克隆检测工具报告的克隆代码片段相关联。对于单元测试用例的提取,我们利用 Eclipse 的 ASTParser 提取信息,例如方法签名,类名和关联的名称空间。在软件仓库、测试用例和下一个处理步骤中使用的克隆片段之间进行追溯时,我们需要这些事实。
测试用例推荐。对于单元测试用例建议,我们首先确定每个克隆类中具有至少一个相应单元测试用例的克隆方法。在此同化过程的第二部分中,我们在每个克隆类中标识这些克隆片段,这些片段没有关联的单元测试用例。对于每一个克隆片段,我们都推荐的单元测试用例都基于同一克隆类中现有单元测试用例。有几个因素可能会影响我们的建议:a)有无测试用例的克隆类的数量。对于没有任何测试用例的克隆类,我们的方法将无法推荐任何单元测试用例。b)配置设置使用 NiCad。根据其配置,NiCad 将检测 1 型,2 型或 3 型克隆。对于相同的克隆(1 型克隆),推荐的单元测试用例可以重复使用而无需或仅进行少量修改,而与差异较大的代码片段(2 型和 3 型克隆)相关的测试用例将需要进行其他手动修改来匹配代码片段。尽管所需的修改可能因测试案例而异,但提供这些模板仍可以简化缺少单元测试案例的创建。
4.案例研究与结果分析
表 1
我们根据为同一克隆类中克隆方法推荐单元测试用例的能力来评估我们方法的适用性。我们在 8 个成熟中型的 java 开源项目中通过定量分析评估该方法,它们使用 JUnit 作为单元测试框架:1.Apache Ant、2.HBase、3.Hibernate、4.Weka、5.JFreeChart、6.JHotDraw、7.FreeCol、8.CruiseControl。
每个项目彼此独立,并从项目特定仓库中提取克隆和测试用例。我们还对更大的克隆体和测试用例是否会有益于我们的方法进行评估。我们提取了跨项目的克隆类(和单元测试用例),并将它们存储在一个公共仓库中。
A.项目级测试用例建议
表 2
我们的分析(表 2)显示,平均而言,所有克隆类别中只有 25%具有 100%的单元测试覆盖率(CC2),而所有检测到的克隆类别中有 23.2%具有某些测试用例却没有达到完整的覆盖率(CC1)。其余的 51.8%的克隆类仅包含无关联测试用例的克隆(CC3)。在不同的克隆类类别中,我们将案例研究的其余部分集中在 CC1 克隆类类别上,因为这些克隆类具有无关联测试用例的克隆片段,因此可能会从我们的方法中受益最大。
B.克隆方法的测试用例推荐比率
对于 CC1,分析表明,平均而言(在所有配置和项目中),我们的方法可以为大约所有方法的 8.6%生成 JUnit 测试用例建议。尽管这个数字似乎很低,但人们必须考虑到这些项目的实际现有平均 JUnit 测试覆盖率仅为~11.7%。虽然差异较大会增加可从我们的测试案例建议中受益的方法的数量,但建议的质量也会下降。另一方面,克隆级别的较高差异会导致推荐的测试用例与克隆方法之间的较高差异。
表 3
对于类似 2 型克隆的配置(blind,0.1 阈值),我们的推荐方法建议单元测试用例与目标源代码非常匹配。我们的分析表明,所有 8 个项目中所有方法的测试用例覆盖率(不仅是克隆片段)都可以增加 0.5%。尽管这种增加似乎很小,但必须考虑以下几点:1.)所选配置设置创建了可以应用的建议,而无需对建议的测试用例进行任何重大修改。2.)所有 8 个项目的现有平均单元测试覆盖率仅为 12%,因此 0.5%的改善并不是微不足道的。
实验评估的主要挑战仍然是缺乏对我们推荐方法的定性分析。1.)我们忽略了定性分析,因为我们认为诸如召回、精确度或 F 度量之类的传统度量不适用于我们的研究环境,并且可能导致对实际结果的错误解释。尽管 NiCad 是成熟的克隆检测工具,但构成实际克隆的定义仍然相当模糊(相异性设置为 0.1 或更高)被认为是 3 型克隆。2.)句法对比语义相似性,而 NiCad 主要分析句法相似性(或不相似性),对于我们的测试用例推荐,在确定测试用例推荐的适用性时也应考虑方法的语义相似性。3.)这些措施忽略了将建议的 JUnit 测试用例修改和适应给定克隆方法所需的工作。尽管我们可以测量出克隆和推荐的测试用例之间的语法差异,但我们确实认为并非所有类型的修饰都应该并且可以被同等对待。4.)当我们在案例研究中分析了几个中型开源项目时,现有的测试案例覆盖范围以及检测到的克隆数量都将对有效性产生外部威胁,从而限制了对任何定性分析进行概括的能力。
C.大型知识库的推荐结果
表 4
对于案例研究的第二部分,我们利用跨项目(在我们的情况下为所有 8 个开源项目)相似方法(具有相似功能或语法)的单元测试,扩大了语料库的范围。表 4 显示为我们的全局数据集确定了 84 个 CC1 克隆类。在这 84 个克隆类别中,共有 271 个带有测试用例(CM2)的克隆片段,这些片段也被用作我们推荐方法的语料库。此外,在 CC1 克隆类别类别中确定了 257 个没有测试用例(CM1)的克隆片段。
此外,我们将全部数据集推荐方法的结果与我们各个项目级别推荐的结果进行了比较(表 3)。这种比较揭示了几个有趣的发现。CC1 克隆类别的总数显着较大(几乎是该数目的两倍),而同时具有(CM2)和不具有(CM1)测试用例的克隆片段的数目显着较小。两个数据集之间 CC1 类存在差异的主要原因是,本地和全局数据集之间的克隆类不一定相同,并且在分析全局数据集时,可能已合并了来自单个项目的重复克隆类。另一个有趣的观察结果是,与单个项目的 CM1 建议的总和相比,我们的方法可以为更大的数据集生成更多的测试案例建议(257 对 163 个测试案例建议)。
图 4.跨项目边界的测试用例建议。
图 4 显示了从我们的全局数据集中提取的两种具有较高相似性(0.3 阈值和 blind 配置)的克隆方法的示例。该示例清楚地表明,要修改的行数很大程度上取决于克隆类型。相异性越高,需要进行更多修改。这两种方法实际上是在同一克隆类中找到但在两个不同项目(CruiseControl 和 ApacheAnt)中检测到的克隆。该示例说明了如何通过较小的修改(通过仅删除单元测试用例中的三行代码并修改 assertEquals),可以将推荐的单元测试用例重用于另一个源代码上下文。
5.对有效性的威胁和讨论
A.内部威胁
由于我们的方法利用了克隆的优势,因此对我们方法的有效性构成了威胁,那就是我们正在促进在源代码中使用克隆。我们的目标不是开发新的克隆,而是挖掘现有的克隆及其测试用例,以促进测试用例的重用。
我们的数据集用于挖掘克隆及其测试案例的充分性。选择一个代表性的数据集是一个固有的挑战性研究问题。尽管我们的结果令人鼓舞,但我们并不认为它们一定可以推广到其他数据集。
此外,在克隆类中有多个测试用例可供选择时,需要对测试用例建议进行排名,这可能会影响我们的方法。可以使用“排名结果集”,其中项目的顺序表示“相关程度”。
B.外部威胁
由于我们的方法取决于用于克隆检测的外部工具,在我们的案例中为 NiCad,因此这些工具检测克隆的能力可能会对我们的方法产生重大影响。 NiCad 可以被认为是一种相对成熟且广泛使用的克隆检测工具,许多经验评估表明 NiCad 能够检测 1 型,2 型和 3 型克隆。
6.结论与未来工作
我们的研究为单元测试用例引入了一种推荐方法,以支持开发人员和维护人员创建新的测试用例。通过使用最新的克隆检测工具挖掘现有的单元测试用例和克隆,可以得出测试用例建议。然后,对检测到的克隆类进行自动分类,并与相应的测试用例进行匹配。我们对 8 个开源项目的定量研究表明,在没有现有测试用例的情况下,大约有 8.6%的方法可以推荐测试用例。作为未来工作的一部分,我们计划在更大的知识库上进一步评估我们的方法。
致谢
本文由南京大学软件学院 2019 级硕士朱晨乾翻译转述。