基于信息检索和深度学习结合的单元测试用例断言自动生成
摘要:本章节介绍基于 IR 的方法(包括基础的信息检索技术 IRar 以及自动适配技术 RAadapt)和结合的方法。
本文分享自华为云社区《基于信息检索和深度学习结合的单元测试用例断言自动生成》,作者:华为云软件分析 Lab 。
一、背景介绍
单元测试用来验证软件基本模块的准确性。跟其他层次的测试(比如集成测试和系统测试)相比,单元测试可以更快地帮助软件系统发现错误。同时在单元测试阶段发现错误可以大大降低整个软件测试流程的测试开销虽然单元测试很重要,但是编写单元测试用例往往很费时间。
为了减轻开发者编写单元测试用例的负担,软件测试领域的研究者提出多个单元测试用例自动生成工具,来为开发者编写的程序自动生成测试用例。这些工具从生成测试输入的角度可以分为如下三类:
(1)随机测试,比如 Randoop[3],它使用带反馈的执行机制来收集执行路径。
(2)动态符号执行,比如 JBSE[4],它通过动态符号执行技术来为复杂对象提供测试输入。
(3)基于搜索,比如 Evosuite[5],它应用遗传算法来生成和优化满足测试覆盖标准的测试输入。
上述测试用例自动生成工具除了可以自动生成测试输入之外,还可以自动生成断言。这些工具从生成断言角度可以分为如下两类:
(1)捕获执行然后进行断言生成[6],比如 Evosuite 和 Randoop 都是通过在已经生成的测试序列的基础上,执行这些序列,然后捕获跟待测方法相关的对象状态的值,作为 assertion 中的值。
(2)差异测试[7],比如 DiffGen[8]通过在同一个类的两个版本上执行测试方法,然后通过比较函数调用返回值以及对象的中间状态来是否相同来生成多言。
虽然上述的测试用例生成工具可以生成断言,但是它生成的断言在找 bug 的能力方面非常受限。对于给定的一个版本,这些工具生成的断言只能找崩溃类型的 bug,无法找逻辑相关的 bug。为了更好地生成断言,近期 Watson 等人[2]提出 ATLAS 来生成断言。ATLAS 是一个基于深度学习的方法,它通过给定的待测方法以及测试方法(除去断言部分),来生成断言。本文将待测方法以及测试方法(除去断言部分)简称为 focal-test 方法。在训练阶段 ATLAS 使用 focal-test 方法作为输入,使用数据对应的断言作为 label 来训练模型。然而 ATLAS 的效果受限于两个方面,第一,ATLAS 基于深度学习,其可解释型不强。第二,ATLAS 生成断言的准确率不够高(只有 31%),并且 ATLAS 在生成长 assertion(长度大于 15 个 token)的效果很差,只有 18%。
为了解决上述提到的问题,本文提出使用基于信息检索的方法 IR(包含基础的信息检索技术 IRar 以及基于信息检索结果的自动适配技术 RAadapt)来提升断言生成的准确性,除了基于信息检索的方法,本文同样提出一个结合方法来将 IR 和基于深度学习的方法(比如 ATLAS)进行结合,进一步提升断言生成的准确度。本文在两个数据集上评估本文提出的方法跟 ATLAS 的对比,实验结果表明本文提出的方法在两个数据集上的准确率比 ATLAS 分别高 15.12%和 20.54%。
二、方法
本章节介绍本文提出的基于 IR 的方法(包括基础的信息检索技术 IRar 以及自动适配技术 RAadapt)和结合的方法。图 1 展示了本文提出的方法的整体流程图。给定一个 Focal-test 方法,本文首先通过 IRar 技术到训练集中检索最相似的 Focal-test 方法,并将其对应的 assertion 作为检索到的 assertion 返回。接着本文提出自动适配技术 RAadapt,RAadapt 技术包括两个适配策略:基于启发式搜索(RAadaptH)的适配和基于神经网络(RAadaptNN)的适配。最后本文基于相容模型提出一个结合的方法,来智能的选择应用适配完之后生成的 assertion 还是应用基于深度学习方法(ATLAS)生成的 assertion。文本方法部分的详细介绍请参见本文发表在国际软件工程会议的论文[1]。
图 1 本文提出的断言生成的方法流程图
本文通过计算测试集中的 focal-test、模型生成的 assertion 以及基于信息检索方法生成的 assertion 的相容度来决定使用模型生成 assertion 还是使用基于信息检索的方法生成 assertion。
三、实验设置
3.1 实验数据集
表 1 详细展示了本文用到的两个数据集中断言类别及个数的分布情况。
3.1.1 Datasetold
本文将 ATLAS 使用的数据集记为 Datasetold,它是从 GitHub 的开源项目中挖掘得到。Datasetold 将所有 assertion 中存在的 token 但是没有出现在 focal-test 方法中的数据全部去掉因为 ATLAS 无法为这些数据成功生成断言。最终 Datasetold 包含 156,760 条数据,并以 8:1:1 划分训练集、验证集和测试集。
3.1.2 Datasetnew
实际上 ATLAS 使用的 Datasetold 数据集是去掉了有挑战性的数据,进而简化了断言生成任务的评估。因此本文进一步通过将 ATLAS 去掉的数据加回到数据集中来构造一个更有挑战性的数据集,本文将该数据集记为 Datasetnew。最终 Datasetold 包含 265,420 条数据,并以 8:1:1 划分训练集、验证集和测试集。
3.2 评估指标
本文使用的评估指标更 ATLAS 一致,使用准确率和 BLEU 值来评估本文提出的方法的有效性。
3.2.1 准确率
本文认为生成的断言准确的标准是断言在字符串级别完全相等。
3.2.2 BLEU 值
BLEU 值在自然自然语言处理领域被广泛使用,它用来评估生成的句子跟标注的句子的相似性。本文使用 BLEU 值来评估本文方法生成的断言跟标注的断言的相似性。
四、实验结果
4.1 IRar 方法的有效性
4.1.1 IRar 方法整体效果分析
表 2 和表 3 的第三列展示了 IRar 方法在两个数据集上的准确率和 BLEU 值,从表中可以看到在两个数据集上,IRar 方法在准确率和 BLEU 值上的表现都要明显优于 ATLAS。
表 4 展示了 IRar 和 ATLAS 在每个断言类别上的准确率,从表中可以看到 IRar 在每个断言类别上的准确率都要优于 ATLAS,进一步证明了 IRar 方法的有效性。
表 5 展示了 IRar 使用不同相似度系数检索的准确率,从表中可以看到不同的相似性系数对 IRar 的准确率影响不大,证明了 IRar 方法的普适性。
4.1.2 ATLAS 和 IRar 成功生成的 assertion
为了进一步研究 ATLAS 和 IRar 生成的 assertion,我们首先分析 ATLAS 和 IRar 成功生成的 assertion。
图 2 展示了 ATLAS 和 IRar 成功生成的断言语句的平均长度。从图中可以看出,在生成长的断言语句时,IRar 比 ATLAS 效果更好。本文统计发现,在 Datasetold 数据集上,ATLAS 和 IRar 成功生成的断言语句的长度平均分别为 7.98 和 8.63,在 Datasetnew 数据集上,ATLAS 和 IRar 成功生成的断言语句的长度平均分别为 9.74 和 10.74。
接着本文分析 ATLAS 成功生成的断言语句中,有多少出现在训练集中(IRar 生成的断言语句肯定全部都出现在训练集中)。经过统计本文发现,ATLAS 正确生成的断言语句中,绝大多数都在训练集中出现过(其中 Datasetold 数据集中 92.59%,Datasetnew 数据集中 98.76%)。实验结果表明 ATLAS 成功生成“新”的断言的能力还很弱。
4.1.3 ATLAS 和 IRar 不能成功生成的 assertion
在研究了 ATLAS 和 IRar 能成功生成的断言之后,本文接着分析 ATLAS 和 IRar 不能成功生成的断言。
表 6 展示了 ATLAS 和 IRar 不能成功生成的断言距离标注断言的编辑距离。从表中可以看到,约 40%-50%不能成功生成的断言可以在修改三个 token 的情况下将其改对。
表 7 展示了当编辑距离为 1 时,该 token 的类别。从表中可看到,常量是最需要开发者主要修改的地方。
4.2 RAadapt 方法的有效性
表 8 展示了 RAadaptH 和 RAadaptNN 在不同断言类型的准确率,实验结果表明 RAadaptH 和 RAadaptNN 在不同断言类型上的准确率都高于 ATLAS,同时 RAadaptNN 可以达到最高的准确率。
4.3 结合方法的有效性
4.3.1 基于信息检索方法和基于深度学习方法的互补性
图 3 和图 4 分别展示了基于信息检索方法和基于深度学习方法在两个数据集上的的互补性。从图中我们可以看到,两种方法存在很强的互补性。因此本文进一步提出了结合的方法。
4.3.2 结合方法的准确率
表 9 展示了本文提出的结合的方法在不同断言类型的准确率,实验结果表明结合方法可以在两个数据集上达到最好的效果
五、 总结
本文首次尝试在断言生成中利用信息检索 (IR),并提出了一种基于 IR 的方法,包括 IRar 技术和 RAadapt 技术。本文还提出了一种结合方法,用于结合基于 IR 的方法和基于 DL 的方法(例如 ATLAS),以进一步提高有效性。本文的实验结果表明,IRar 要比 ATLAS 更有效,在两个数据集上分别达到 36.26% 和 37.90% 的准确率。此外,本文的 RAadapt 技术可以在两个数据集上分别达到 43.63% 和 40.53% 的准确率。最后,结合的方法在两个数据集上实现了 46.54% 和 42.20% 的准确率。本文的工作传达了一个重要信息,即基于 IR 的方法对于软件工程任务(如断言生成)具有竞争力且值得追求,鉴于近年来 DL 解决方案已经过分流行,研究社区应该认真考虑如果更准确有效地将 DL 用于软件工程任务。
文章来自北京大学、华为云 PaaS 技术创新 Lab;PaaS技术创新Lab隶属于华为云(华为内部当前发展最为迅猛的部门之一,目前国内公有云市场份额第二,全球第五),致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!(招聘接口人:guodongshuo@huawei.com; huwei18@huawei.com;)
PaaS 技术创新 Lab 主页链接:https://www.huaweicloud.com/lab/paas/home.html
参考文献
Hao Yu, Yiling Lou, Ke Sun, Dezhi Ran, Tao Xie, Dan Hao, Ying Li, Ge Li, Qianxiang Wang. 2022. Automated Assertion Generation via Information Retrieval and Its Integration with Deep Learning. In Proceedings of the 42th IEEE/ACM International Conference on Software Engineering (ICSE), https://taoxiease.github.io/publications/icse22-assertion.pdf
Cody Watson, Michele Tufano, Kevin Moran, Gabriele Bavota, and Denys Poshyvanyk. 2020. On Learning Meaningful Assert Statements for Unit Test Cases. In Proceedings of the 42th IEEE/ACM International Conference on Software Engineering (ICSE). 1398–1409. https://doi.org/10.1145/3377811.3380429
Carlos Pacheco and Michael D. Ernst. 2007. Randoop: Feedback-Directed Random Testing for Java. In Companion to the 22nd ACM SIGPLAN Conference on ObjectOriented Programming Systems and Applications Companion (OOPSLA). 815–816. https://doi.org/10.1145/1297846.129790
Pietro Braione, Giovanni Denaro, and Mauro Pezzè. 2016. JBSE: A Symbolic Executor for Java Programs with Complex Heap Inputs. In Proceedings of the 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering (ESEC/FSE). 1018–1022. https://doi.org/10.1145/2950290.2983940
Gordon Fraser and Andrea Arcuri. 2011. EvoSuite: Automatic Test Suite Generation for Object-Oriented Software. In Proceedings of the 19th ACM SIGSOFT Symposium and the 13th European Conference on Foundations of Software Engineering (ESEC/FSE). 416–419. https://doi.org/10.1145/2025113.2025179
Tao Xie. 2006. Augmenting Automatically Generated Unit-Test Suites with Regression Oracle Checking. In Proceedings of the 20th European Conference on Object-Oriented Programming (ECOOP). 380–403. https://doi.org/10.1007/11785477_23
Robert B. Evans and Alberto Savoia. 2007. Differential Testing: A New Approach to Change Detection. In Proceedings of the 6th Joint Meeting on European Software Engineering Conference and the ACM SIGSOFT Symposium on the Foundations of Software Engineering: Companion Papers (ESEC/FSE). 549–552. https://doi.org/10.1145/1295014.1295038
Kunal Taneja and Tao Xie. 2008. Automated Regression Unit-Test Generation. In Proceedings of the 23rd IEEE/ACM International Conference on Automated Software Engineering (ASE). 407–410. https://doi.org/10.1109/ASE.2008.60
华为伙伴暨开发者大会 2022 火热来袭,重磅内容不容错过!
【精彩活动】勇往直前·做全能开发者→12场技术直播前瞻,8大技术宝典高能输出,还有代码密室、知识竞赛等多轮神秘任务等你来挑战。即刻闯关,开启终极大奖!点击踏上全能开发者晋级之路吧!
【技术专题】未来已来,2022技术探秘→华为各领域的前沿技术、重磅开源项目、创新的应用实践,站在智能世界的入口,探索未来如何照进现实,干货满满点击了解!
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/6c6ada7fbb1274be5cf5f7cb3】。文章转载请联系作者。
评论