惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
Security Archives - TechRepublic
Security Archives - TechRepublic
W
WeLiveSecurity
Cloudbric
Cloudbric
博客园 - 司徒正美
美团技术团队
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
PCI Perspectives
PCI Perspectives
宝玉的分享
宝玉的分享
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
Last Week in AI
Last Week in AI
S
Schneier on Security
N
News | PayPal Newsroom
B
Blog RSS Feed
L
LINUX DO - 最新话题
T
Troy Hunt's Blog
S
Secure Thoughts
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tenable Blog
S
Securelist
L
LangChain Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
InfoQ
H
Heimdal Security Blog
Cisco Talos Blog
Cisco Talos Blog
F
Full Disclosure
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
K
Kaspersky official blog
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第17章:与 Qt VTK Python pythonOCC 生态集成 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
05-TDD系统化调试与完成前验证
我才是银古 · 2026-05-04 · via 博客园 - 我才是银古

第五章:TDD、系统化调试与完成前验证

5.1 三个质量门禁

superpowers-zh 中最能改变 AI 编码质量的三个 Skills 是:

  • test-driven-development
  • systematic-debugging
  • verification-before-completion

它们分别对应三个问题:

问题 Skill 核心原则
如何新增或改变行为 TDD 没有失败测试,不写生产代码
如何处理 Bug 或失败 系统化调试 未找到根因,不提修复方案
如何宣称完成 完成前验证 没有新鲜验证证据,不许说完成

三者组合起来,形成从实现到修复再到交付的质量闭环。

5.2 TDD 的基本循环

test-driven-development 使用经典红-绿-重构循环:

  1. 红灯: 写一个最小失败测试,描述期望行为。
  2. 验证红灯: 运行测试,确认它因预期原因失败。
  3. 绿灯: 写最少的生产代码让测试通过。
  4. 验证绿灯: 运行测试,确认通过且输出干净。
  5. 重构: 在测试保持通过的前提下清理代码。
  6. 重复: 为下一个行为写下一个失败测试。

最关键的是「先失败」。如果测试一写就通过,说明它没有证明新行为缺失,可能只是覆盖了已有行为,或者测试写错了。

5.3 TDD 适用范围

Skill 要求以下场景始终使用 TDD:

  • 新功能。
  • Bug 修复。
  • 重构。
  • 行为变更。

可能例外的场景包括一次性原型、生成代码、纯配置文件等,但应询问用户或团队规则。不能因为「这很简单」就跳过。

5.4 好测试的标准

一个好测试应满足:

  • 只测一个行为。 如果测试名里出现多个「和」,通常要拆分。
  • 名称清晰。 例如「空邮箱应被拒绝」,不要叫「test1」。
  • 测试真实行为。 不要只验证 mock 被调用次数,而应验证用户可观察结果。
  • 展示期望 API。 测试应让读者知道代码应该如何使用。
  • 包含边界和错误场景。 尤其是 Bug 修复。

AI 常犯的错误是写过度 mock 的测试。mock 只在外部服务、时间、随机数、网络等不可控依赖上使用;核心业务逻辑应尽量用真实代码验证。

5.5 为什么后补测试不等于 TDD

后补测试回答的是「这段代码做了什么」,先写测试回答的是「这段代码应该做什么」。

后补测试会受到实现影响:

  • 容易测试实现细节而不是需求。
  • 容易遗漏实现者没有想到的边界。
  • 测试立即通过,不能证明它能捕获错误。
  • 不能驱动更好的 API 设计。

因此,如果 AI 已经先写了生产代码,再声称「现在补测试」,应要求它删除实现,从测试重新开始,除非用户明确允许例外。

5.6 系统化调试的四阶段

systematic-debugging 用于任何 Bug、测试失败、构建失败、性能问题或异常行为。它分四个阶段:

第一阶段:根因调查

  • 完整阅读错误信息和堆栈。
  • 稳定复现问题。
  • 检查近期变更。
  • 在多组件系统中收集边界证据。
  • 跟踪数据流,找到错误值从哪里产生。

在这个阶段之前,不允许提出修复方案。

