利用智能体技能实现测试驱动开发
速览
本文探讨了将智能体技能应用于测试驱动开发(TDD)的方法。通过自动化测试生成与验证,提升开发效率与代码质量。该实践有助于开发者更流畅地集成测试环节。
AI 深度解读
我的 Agent 测试驱动开发(TDD)技能:让 AI 写出好测试
背景
截至本文撰写时,AI Agent(智能体)在编写测试代码方面表现普遍不佳。它们生成的测试往往含糊不清、晦涩难懂、过度复杂、充满黑客式的投机取巧、杂乱无章、同义反复、流于形式,甚至完全毫无意义。
造成这一现状的根本原因在于,当前的 AI Agent 是通过人类编写的示例进行训练的,而人类编写的测试示例本身质量往往堪忧。不仅“业余”开发者编写的测试质量低下,令人遗憾的是,许多教师或专家所推崇的测试实践也常常存在严重缺陷。这种环境使得 AI 难以从高质量的人类范例中学习到优秀的测试编写习惯。
作者认为,指望未经指导的 Agent 在短期内显著提升测试编写能力是不现实的。然而,好消息是,如果给予适当的引导,Agent 完全有能力遵循理性的测试驱动开发(TDD)流程,并编写出清晰、有意义的测试。
核心内容
作者分享了一套个人化的 TDD 技能(Skill),旨在通过明确的指令引导 AI Agent 遵循经典的 TDD 原则。这套技能并非完全原创,而是基于 Kent Beck 的“标准 TDD”(Canon TDD)进行了简化和适配。
1. 核心方法论:SEF 循环
作者提出了一种个人化的 TDD 高层视图,称为 Specify-Encode-Fulfill (SEF) 循环,作为对传统“红-绿-重构”(Red-Green-Refactor)的替代或补充:
- Specify(指定):明确你要构建的功能规格说明。
- Encode(编码):将这些规格说明编码为自动化测试(即可执行的规格说明)。
- Fulfill(履行):编写代码以满足这些规格说明。
2. 具体执行步骤:Kent Beck 的标准 TDD
在 SEF 的高层视图之下,作者将 Kent Beck 的标准 TDD 原则转化为以下具体步骤,并内置到 Agent 的技能指令中:
- 列出规格:列出当前 TDD 会话范围内的所有规格说明。
- 编码测试:将列表中的每一项编码为自动化测试。
- 最小化修改:仅对代码进行极微小的修改,以消除当前测试的失败。
- 避免“推测性编码”(Speculative Coding):如果编写的代码超过了使当前测试通过所需的量,风险在于这部分代码永远不会被任何测试覆盖。
- 可选的重构:可以选择进行重构,但必须在提交行为更改之后进行。
- 严禁混合操作:永远不要将行为更改与重构混在一起进行。
- 循环:只要列表不为空,就返回第 2 步。
3. 测试设计审查(Test Design Review)
上述流程主要关注 TDD 的过程,对测试本身的设计影响有限。因此,作者引入了另一个独立的技能:Test Design Review。
- 机制:该技能会生成一个独立的 Agent(以避免偏见),专门检查测试是否违反了设计原则。
- 常见问题:例如,测试过于关注“手段”而非“目的”。
- 作用:提供修复建议。虽然有时建议可能值得商榷,但大多数情况下是切中要害的。当作者对 Agent 编写的测试不满意时,会运行此技能让 Agent 自我纠错。
4. 通用设计审查与“清理厨房”
许多测试设计违规实际上是通用软件设计原则的违规,例如“按事物的本质命名”原则。作者建议将测试同时通过 Software Design Review 技能进行审查。
此外,作者在 TDD 技能中加入了一条非强制性的指令:如果编写预期的测试变得困难,这可能是一个信号,表明我们需要“在做晚饭之前先清理厨房”(即重构现有代码以使其更易于测试)。
- 意外惊喜:尽管作者并未强烈期望此指令会被严格执行,但 Claude 模型对此理解深刻。它经常暂停并询问是否应该“清理厨房”,而且事实证明,这种暂停往往是必要的且有益的。
5. 现状与结论
作者承认,Agent 目前还不能 100% 地写出可接受的测试,但这套 TDD 技能已经足够有效,以至于它已成为作者进行任何代码变更的默认方式。
作者认为,AI 带来的最大生产力提升,来自于将 AI 与几十年前发现、至今依然适用、且无论新技术如何发展都永不过时的永恒不变的原则相结合。
关键要点
- AI 测试编写的痛点:当前 AI 生成的测试普遍存在模糊、复杂、无意义等问题,根源在于训练数据(人类编写的测试)质量参差不齐。
- SEF 循环:作者提出的高层 TDD 框架为 Specify-Encode-Fulfill(指定-编码-履行),替代传统的红-绿-重构概念。
- 标准 TDD 的细化:核心在于“最小化代码修改”以通过测试,严格禁止“推测性编码”,并严格区分“行为更改”与“重构”两个阶段。
- 双重审查机制:
- Test Design Review:专门针对测试设计原则进行独立审查,帮助 Agent 自我纠错。
- Software Design Review:针对通用软件设计原则(如命名规范)进行审查。
- “清理厨房”原则:当测试难以编写时,应暂停并重构现有代码。AI(特别是 Claude)对此指令有较好的响应能力。
- 永恒原则的价值:AI 生产力的最大化并非来自追逐新技术,而是将 AI 能力与经过时间考验的、不变的软件工程原则(如 TDD)相结合。
意义与影响
这篇文章揭示了当前 AI 辅助编程中的一个关键瓶颈:AI 擅长生成代码,但往往缺乏对“可测试性”和“设计质量”的深刻理解,这主要归因于其训练数据中人类示例的质量缺陷。
作者提出的解决方案具有极高的实用价值:
- 提示工程的具体化:通过提供结构化的、基于经典原则(Kent Beck TDD)的“技能”指令,可以显著改善 AI 的输出质量。这表明,针对 AI 的提示工程不应仅停留在通用描述,而应嵌入具体的、经过验证的工程方法论。
- 人机协作的新模式:作者并未完全依赖 AI 的自主性,而是引入了“独立 Agent 审查”和“自我纠错”机制。这种“生成-审查-修正”的闭环是提升 AI 代码质量的有效路径。
- 回归工程本质:文章强调“清理厨房”(重构)的重要性,并指出 AI 能够理解并执行这一抽象概念。这证明了即使是最具创新性的 AI 技术,其效能的释放依然依赖于对传统软件工程核心原则的坚守。
对于开发者而言,这意味着在使用 AI 进行 TDD 时,不能仅仅依赖 AI 的直觉,而必须通过明确的指令框架(如 SEF 循环)和额外的审查步骤来约束和引导 AI,从而获得高质量、可维护的代码。
