← 最新论文
💻 computer science

Reproduction Test Generation for Java SWE Issues

本文通过引入 TDD-Bench-Java(首个包含来自开源仓库的 250 个实例的该任务基准)以及 e-Otter++(一种在该基准和专有行业数据集上均展现出高性能的适配方案),解决了 Java 领域缺乏复现测试生成工具的问题。

原作者: Toufique Ahmed, Jatin Ganhotra, Avraham Shinnar, Martin Hirzel

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

原作者: Toufique Ahmed, Jatin Ganhotra, Avraham Shinnar, Martin Hirzel

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

想象你是一家大型公司的软件侦探。一名用户报告了一个漏洞:“嘿,当我点击这个按钮时,应用程序崩溃了!”在修复代码之前,你需要证明该漏洞确实存在。你会编写一个小型自动化测试脚本来尝试点击该按钮。如果脚本崩溃,你就确认了漏洞的存在。一旦你修复了代码,再次运行该脚本;如果它现在完美运行,你就知道修复是有效的。

本文旨在教导人工智能自动编写这些特定的“漏洞猎捕”脚本,但有一个转折:它是针对 Java 进行的,这是一种被大型公司广泛使用的编程语言,而此前的人工智能工具大多仅对 Python 表现良好。

以下是他们工作的分解,使用了一些日常类比:

1. 问题:缺失的“漏洞猎手”

在软件世界中,编写这些漏洞猎捕测试既枯燥又常被跳过。最近,人工智能在编写 Python(一种在初创公司和数据科学中流行的语言)的此类测试方面已表现出色。但 Java 是企业界的“重型机械”(银行、航空公司、大型科技公司)。人工智能在 Java 方面表现挣扎,因为它更加严格且复杂。

作者表示:“我们需要一种更好的方法来教导人工智能在 Java 中猎捕漏洞。”

2. 新地图:TDD-Bench-Java

为了训练和测试他们的人工智能,他们需要一张地图。他们创建了一个名为 TDD-Bench-Java 的新基准。

  • 类比:将其想象成一个巨大的“人工智能健身房”。它包含来自著名开源 Java 项目的 250 份真实漏洞报告。每次“锻炼”由一个漏洞描述和修复前的代码组成。人工智能的任务是编写一个测试,使其在损坏的代码上失败,而在修复后的代码上通过。
  • 重要性:在此之前,没有标准化的方法来评估人工智能是否真的能在 Java 上做到这一点。该基准是首个此类基准。

3. 解决方案:e-Otter++(智能侦探)

他们利用了一个现有的人工智能侦探 e-Otter(它在 Python 方面表现出色),并为其进行了 Java 改造,将新版本称为 e-Otter++

以下是这位人工智能侦探逐步解决案件的方式:

  • 步骤 1:定位器(寻找犯罪现场)
    人工智能查看漏洞报告和庞大的代码库。它必须猜测问题隐藏在哪里。这就像侦探看着城市地图和模糊的犯罪描述,猜测要调查哪栋具体的建筑和房间。

    • Java 转折:在 Java 中,你通常必须为测试构建一个全新的文件。人工智能必须确切地弄清楚将这个新文件放在哪里,以免破坏建筑的结构。
  • 步骤 2:上下文构建器(收集线索)
    一旦它知道了位置,它就会收集正确的工具(导入项)并设置场景(包名)。这就像侦探在进入房间之前确保拥有正确的徽章和正确的楼层平面图。

  • 步骤 3:初始测试生成器(进行首次尝试)
    人工智能编写一个测试脚本草稿。这是一份粗略的草图。

  • 步骤 4:优化器(反馈循环)
    这是秘诀所在。人工智能在其损坏的代码上运行自己的测试。

    • 情景 A:测试崩溃了,但原因错误(例如,它崩溃是因为拼写错误,而不是漏洞)。
    • 修复:人工智能查看错误消息,意识到自己的错误,重写测试,然后再次尝试。它会这样做多达 10 次,从每次失败中学习,直到找到一个恰好因报告的漏洞而崩溃的测试。
  • 步骤 5:异构提示(用六种方式问同一个问题)
    为了确保不遗漏解决方案,人工智能以六种不同的方式重写漏洞报告(简化它、移除令人困惑的代码、添加“提示”等),并生成六个不同的测试候选项。这就像让六名不同的侦探从不同角度解决同一个案件。

  • 步骤 6:选择器(选出获胜者)
    最后,一个“法官”人工智能查看所有六个候选项,并选出单个最佳测试进行提交。

4. 结果:它有多好?

  • 在公共健身房(TDD-Bench-Java)上:人工智能的成功率约为 44% 到 46%。这意味着在将近一半的案例中,它成功编写了一个能够捕捉漏洞并确认修复的测试。对于如此困难的任务来说,这被认为是一个强有力的结果。
  • 在“现实世界”(专有数据)上:作者还在他们自己的私人公司(IBM)的 150 个漏洞上测试了这一点。
    • 挑战:这些漏洞更难处理。描述更短、更模糊,并且通常涉及创建尚不存在的品牌新文件。
    • 结果:在没有帮助的情况下,人工智能的成功率仅为 4%
    • 修复:当他们给人工智能一个“提示”(告诉它需要创建的新文件的名称)时,成功率跃升至 20%

5. 结论

该论文得出结论,虽然人工智能在编写 Java 的漏洞猎捕测试方面正在变得更好,但与开源项目中发现的更干净的数据相比,它仍然难以应对企业软件中混乱、模糊的现实。

简而言之:他们建立了一个新的训练场(TDD-Bench-Java)和一个更聪明的侦探(e-Otter++),现在可以在 Java 代码中猎捕漏洞。它在标准问题上表现良好,但当线索模糊或代码全新时,仍然需要一点人类的帮助(提示)。

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

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

试用 Digest →