← 最新论文
💻 computer science

Programmable Property-Based Testing

本文介绍了“延迟绑定抽象语法”,这是一种用于基于属性测试的新型混合嵌入语言,它通过将属性具象化为数据结构以实现属性与执行的解耦,从而为设计自定义属性运行器提供了更大的灵活性和可编程性。

原作者: Alperen Keles, Justine Frank, Ceren Mert, Harrison Goldstein, Leonidas Lampropoulos

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

原作者: Alperen Keles, Justine Frank, Ceren Mert, Harrison Goldstein, Leonidas Lampropoulos

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

想象一下你是一名制造复杂机器的工厂质量检测员。你的工作是确保每一台机器都能正常运转。

在软件世界中,这项工作被称为基于属性的测试(Property-Based Testing, PBT)。你不是在检查某一台特定的机器,而是编写一条规则(即“属性”),例如:“无论你制造出什么样的机器,它都必须始终满足 X 条件。”然后,一个计算机程序(即“运行器”)会自动构建成千上万台随机机器,并根据你的规则进行测试,试图找出其中有缺陷的一台。

问题所在:“黑盒”运行器

这篇论文指出,目前的测试工具就像是一条僵化、预制的组装流水线

  • 好消息是: 编写规则(属性)非常容易。你只需要说:“检查引擎是否运转。”
  • 坏消息是: 计算机实际构建和测试这些机器的方式被锁在一个“黑盒”里。你无法改变它构建机器的方式。
    • 也许你想让它根据之前失败的经验来构建机器(比如一个能学习在哪里寻找漏洞的智能机器人)。
    • 也许你想以某种特定的方式去破坏机器,从而发现隐藏的缺陷。
    • 也许你想让 100 个不同的工人同时进行测试。

在目前的工具中,如果你想改变这条组装流水线,你不能仅仅调整设置。你必须拆掉整个工厂,从头开始重建一个新工厂,仅仅为了改变测试是如何进行的。这令人沮丧,并且限制了你的测试能变得多聪明。

解决方案:“延迟绑定抽象语法”(DBAS)

作者提出了一种构建这些测试工具的新方法。他们称之为延迟绑定抽象语法(Deferred Binding Abstract Syntax, DBAS)

请不要把 DBAS 仅仅看作一条僵化的组装流水线,而要把它看作一本 LEGO(乐高)说明书

  • 旧方式(浅层嵌入/Shallow Embedding): 说明书只是一段写在纸上的句子。你可以阅读它,但你无法将其拆解或重新排列。工厂主(库作者)已经决定了这些词汇如何打印,而你只能遵循。
  • 新方式(DBos): 说明书是由 LEGO 积木构建而成的。
    • 你仍然可以用看起来像普通英语的方式编写你的规则(属性)。
    • 但在底层,计算机将你的规则保存为一叠物理积木。
    • 因为它是用积木构成的,所以(用户)可以拿起这叠积木,观察这些部件,并决定如何解释它们。

它是如何工作的:“延迟”的小技巧

论文引入了一个聪明的技巧,叫做“延迟绑定”。

  • 常规逻辑: 通常,当你说明“对于每辆车,检查其刹车”时,你必须先选定一辆具体的车,然后再检查它。
  • DBAS 逻辑: 系统会说:“我会把挑选特定车辆的过程推迟到最后一刻。”相反,它会保留一份关于所有车辆的规则列表,只有当“运行器”(执行测试的人)准备好实际测试某样东西时,它才会说:“好了,现在让我们选一辆车并检查刹车吧。”

这种分离是神奇之处所在。这意味着规则(你想测试的内容)与运行器(如何进行测试)是完全分离的。

你能用它做什么?

因为规则现在是一叠 LEGO 积士(一种数据结构)而非锁死的句子,你可以通过编写自己的代码来编写自己的“运行器”,而不会破坏工厂。论文展示了他们构建了几种新型运行器:

  1. “智能”运行器(覆盖率引导模糊测试/Coverage-Guided Fuzzing): 这个运行器不再是随机构建机器,而是会记住哪些构建出的机器导向了有趣的路径。然后,它会针对这些特定的机器进行微调,看看能否找到新的故障路径。它就像一名侦探,会记住线索并追踪最有希望的线索。
  2. “团队”运行器(并行测试/Parallel Testing): 这个运行器将工作分配给许多个共享同一个笔记本的工人(线程)。他们相互协作,以免在构建相同的机器上浪费时间。
  3. “自定义反馈”运行器: 这个运行器会监听来自机器的特定信号(例如它使用了多少内存或运行了多久),并利用这些信息来构建更好的测试用例。

实验结果

作者在两种语言(Rocq 和 Racket)中测试了这个新系统,并将其与旧有的“锁定型”系统进行了对比。

  • 速度: 它与旧系统一样快。拥有这种灵活性并没有带来性能损失。
  • 灵活性: 他们仅通过编写用户级代码,就能构建出所有这些复杂的智能运行器(如上述的“智能”和“团队”运行器),而无需重建核心库。
  • 更好的测试: 在一次实验中,他们发现通过改变“种子池”(线索列表)的管理方式,他们能比标准工具更快地发现 Bug。

核心结论

这篇论文介绍了一种编写软件测试的新方法,它将“测试过程”从一个锁定的、预制的机器转变为一个可编程、可定制的工具。它允许开发者发明自己的测试策略(如智能模糊测试或并行测试),而无需成为测试库内部代码的专家。它让测试变得更加灵活、强大且适应性强,且不会降低运行速度。

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

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

试用 Digest →