北大李戈团队提出大模型单测生成新方法,显著提升代码测试覆盖率

机器之心报道

单元测试是软件开发流程中不可或缺的一部分,它可以有效验证软件中的最小可测试单元,例如函数或模块,是否按预期工作。然而,对于复杂函数(环复杂度大于10),大模型自身难以生成高覆盖率的测试样例集。为了解决这一难题,北京大学李戈教授团队提出了一种全新的提升测试用例覆盖率的方法,名为 HITS,该方法利用程序分片思想,显著提升了大模型生成单元测试的效率。

HITS 的核心思想:将复杂函数拆解为简单片段

HITS 的核心思想是将复杂待测函数依据语义拆解为若干简单片段,然后让大模型分别为每个片段生成测试样例。这样一来,大模型只需分析原待测函数的一个片段,分析难度大大降低,生成覆盖该片段的单元测试难度也随之降低。最终,通过将各个片段的测试样例整合,就能提升整体测试样例集的代码覆盖率。

HITS 的工作原理:

  1. 程序分片: HITS 使用大模型进行程序分片,将一个程序依据语义划分为若干解决问题的阶段。每个阶段对应着程序中的一片代码,也对应着一个问题解决的步骤。
  2. 生成测试样例: HITS 要求大模型分别为每个代码片设计可以高效覆盖它的单元测试代码。
  3. 分析输入: HITS 会提取要覆盖的片段所接受的一切外部输入,以备后续 prompt 使用。外部输入包括该片段所应用到的先前片段定义的局部变量、待测方法的形参、片段内调用的方法以及外部变量。
  4. 构建 prompt: HITS 构建思维链形式的 prompt 引导大模型生成测试样例。prompt 会分析要满足待覆盖代码片内的各种条件分支的排列组合,并为每种组合生成一个测试样例。
    5.后处理和 self-debug: HITS 通过后处理和 self-debug 使大模型生成的测试样例得以正确运行。

HITS 的优势:

  • 降低大模型分析难度: HITS 将复杂函数拆解为简单片段,降低了大模型分析的难度,从而提升了生成测试样例的效率。
  • 提高代码覆盖率: HITS 可以有效提高测试样例集的代码覆盖率,确保每个代码片段都能得到充分的测试。
  • 利用大模型的优势: HITS 利用大模型强大的自然语言处理能力进行程序分片,并通过 prompt 引导大模型生成测试样例。

实验结果:

研究团队使用 gpt-3.5-turbo 作为 HITS 调用的大模型,在多个 Java 项目中进行了实验,结果显示 HITS 相较于其他基于大模型的单元测试方法和 evosuite,在代码覆盖率方面有显著提升。

HITS 的未来展望:

HITS 的出现为大模型在单元测试领域的发展开辟了新的方向。未来,研究团队将继续探索如何进一步提升 HITS 的性能,并将其应用到更多类型的软件开发中,为提高软件质量和开发效率做出更大的贡献。

相关链接:

  • 论文地址:https://www.arxiv.org/pdf/2408.11324

结语:

HITS 的出现为大模型在单元测试领域的发展提供了新的思路,也为提高软件质量和开发效率带来了新的希望。相信随着技术的不断发展,大模型在软件开发中的应用将会越来越广泛,为软件行业带来更加深刻的变革。


read more

Views: 0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注