(论文阅读)On Learning Meaningful Assert Statements for Unit Test Cases

[技术积累]On Learning Meaningful Assert Statements for Unit Test Cases

会议:ICSE’2020

作者:Cody Watson(Washington and Lee University),Michele Tufano(Microsoft)

ABSTRACT

Software testing是软件生命周期的重要组成部分,其需要花费大量的时间和精力。据估计,软件开发人员将近 50% 的时间用于测试他们编写的代码。因此,学术界的一个长期目标就是实现软件测试的(部分)自动化。虽然已经提出了几种自动生成测试方法的技术和工具,但最近的研究对其生成的断言语句的质量和实用性提出了批评。因此,我们采用了一种基于神经机器翻译(NMT)的方法叫ATLAS(AuTomatic Learning of Assert Statements)来自动化地为测试方法生成有意义的断言语句。给定一个test method和一个focal method(即被测试的方法),ATLAS 就能预测有意义的断言语句,以评估focal method的正确性。我们将 ATLAS 应用于 GitHub 项目中的数千个测试方法,当只考虑top1的预测断言时,它能在 31% 的情况下准确预测开发人员手动编写的断言语句。当考虑到top5的预测断言语句时,ATLAS 能够在 50% 的情况下预测出精确匹配的断言语句。这些令人鼓舞的结果表明,我们的方法具有以下潜在用途:(i) 作为自动测试案例生成技术的补充;(ii) 为开发人员提供代码完成支持,他们可以在编写测试代码时从推荐的断言语句中获益。

Background

编写高质量的软件测试是一项艰巨而耗时的任务。为了帮助控制测试的复杂性,理想情况下,开发团队应遵循测试自动化金字塔的规定[8],该金字塔建议首先编写单元测试,对代码中功能离散的小部分进行评估,以发现特定的实现问题,并在软件演进过程中快速识别regression。尽管单元测试非常有用,但先前的工作表明,一旦项目达到一定的复杂度,要加入单元测试就需要在traceability方面付出巨大努力,从而降低了增加单元测试的可能性[16]。在软件演进和维护过程中,更新现有单元测试还面临更多挑战[16]。

为了帮助解决这些问题,软件测试学术界开展了大量研究,旨在通过自动生成测试来帮助开发人员[9, 24]。然而,最近的研究指出了这些自动化工具的一些局限性,并质疑它们能否充分满足工业开发人员的软件测试需求 [5,31]。例如,人们发现最先进的方法生成的断言语句往往不完整或缺乏必要的复杂性,无法捕捉到指定的故障。生成有意义的断言语句是自动生成测试用例的关键挑战之一。断言语句在测试用例中提供关键的逻辑检查,以确保程序正常运行并产生预期结果。然而,编写或生成有效的断言语句是一个复杂的问题,需要了解特定单元测试的目的和相关生产代码的功能。因此,生成有效断言语句的技术需要预测所需检查的类型和逻辑性质,并使用源代码和测试代码作为预测的上下文线索。

Methodology

基于以上背景,作者提出了ATLAS,一个使用Neural Machine Translation(NMT)自动生成语法和语义正确的单元测试断言语句的方法。据我们所知,这是评估基于 NMT 的断言语句自动生成方法的第一个经验性步骤。由于我们的模型只需要测试方法和焦点方法,因此即使项目缺乏初始测试基础设施,我们也能帮助开发人员自动生成断言。请注意,我们的方法不是自动测试案例生成技术 [9, 24] 的替代品,而是一种补充技术,可与这些技术相结合以提高其有效性。换句话说,自动测试案例生成工具可用于创建测试方法,而我们的方法可帮助为其设计有意义的断言语句。

为了训练 ATLAS,我们在 GitHub 上挖掘了所有使用 JUnit assert 类的 Java 项目。我们总共分析了 9k 多个项目,提取了 2,502,623 个开发人员编写的断言语句用于测试方法的示例。我们利用这些数据使 NMT 模型能够生成与开发人员创建的断言语句非常相似的断言语句。因此,我们不仅能提高软件测试阶段的效率,还能通过学习人工编写的断言语句来提高准确性和自然性。我们从 Java 项目中提取出包含断言语句的相关测试方法后,根据 Qusef 等人[29]的直觉,自动识别出每个断言语句的重点方法。我们假设,将测试方法和焦点方法结合起来,就能为模型提供足够的上下文,从而自动生成有意义的断言。

Evaluation

我们对 NMT 模型进行了定量和定性评估,以验证其对开发人员的实用性。

在定量分析中,我们将模型生成的断言语句与开发人员手动编写的 Oracle 断言语句进行了比较。如果模型能够预测出与开发人员编写的断言语句完全相同的断言语句,我们就认为该模型是成功的。 如果考虑排名前 5 位的建议,这一比例将上升到 49.69%(7857 条)。

在定性分析中,我们分析了 “不完善的预测”(即与开发人员手动编写的断言相比,在语义或语法上可能存在差异的预测),以了解它们是否可被视为原始断言的可接受替代方案。在我们分析的 10% 案例中,我们发现情况确实如此。最后,我们计算了不完善预测与原始断言之间的Edit distance,以评估开发人员将推荐的断言语句调整为自己会使用的断言语句所需的努力。我们的研究表明,对 “不完美 “的断言稍作改动,就能轻松地将其转换为有用的建议。

Contributions

  • 我们首次引入ATLAS,一种基于NMT的自动生成断言语句的方法。我们将详细介绍挖掘、合成和预处理技术,以便从野生方法中提取测试方法,并训练和测试 ALTAS;
  • 对 ATLAS及其使用NMT为给定test method准确生成语义和语法正确的断言语句的能力进行实证分析;
  • 对模型进行定量评估,并对建模原始方法和抽象测试方法进行详细比较;
  • 公开可用的复制软件包[4],包含本文讨论的源代码、模型、工具和数据集.

1. Automatically Generate Test Methods For Java

  • Evosuite: 是最流行的自动测试生成工具之一,它使用基于突变的系统来生成适当的断言语句。
  • Randoop: 是另一种通过智能猜测创建断言的自动测试生成工具。这种技术通过分析所创建语句的执行轨迹,应用反馈导向的随机测试。
  • Agitar: http://www.agitar.com/

2. Evaluate the ability of state-of-the-art automated techniques

  • An Industrial Evaluation of Unit Test Generation: Finding Real Faults in a Financial Application. ICSE’17
  • Automated Unit Test Generation for Evolving Software. FSE’15