南京大学智能软件工程实验室
iselab.cn
摘要
本文提出了一种专门用于测试代码抄袭检测的自动化工具MAF。在对学生在软件测试考试或竞赛中提交的测试代码深入洞察的基础上,结合测试用例所固有的特性,MAF 采用静态双向切片技术能够从不规范的测试代码中提取出有效的测试片段。每个测试片段锚定一个具体的测试目标(即待测方法)。MAF 通过度量测试片段而不是测试代码本身的相似性,使测试代码相似性度量更加合理,从而提高抄袭检测的准确性。我们在两次软件测试竞赛中收集的测试代码数据集上进行了实验,实验结果表明 MAF 可以有效地检测测试代码抄袭。此外,我们将 MAF 实现成一个基于 Web 的工具。借助 Web 强大的可视化能力,一方面 MAF 可以将抄袭检测结果进行良好的展示;另一方面方便指导教师轻松的检测软件测试考试或竞赛中学生之间的抄袭情况。MAF的演示视频可访问: https://youtu.be/neiXo7yw5tg,其核心代码可以在GitHub https://GitHub.com/wssun/MAF上找到。 关键字 测试代码,测试片段,抄袭检测
1.介绍
软件测试一直是确保软件质量最重要的手段之一,而软件开发者的测试能力的培养也受到了极大关注。为了提高学习效率和降低学习成本,在线软件测试实践平台已经出现,例如,可以支持许多软件测试活动的Mooctest。在线实践平台可以容纳大规模的学生,同时它更需要保证教育的质量。抄袭检测对于在线软件测试实践(如考试还有比赛)是必不可少的,而消耗大量人工来检查大量学生/参赛者的抄袭行为可行性不高,因此需要自动化检测抄袭。目前已有的一些检测抄袭的技术,主要是通过分析生产代码间的相似性,例如字符串、标记、语法、语义。我们选择了一些主流的工具(如 Plaggie 和 Difflib)用于软件测试抄袭检测来发现测试代码竞赛中的抄袭行为,事实上它们的性能(例如精度)不太令人满意。随后我们进行更深入的观察并发现:(1)为了混淆抄袭检测器,大量冗余与测试无关的代码包含在测试代码中,消除这些混淆代码可以改进抄袭检测的准确性;(2)测试用例的测试粒度非常不标准,大多数都有一个测试粒度大于1。如果测试用例锚定了不同的测试目标(即待测方法),衡量相似性是不合理的,这对抄袭检测有副作用,因此必须还原测试粒度以便针对测试目标对测试用例进行分类。正确做法是保留每个测试用例只测试一个测试目标,即测试粒度为1。结合单元测试的知识,我们总结了以下两个测试用例的特征,有助于促进测试代码的抄袭检测。 (1)在JUnit测试框架下设计的测试用例包括四个基