关键词:
Java方法纯净性
纯净方法识别
机器学习
测试用例自动生成
程序分析
摘要:
在Java语言中,纯净方法指的是执行过程中不会对已存在对象产生副作用的方法。纯净方法的识别是程序语言研究领域的经典问题之一。现有的经典纯净方法识别工具ReImInfer,会遗漏纯净方法的识别,且不能识别不纯净方法。本文归纳了被遗漏的纯净方法的种类,并初步探索了这些方法被遗漏识别的原因。
为了将遗漏的纯净方法识别出来,本文将纯净方法识别转换为二元分类问题,提出了一种基于机器学习的方法纯净性识别方案。该方案通过收集103个Java代码相关的特征,首次将纯净方法识别转换为基于特征的类别预测,并构建随机森林分类模型,最终预测待检测的方法是否是纯净的。在数据收集阶段,本文使用ReImInfer工具收集纯净的方法,但由于ReImInfer工具不能识别不纯净方法,因此本文提出了新的不纯净方法的识别规则,该规则基于静态程序分析技术,保证对不纯净方法的识别结果是准确的。在方法评估阶段,本文收集了10个Java开源项目上的7838个方法,其中纯净性方法5849个,不纯净方法1989个,并以这些方法作为训练集构建分类模型,判断10个项目中方法的纯净性。在预测为纯净方法的727个方法中,经人工校验有706个确实是纯净方法,精确度高达97%,具有较高的识别精度。
本文进一步将机器学习结果应用到测试用例自动生成技术中,改进了主流的Java测试用例自动生成工具EvoSuite与Randoop。其中改进EvoSuite的作用体现在测试用例中生成了更多的断言,从而使回归测试更加有效;改进Randoop则体现在可以避免更多无效方法调用并同时生成更多断言,从而提高测试用例质量。为了更好的评估实验结果,本文使用生成断言数量、杀死变异个数等指标来量化的评估了改进纯净性分析对EvoSuite与Randoop的影响。实验结果表明,应用机器学习识别出的纯净方法后,EvoSuite在仅使用ReImInfer结果的基础上生成的断言数量平均增加29.6%,相对应额外杀死9.8%的程序变异;Randoop则在仅使用ReImInfer结果的基础上额外避免了11.7%的无效方法调用,新增了38%的断言语句,对应额外杀死了2.8%的变异。实验表明基于纯净方法识别的额外生成的断言是有效的。
本文的研究重点在于发现ReImInfer工具的不足,并将纯净性分析问题转换为二元分类问题来弥补不足。最终,纯净性分析的结果应用于测试用例生成领域,优化并量化了纯净性分析对测试生成的影响。