← 最新论文
💻 computer science

LLM-based Mockless Unit Test Generation for Java

本文介绍了 MocklessTester,这是一种新颖的基于大语言模型的生成无桩 Java 单元测试的方法,它结合了上下文增强生成与约束强制修复,以克服幻觉和依赖挑战,在基准数据集的覆盖率和变异得分上显著优于最先进的基线方法。

原作者: Qinghua Xu, Guancheng Wang, Lionel Briand, Zhaoqiang Guo, Kui Liu

发布于 2026-05-27
📖 1 分钟阅读☕ 轻松阅读

原作者: Qinghua Xu, Guancheng Wang, Lionel Briand, Zhaoqiang Guo, Kui Liu

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

想象你是一家制造复杂机器的工厂的质量检验员。你的工作是编写一份检查清单(即“测试”),以确保机器的每个部件都能正常运行。

在软件世界中,这些机器是Java 程序,而这些检查清单就是单元测试

旧方法:“假部件”问题

传统上,当检验员测试机器的某个特定部件(例如齿轮)时,他们通常不会使用与其连接的真实发动机或真实燃油泵。相反,他们会使用模拟对象(mocks)——这些部件的虚假、橡胶复制品。

  • 类比:想象通过连接一个燃油泵的纸板模型来测试汽车发动机。你可以检查发动机是否转动,但你永远无法知道真实的燃油泵是否堵塞或损坏,因为你从未真正使用过它。
  • 问题:这种方法快速且简单,但留下了“浅层”的覆盖范围。它遗漏了真实部件相互作用时才会出现的错误。

新挑战:“真实部件”的噩梦

这篇论文的作者希望停止使用纸板模型。他们希望测试真实的燃油泵和发动机(真实的依赖项)。

  • 问题:这极其困难。如果你尝试连接一个真实的燃油泵,你需要确切知道如何连接它、按什么顺序打开开关以及使用何种燃料。
  • AI 的挣扎:研究人员使用了一个超级智能的 AI(大型语言模型,LLM)来编写这些测试。但 AI 不断犯下两类错误:
    1. “不知道”:AI 不知道真实工厂实际上是如何连接这些部件的。它进行猜测,创建了真实代码中不存在的虚假连接。
    2. “不遵循”:即使你告诉 AI 规则(例如,“在启动发动机之前先打开开关”),它有时也会忽略这些规则,按错误的顺序执行,导致机器爆炸(崩溃)。

解决方案:认识"MocklessTester"

团队构建了一个名为MocklessTester的新系统。把它想象成一位拥有超级笔记的主检验员

MocklessTester 不再仅仅要求 AI“编写测试”,而是为 AI 提供两种特殊工具来修正其错误:

1. “真实案例”工具(上下文增强生成)

为了解决**“不知道”**的问题,系统会扫描整个工厂的历史记录。

  • 类比:AI 不再猜测如何连接燃油泵,而是查看工厂的日志,看看其他工人过去是如何成功连接该泵的。它复制这些真实且有效的模式。
  • 结果:AI 不再编造虚假连接,而是开始使用代码中发现的真实连接。

2. “严格规则手册”工具(约束强制修复)

为了解决**“不遵循”**的问题,系统扮演一名严格的安全检验员,分两个阶段检查工作。

  • 阶段 1(草稿):AI 编写测试。
  • 阶段 2(审计):在测试被接受之前,系统会根据三条严格规则对其进行审查:
    • 符号检查:“你是否发明了一个不存在的部件?”(如果是,请用真实的部件替换它)。
    • 协议检查:“你是否在打开开关之前就启动了发动机?”(如果是,强制 AI 修正顺序)。
    • 记忆检查:“你是否之前尝试过同样的修复并失败了?”(如果是,请尝试不同的方法)。
  • 转折:如果 AI 未能通过审计,它必须撰写一份理由说明,解释为什么它的新修复符合规则。这迫使 AI 在再次行动前仔细思考。

结果:更好的测试,多花一点时间

研究人员在两组软件项目上测试了这个新系统:

  1. Defects4J:一个标准的旧 Java 项目集合。
  2. Deps4J:一个全新的现代复杂项目集合,AI 从未见过(以确保 AI 不是通过死记硬背旧答案来“作弊”)。

发现

  • 更深层的覆盖:与之前的最佳方法相比,MocklessTester 发现了多 20% 的错误,并覆盖了多 25% 的代码行。关键在于,它实际上测试了机器中真实连接的部件,而不仅仅是孤立的齿轮。
  • 代价:完成这项工作需要更多的时间和“脑力”(计算令牌)。AI 必须尝试更多次才能正确完成。
  • 结论:多花的时间是值得的。测试质量大大提高,捕捉到了“假部件”测试所遗漏的现实世界问题。

一句话总结

这篇论文表明,通过向 AI 提供代码使用方式的真实示例,并强制其遵守严格规则,给予其第二次机会来解释其工作,我们终于可以在不依赖虚假、橡皮图章式的“模拟”部件的情况下,自动化复杂软件的测试。这之间的区别,就像是用纸板发动机测试汽车,与用真实发动机测试汽车的区别。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →