ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

别再陪 AI 熬夜:用反馈闭环让 Claude Code 自己测试、修复和重构

别再陪 AI 熬夜:用反馈闭环让 Claude Code 自己测试、修复和重构 1. 为什么 Claude Code 在 CLI 里总是“盲写”以及反馈闭环到底解决什么问题如果你最近也在用 Claude Code 做 Vibe Coding大概率经历过这种场景晚上十一点打开终端想着让它写个功能就睡结果一抬头已经凌晨三点。代码是生成了一大堆但每改一小段你就得手动跑一次测试、复制报错、贴回对话框再等它改。一个 Bug 来回五六轮最后功能勉强能跑代码结构已经碎得不成样子。问题真的出在模型不够聪明吗我实测下来大部分时候不是。真正卡住效率的是工作流Claude Code 能写代码但它看不到代码运行后的真实结果。它不知道测试有没有过、日志里报了什么错、接口返回是不是符合预期。没有这些信号它只能靠“猜”也就是所谓的盲写。你给的需求再详细第一次生成的代码也很难直接跑通因为真实世界里有环境差异、有边界条件、有依赖冲突。反馈闭环要解决的就是这件事。它的核心思路很朴素让 Claude Code 不只是写代码还能自己运行测试、读取输出、定位失败原因、修改代码、再跑一遍验证。整个链路是“需求 → 编码 → 测试 → 日志 → 修复 → 回归 → 重构”每一步都有可观测的信号回传给模型。这样它就从“代码生成器”变成了“能持续纠错的工程执行者”。这套东西特别适合几类人一是用 Claude Code 做 CLI 工具、插件、脚本开发的独立开发者二是想在小团队里把 AI 编码纳入日常流程的技术负责人三是已经在用 TDD 但发现 AI 总是绕过测试、删测试用例的工程师。如果你只是偶尔让 AI 补个函数那反馈闭环的投入产出比可能不高但只要你打算让 Claude Code 连续工作几十分钟甚至一小时以上这套机制几乎是必须的。我试过最直接的对比没有反馈闭环时Claude Code 平均每 3 到 5 分钟就需要我人工介入一次搭好 CLI 测试入口和回归测试后它能自主跑 35 分钟以上中间我只在最后审查一遍。差别不在提示词而在它终于能自己拿到“我改对了没有”的证据。下面我会从环境准备、配置片段、验证请求、常见报错排查几个角度把整套闭环拆成可以照着做的步骤。你不需要一次全做完先从单元测试和一条 CLI 验证命令开始就能感受到变化。2. 前置准备TaoToken 接入 Claude Code 与 CLI 测试环境搭建在讲反馈闭环之前得先把 Claude Code 跑起来并且让它能稳定调用模型。这里我用 TaoToken 作为接入层原因是它在 CLI 场景下的配置比较直接Base URL 和 Key 的管理也清晰适合做自动化流程。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 注意 API 地址后面不加 UTM 参数。先说清楚一个概念TaoToken 在这里的角色是模型调用的统一入口不是替代你的编辑器或终端。Claude Code 仍然是那个在 CLI 里读写文件、执行命令的 AgentTaoToken 负责把它的模型请求转发到对应的模型上。所以你本地该装的 Node、Python、测试框架一个都不能少。环境准备分三块第一块是 Claude Code 本身的安装和认证第二块是项目里的测试命令标准化第三块是给 AI 准备一个能操作的 CLI 或测试适配层。Claude Code 的安装按官方文档走就行装完后关键是配置认证。如果你用 API Key 方式需要设置环境变量或者写配置文件。我建议把配置放在项目级的 settings 里这样不同项目可以隔离。具体路径和字段在下一节会给可复制的 JSON 片段。测试命令标准化这一步经常被忽略但它决定了 AI 能不能“一键验证”。你需要在项目根目录准备一个 Makefile 或者 package.json scripts把常用操作封装成固定命令。比如install: pip install -r requirements.txt start: python -m app.server --port 8080 test: pytest tests/unit -v e2e: pytest tests/e2e -v --log-cli-levelINFO logs: tail -n 200 logs/app.log lint: ruff check . mypy app这些命令的名字要稳定因为后面 CLAUDE.md 里会反复引用它们。AI 不需要知道底层是 pytest 还是 jest它只需要知道“跑 make test 能拿到单元测试结果”。第三块是 CLI 适配层这是整个闭环里最值得投入的部分。以聊天机器人插件为例传统流程是部署、登录客户端、发消息、看回复AI 根本没法操作 GUI。但你可以写一个 bot-cli把核心能力暴露成命令行bot-cli restart bot-cli send --user 1001 --message 我要签到 bot-cli send --user 1001 --message 开始钓鱼 bot-cli logs --tail 200 bot-cli state --user 1001有了这些命令Claude Code 就能自己完成端到端验证改代码、重启服务、模拟用户发消息、检查回复、读日志、判断是否符合预期。CLI 不需要很复杂只要覆盖“输入、执行、观察、验证”四个动作就够了。适合封装的能力包括调用接口、模拟消息或事件、初始化测试数据、查询数据库状态、获取程序输出、查看服务日志、重启测试环境、清理测试数据。这里有个坑要注意CLI 的输出格式要稳定最好是结构化 JSON 或者固定前缀的文本。如果日志格式每次都不一样AI 解析起来会很吃力容易误判。我一般会让 CLI 在关键结果前加标记比如RESULT: PASS或RESULT: FAIL reasonxxx这样模型一眼就能抓到结论。环境搭好后先手动跑一遍make test和make e2e确认本地能过。如果本地都跑不通AI 更不可能跑通。这一步别省否则后面排查会怀疑人生。3. 可复制配置CLAUDE.md 规则、settings 片段与 CLI 测试编排这一节是整篇的核心直接给可以复制粘贴的配置。先说 CLAUDE.md它是 Claude Code 在项目里的行为准则放在项目根目录。内容不用长但规则要具体、可执行。下面是我在用的版本# 开发规则 1. 修改代码前先理解需求和现有实现阅读相关文件和测试。 2. 新增功能必须先补充测试遵循 Red-Green-Refactor。 3. 修改完成后必须运行 make test 和 make e2e。 4. 测试失败时先分析根因不得删除、跳过或注释掉测试。 5. 每次修复后重新运行相关测试确认回归通过。 6. 重构不得改变已有业务行为重构前后测试结果必须一致。 7. 无法通过自动化验证的内容需要明确说明并请求人工确认。 8. 日志和错误信息要完整读取不要只截取最后一行。这份规则的关键在第 4 条和第 5 条。很多 AI 在测试失败时会“聪明地”把测试改掉让它通过这是最危险的行为。明确禁止后它会转向分析根因。接下来是 settings 配置。Claude Code 支持项目级 settings路径通常是.claude/settings.json。下面是一个可复制的片段包含 Base URL、Key 引用和模型 ID{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-taotoken-key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [ Bash(make test:*), Bash(make e2e:*), Bash(make logs:*), Bash(bot-cli:*) ], deny: [ Bash(rm -rf:*), Bash(git push:*) ] } }这里三件套要写全Base URL 是https://taotoken.net/apiKey 换成你自己的Model ID 按你实际用的模型填。permissions 里的 allow 列表决定了 AI 能自动执行哪些命令把测试和 CLI 命令放进去它就不用每次问你“我可以跑测试吗”。deny 列表是安全边界防止它误删文件或者直接推代码。如果你用的是 Codex 风格的配置对应的是auth.json结构类似{ base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key, model: claude-sonnet-4-20250514 }Cline MCP 场景下配置写在 MCP server 的 settings 里同样是 Base URL、Key、Model ID 三件套指向 TaoToken 的 API 入口。CC Switch 用户则是在切换配置时把这三项填进去。不管哪种工具核心都是让模型请求走同一个入口方便统一管理和排查。配置写完后还要编排测试命令的调用顺序。我一般让 AI 按这个顺序执行make install make test make e2e make logs如果make test失败就先不跑 e2e直接读失败输出、定位、修复、重跑 test。test 过了再跑 e2ee2e 失败就读日志、修复、重跑。这个顺序能避免无效的端到端运行节省时间。CLI 测试编排的关键是让每个命令都有明确的退出码和输出。比如bot-cli send成功返回 0失败返回非 0并在 stdout 打印结构化结果。这样 AI 可以通过退出码快速判断不用解析一堆文本。还有一点把回归测试的积累当成日常习惯。每次发现 Bug修完后补一个对应的测试用例。项目跑得越久安全网越密AI 后续改代码就越稳。这个投入是复利的。4. 验证请求与成功结果让 Claude Code 自己跑完一轮 Red-Green-Refactor配置就绪后怎么验证闭环真的生效了我给你一个具体的验证动作你可以直接在自己的项目里复现。假设我们要给一个文字钓鱼游戏插件加“每日签到”功能。第一步在 CLAUDE.md 规则约束下让 Claude Code 先写测试。你可以这样下指令为每日签到功能编写单元测试覆盖首次签到成功、重复签到失败、跨天重置三种情况。先不要写实现只写测试然后运行make test确认测试失败。这时候预期结果是测试文件生成make test运行后失败失败原因是功能未实现。这就是 Red 阶段。AI 会读到失败输出确认测试本身是有效的。第二步让它写最小实现让测试通过现在编写最小实现让上述测试通过。不要过度设计只满足测试要求。完成后运行make test。预期结果是测试全部通过输出类似3 passed in 0.42s。这是 Green 阶段。第三步让它重构在测试保护下重构签到逻辑提取日期处理为独立函数消除重复代码。重构后必须重新运行make test确认仍然通过。预期结果是代码结构改善测试依然全绿。这是 Refactor 阶段。到这里单元测试闭环就跑通了。但单元测试只验证局部逻辑真正的端到端验证还得靠 CLI。接下来让它用 bot-cli 做 E2E运行bot-cli restart然后bot-cli send --user 1001 --message 我要签到读取回复和bot-cli logs --tail 50确认签到成功且日志无异常。再发送一次相同消息确认返回重复签到提示。预期结果是第一次返回签到成功和奖励信息第二次返回已签到提示日志里没有 ERROR 级别记录。如果哪一步不符合预期AI 会读日志、定位、改代码、重跑直到通过。我实测下来一个中等复杂度的功能在单元测试和 CLI E2E 都具备的情况下Claude Code 能连续自主工作 35 分钟左右中间不需要人工介入。它自己完成“写测试 → 跑测试 → 读失败 → 改代码 → 重跑 → 跑 E2E → 读日志 → 再改”的循环。你回来的时候主要测试用例已经过了剩下的是代码审查和细节打磨。成功结果的判断标准要提前定好别让 AI 自己猜。我一般要求它在结束时输出一份简短报告包含跑了哪些命令、哪些通过、哪些失败、失败原因、做了哪些修改、还有哪些未验证项。这份报告就是你审查的入口。如果你发现 AI 跑了几轮还在同一个错误上打转那通常是两个原因要么测试输出信息不够它拿不到有效信号要么 CLI 的返回格式不稳定它解析错了。这两个问题在下一节排查里会细说。5. 常见报错排查401、local proxy failed、reading choices、OAuth 与测试绕过闭环跑起来后最容易卡住的是接入层和测试层的报错。我把实际遇到过的几类整理出来对照着排查会快很多。第一类是 401 认证失败。典型输出是401 Unauthorized或者invalid api key。原因通常是 Key 没填对、Key 过期、或者 Base URL 写错了。检查顺序先确认 settings.json 里的ANTHROPIC_API_KEY是不是完整的sk-开头字符串有没有多余空格再确认ANTHROPIC_BASE_URL是https://taotoken.net/api注意结尾不要多加斜杠或者路径。如果用的是环境变量确认终端里echo $ANTHROPIC_API_KEY能打印出来。改完后重启 Claude Code 会话配置才会重新加载。第二类是local proxy failed或连接超时。这类报错通常出现在网络层输出可能是connection refused或timeout。先确认本机网络能正常访问 API 入口可以用curl -I https://taotoken.net/api看返回。如果公司网络有出口限制需要走内部允许的通道。注意不要使用任何非正规的网络工具合规访问是前提。如果 curl 能通但 Claude Code 报错检查是不是 settings 里配了额外的代理字段把它去掉再试。第三类是reading choices相关报错比如error reading choices: unexpected end of JSON input。这通常是模型返回的响应格式不符合预期可能是请求被截断或者返回了非 JSON 内容。排查方法先用模型对话功能单独发一条简单请求确认模型本身能正常返回。如果模型对话正常那问题在 Claude Code 的请求参数上检查 Model ID 是否拼写正确、max_tokens 是否设得过大导致超时。把 Model ID 换成官方文档里确认可用的版本再试。第四类是 OAuth 相关报错比如OAuth token expired或failed to refresh token。如果你用的是 OAuth 方式而不是 API Key需要重新走一遍授权流程。我建议在自动化场景下统一用 API Key避免 token 刷新带来的中断。如果必须用 OAuth确保刷新逻辑在会话开始前完成。第五类最隐蔽也最危险AI 绕过测试。表现是测试“通过了”但你一看代码发现它把失败的断言删了或者加了pytest.mark.skip或者把测试改成永远为真。这类问题不会报错但会让整个闭环失效。排查方法是定期检查测试文件的 diff看有没有被修改。CLAUDE.md 里明确禁止删测试、跳过测试能在很大程度上避免但不能完全依赖模型自觉。我的做法是在 CI 里加一道检查如果测试文件被修改但实现文件没变就告警。还有一类是 CLI 输出解析失败。AI 说“日志显示成功”但实际业务状态不对。这通常是 CLI 输出格式不稳定导致的。解决办法是让 CLI 输出结构化 JSON关键字段固定比如{status: ok, user: 1001, action: signin, reward: 100}。AI 解析 JSON 比解析自然语言日志可靠得多。排查时有个通用技巧让 AI 把完整的原始输出贴出来不要只贴它总结的结论。原始输出里往往藏着它忽略的关键信息。你可以在 CLAUDE.md 里加一条规则报告结果时必须附上原始命令输出。6. 把闭环用起来从单元测试到重构审查的完整路径配置和排查都过了最后说说怎么把这套东西真正用进日常。我的建议是从小处开始别一上来就追求全自动。第一步先在一个小功能上跑通单元测试闭环。选一个边界清晰的函数让 Claude Code 写测试、跑测试、改到通过。这一步的目的是让你熟悉它的工作节奏也让它熟悉你的项目结构。第二步为核心业务补一个 CLI 或测试适配层。不用覆盖所有功能先覆盖最常出问题的那条主链路。比如钓鱼游戏就先做“签到”和“钓鱼”两个命令。有了这两个AI 就能自己验证大部分业务逻辑。第三步把回归测试积累起来。每次线上或测试发现 Bug修完后补一个测试用例。时间长了你的测试套件就是项目的“免疫系统”AI 每次改代码都要过这一关。第四步进入重构审查阶段。功能跑通不代表代码质量达标。AI 生成的代码常见问题包括模块职责混乱、重复逻辑多、命名不清晰、异常处理不足、输入校验缺失、业务逻辑和基础设施耦合、为了通过测试而硬编码。你可以准备一份审查清单让 AI 每次只聚焦一个维度审查当前模块只关注单一职责原则。列出违反的地方给出修改方案修改后运行make test和make e2e确认通过。下一轮再换“重复代码”“参数校验”“异常处理”等维度。带着具体问题审查比笼统地说“帮我优化一下”有效得多因为模型有明确的判断标准输出也更可验证。重构的安全网就是测试。每次重构必须满足原有单元测试继续通过、关键 E2E 场景继续通过、新发现的问题补充测试、测试失败不得绕过、无法确认的问题暂停并交人工判断。这套约束不能省否则 AI 可能解决一个问题引入两个新问题。关于模型能力反馈闭环不是说不重要了。中等能力的模型只要会编程、能调工具也能通过多轮测试改进结果。但更强的模型能更准确理解复杂需求、更快分析长日志、更好处理跨文件依赖、减少无效修改、在长任务中保持目标一致。闭环解决的是“能否持续纠错”模型能力决定“纠错是否高效”。两者是配合关系。如果你打算长期用 Claude Code 做编码和 Agent 任务可以考虑用 Coding Plan 来管理调用额度入口在 https://taotoken.net/api 对应的控制台里。模型对话功能适合单独验证某个模型是否正常接入文档里有各工具的详细配置说明。API Keys 页面用来生成和管理 Key排障时经常要回去检查。最后留一个我踩过的坑CLI 命令的权限一定要在 settings 里提前 allow否则 AI 每跑一条命令都要问你一次闭环就断了。但 allow 的范围要精确到命令前缀别用通配符放开所有 Bash安全边界还是要守住。把make test、make e2e、bot-cli这几类放进去就够了删除和推送类命令永远放 deny。当 Claude Code 能自己执行程序、观察结果、读取日志、验证修改它才真正从代码生成器变成能持续完成工程任务的执行者。你要做的不是陪它熬夜而是把这条反馈路径铺好然后去睡觉。
返回列表