← 最新论文
💻 computer science

Beyond Coverage and Kill Scores: Empirically Measuring Test Suite Behavioural Gaps

本文介绍了一种通过将从文档和代码中提取的预期行为与实际测试覆盖率进行对比,从而量化“行为差距”的自动化方法,揭示了即使在高度覆盖的代码中,仍有很大一部分预期行为未被测试,且这些差距无法通过行覆盖率或变异得分等传统结构化指标被检测出来。

原作者: Partha Protim Paul, Reid Holmes

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

原作者: Partha Protim Paul, Reid Holmes

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

想象一下你是一位大厨,写下了一份完美巧克力蛋糕的食谱。你写下了每一个步骤:“混合面粉”、“加入鸡蛋”、“烤至金黄”。

现在,想象你有一组品鉴员(测试套件),他们的职责是检查你的蛋糕是否做得正确。

旧方法:计数步骤

传统上,软件工程师通过计算步骤来检查品鉴员是否尽职了。

  • 代码覆盖率(Code Coverage): 品鉴员是否尝遍了每一种原料?(他们碰过面粉吗?鸡蛋呢?糖呢?)
  • 变异得分(Mutation Score): 如果我们偷偷把糖换成了盐,品鉴员能否察觉并说:“嘿,这味道不对!”?

如果以上问题的答案都是“是”,那么旧的指标会判定:“干得漂亮!蛋糕很完美。”

问题所在:缺失的“单例(Singleton)”

论文作者认为,仅仅计数步骤是不够的。你可能尝遍了每一种原料,却依然忽略了食谱的精髓

他们举了一个来自流行软件库的真实案例:

  • 食谱(文档): 一个名为 emptyArray() 的方法旨在返回一个空盒子。但食谱还规定:“这个盒子很特殊;它是同类中唯一的一个。如果你两次索要它,你会得到完全相同的物理盒子,而不是一个新盒子。”
  • 品鉴员报告(测试): 品鉴员检查了盒子。他们打开盒子,看到它是空的,然后说:“通过!”他们甚至检查了制作这个盒子所使用的每一行代码。
  • 差距: 品鉴员从未检查过它是否为同一个盒子。他们错过了这个“特殊规则”。

如果后续代码发生错误,导致每次都生成一个新盒子,品鉴员也不会察觉,因为他们只检查了盒子是否为空,而没有检查它是否为同一个。

这种缺失的检查被称为行为差距(Behavioural Gap)。这是指在“食谱所要求发生的事”与“品鉴员实际验证的事”之间存在的鸿 Á。

新工具:BFINDER

研究人员开发了一个名为 BFINDER 的工具(可以把它想象成一个超级智能的机器人食谱检查员)。

  1. 阅读食谱: 它利用人工智能(AI)来阅读自然语言文档(食谱)和代码。
  2. 列出预期: 它会写下一份清单,列出代码应该执行的所有操作(例如:“必须返回一个空盒子”、“必须每次都返回同一个盒子”)。
  3. 检查品鉴员: 它查看现有的测试,以确定哪些预期行为已被实际检查。
  4. 发现差距: 它会标出品鉴员遗漏的内容。

他们的发现

团队在 10 个非常流行的、经过严格测试的软件库(就像顶级的连锁烘焙店)上测试了该工具。以下是他们的发现:

  1. 工具有效: BFINDER 非常擅长阅读食谱并确定品鉴员应该检查什么。它的准确率高达 93%。
  2. 差距确实存在: 即便是这些高质量、经过充分测试的库,仍有 17.5% 的预期行为完全未被测试。品鉴员忙于检查原料,却忽略了规则。
  3. 机器人也会遗漏: 研究人员要求两个著名的 AI 测试生成器(EvoSuite 和 ASTER)编写新的测试。即使是这些机器人也遗漏了 20.6% 到 27.1% 的预期行为。这证明了遗漏这些“规则”不仅仅是人类的失误,而是目前软件测试方法中一个根本性的盲点。
  4. 高分并不代表安全: 最令人惊讶的部分是,他们观察了那些拥有 100% 覆盖率(即品鉴员触及了每一行代码)的方法。即便如此,仍有 38.2% 的方法存在未被测试的行为。
    • 类比: 你可以有一个品鉴员尝遍了蛋糕的每一粒碎屑(100% 覆盖率),但如果他们没有检查蛋糕是否真的是巧克力的(行为),那么即使蛋糕变成了香草味的,他们也无法察觉。

核心启示

论文总结道,代码覆盖率变异得分就像是在检查品鉴员是否碰到了蛋糕。它们很有用,但它们无法告诉你品鉴员是否真正理解了食谱

行为覆盖率(Behavioural Coverage) 是一个全新的、独立的维度。它追问的是:“我们是否真的验证了软件是否如文档所承诺的那样运行?”

作者建议,要真正了解软件是否安全且正确,我们需要衡量的不仅是代码被触及的程度,还要验证其预期行为是否得到了验证。这就像是区分“检查汽车零件是否齐全(覆盖率)”与“检查汽车是否能跑在路上(行为)”之间的区别。

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

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

试用 Digest →