第二阶段:模式分析

  • 找到代码库中正常工作的类似示例。
  • 对比参考实现。
  • 列出所有差异。
  • 理解依赖、配置和隐含假设。

这能避免 AI 在不了解现有模式时发明新写法。

第三阶段:假设与验证

  • 提出单一假设,例如「我认为失败是因为 X,因为 Y」。
  • 做最小改动验证假设。
  • 每次只改一个变量。
  • 验证失败就回到调查,而不是叠加更多补丁。

第四阶段:实施

  • 创建失败测试复现问题。
  • 修复根本原因,而不是症状。
  • 验证修复和回归。
  • 如果 3 次以上修复失败,应质疑架构,而不是继续猜。

5.7 调试中的危险信号

以下想法都说明 AI 正在偏离系统化调试:

  • 「先试着改一下 X。」
  • 「大概是这里的问题。」
  • 「一次改几个地方跑跑看。」
  • 「不完全理解,但这应该能行。」
  • 「先临时修一下,以后再查。」
  • 「错误太简单,不需要流程。」

遇到这些信号,应要求回到第一阶段:复现、读错误、查变更、收集证据。

5.8 完成前验证的门禁

verification-before-completion 的核心规则是:没有新鲜验证证据,不许宣称完成。

它要求在任何正面结论前完成 5 步:

  1. 确定: 什么命令能证明这个结论?
  2. 运行: 执行完整命令,不能依赖之前结果。
  3. 阅读: 看完整输出、退出码和失败数量。
  4. 验证: 判断输出是否支持结论。
  5. 陈述: 只有这时才能说测试通过、构建成功或任务完成。

如果构建命令无法运行,也应如实说明原因,而不是说「应该能通过」。

5.9 不同结论需要的证据

想表达的结论 需要的证据 不够的证据
测试通过 测试命令 exit 0,输出显示 0 failures 代码看起来对
构建成功 构建命令 exit 0 lint 通过
Bug 已修复 能复现原症状的测试通过 修改了相关代码
没有回归 相关回归测试或完整测试通过 手动点了一下
文档可构建 静态站点构建成功 Markdown 语法肉眼检查
PR 可提交 构建、测试、审查和安全验证完成 自我感觉完成

5.10 三个 Skill 的协同使用

新功能

  1. brainstorming 确认需求。
  2. writing-plans 拆计划。
  3. test-driven-development 每个行为先写失败测试。
  4. verification-before-completion 完成前跑测试和构建。

Bug 修复

  1. systematic-debugging 复现并定位根因。
  2. test-driven-development 写失败测试复现 Bug。
  3. 修复根因。
  4. verification-before-completion 跑回归和相关套件。

测试失败

  1. systematic-debugging 读错误和复现。
  2. 找到失败与近期变更的关系。
  3. 修复后运行失败测试。
  4. 再运行更大范围测试。

5.11 在没有测试框架的项目中怎么办

TDD 并不等于必须有完善测试框架。若项目没有测试框架,可以:

  • 使用现有脚本或命令行工具构造可重复验证。
  • 写最小临时验证脚本,但临时文件应放在 /tmp,不要提交。
  • 对文档项目运行静态站点构建。
  • 对配置变更运行对应工具的校验命令。
  • 对 UI 变更使用截图或浏览器检查作为补充证据。

如果确实无法自动化验证,应明确说明限制和手动验证步骤,不要伪装成测试通过。

5.12 对 AI 输出的监督提示

你可以这样要求 AI:

请严格使用 test-driven-development:先写一个失败测试,运行并展示失败原因,再写最少实现。
这是一个测试失败问题。不要直接修复,先使用 systematic-debugging 找根因。
在你说完成之前,请使用 verification-before-completion,运行能证明结果的命令并引用输出。

这些提示能把 AI 拉回流程,尤其在它开始说「应该」「看起来」「可能」时非常有用。

5.13 本章小结

TDD 防止未验证实现,系统化调试防止猜测式修复,完成前验证防止虚假完成。三者共同构成 superpowers-zh 的质量底座。只要坚持这三条,AI 编程的可靠性会显著提升;一旦跳过,AI 很容易回到「快速生成、慢速返工」的老路。