← 最新论文
🤖 machine learning

EvoOtter: Evolutionary Reproduction Test Generator

EvoOtter 是一种具有成本效益的进化编程方法,它结合了连续减半、批量大语言模型交叉以及基于规则的变异,并辅以定制的适应度评分,以极低的成本生成高质量的缺陷复现测试,优于以往的推理扩展方法。

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

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

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

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

想象一下,你是一名正在解决谜题的软件侦探。一位开发者说:“我的代码有个 Bug!”但他还没有修复它。在你帮助他修复之前,你需要证明这个 Bug 确实存在。为此,你需要编写一个特殊的“陷阱”测试——这种测试的设计初衷是:现在因为 Bug 而失败,但在 Bug 被修复后会通过

这篇论文介绍了一个名为 EvoOtter 的新工具,它就像一个智能的进化育种程序,可以自动创建这些陷阱测试。以下是它的工作原理,我们使用简单的类比来解释:

问题:寻找正确的陷阱

编写一个因“正确原因”而失败的测试是非常困难的。这就像试图在黑暗的池塘里捕捉一种特定的鱼。如果你只是扔出上千张网(一种被称为“推理缩放”的常用方法),你可能会抓到很多鱼,但成本很高,而且你可能会抓错种类。此外,你还没有拿到“修复后的代码”,所以无法检查你的测试是否真的有效。

解决方案:一个进化的动物园

EvoOtter 将测试生成视为一场捕食者与猎物的游戏。

  1. 捕食者(测试): EvoOtter 从一组候选测试(捕食者)开始。
  2. 猎物(有 Bug 的代码变体): EvoOtter 不仅仅是对原始代码进行测试,它还创建了许多略微损坏的版本(突变体)。把这些想象成“伪 Bug”或“假靶子”,捕食者需要猎杀它们。
  3. 适应度评分: 如果一个测试能够成功捕捉(杀死)这些伪 Bug,那么它就被认为是“强壮的”。如果一个测试是因为正确的原因而失败,它对这些伪 Bug 的反应会与因错误原因而失败的测试有所不同。

EvoOtter 如何节省金钱和时间

该论文介绍了三个聪明的技巧,使这个过程既快速又廉价:

  • 连续减半(“优胜劣汰”过滤器):
    想象你有 8 个测试候选者。与其让它们永远测试下去,不如让 EvoOtter 进行一轮快速测试。它会立即淘汰掉表现最差的 50%(弱小的捕食者)。然后,它会增加“伪 Bug”(猎物)的数量,让下一轮变得更难。这样一来,反馈会变得更加精准,但由于你在用更少的测试去对抗更多的 Bug,总成本保持不变。

  • 批处理交叉(“集体头脑风暴”):
    通常,为了改进一个测试,你可能会要求 AI(大语言模型)一次修复一个测试。这就像要求一位厨师做完一顿饭,再做下一顿,再做下一顿。EvoOtter 则要求 AI 同时观察所有剩余的优秀测试,并说:“这是整批全新的、改进后的测试。”这节省了大量的资金,因为它只需要一次“调用”AI,而不是多次。

  • 基于规则的突变体(“玩具士兵”):
    与其要求昂贵的 AI 来创建伪 Bug(猎物),不如使用简单的、廉价的计算机规则以可预测的方式破坏代码。这让昂贵的 AI 可以全身心地投入到最困难的工作中:创建测试。

结果

论文在现实世界的软件问题上测试了 EvoOtter。

  • 它发现,通过使用这种进化的“育种”方法,它能以比以往方法更便宜的价格生成高质量的陷阱测试。
  • 当使用强大的 AI 模型(Claude-Opus-4.7)配合其“批处理”方法时,它在一个主要基准测试上达到了 75.3% 的成功率,在另一个基准测试上达到了 66.3%
  • 至关重要的是,它完成这项任务的成本仅为其他尝试生成数千个测试并从中挑选最佳测试的方法的一小部分。

简而言之

EvoOtter 就像一名聪明的体育教练。与其让每个队员都跑马拉松来选拔最强者(这既累又贵),教练会设置一系列训练赛,让弱者及早被淘汰。剩下的队员随后会进行一次集体辅导以共同进步。最终的结果是一支冠军队伍(一个完美的 Bug 再现测试),而且寻找这支队伍的过程既快速又省钱。

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

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

试用 Digest →