让 Claude Code 先写测试再改代码,成功率会高很多

让 Claude Code 先写测试再改代码,成功率会高很多

关键词:Claude Code 测试驱动, Claude Code TDD, Claude Code 先写测试, AI 编程助手 单元测试

这篇继续围绕 Claude Code 展开,主题是「让 Claude Code 先写测试再改代码,成功率会高很多」。前面几篇已经讲过安装、settings.json、-p 模式和 CLAUDE.md,这次往真实使用流程里再拆细一点。

为什么 AI 改代码也需要测试

小白用 Claude Code 时,最大痛点是:它说改好了,但你不知道是不是真的好。这种「我说了算」的感觉很危险,因为模型偶尔会编出根本跑不通的代码。

解决方法不是让模型变更强,而是让你身边多一个「裁判」——这个裁判就是测试。

测试驱动的核心思路

传统 TDD 的口号是「红、绿、重构」:

  1. 写一个失败的测试(红)
  2. 写最简单的代码让它通过(绿)
  3. 在测试保护下重构

配合 Claude Code 时,这三步可以更朴素一点:

  1. 先描述你要的行为:用一句话说清楚函数应该接收什么、返回什么
  2. 让模型先写测试:根据你的描述,写一个最小可验证的单元测试
  3. 再让它改代码:让测试由红变绿

这种顺序的好处是:先写测试,模型就先有了「目标」,而不是凭印象写代码。

一个简单的例子

假设你要写一个判断邮箱合法的函数。

不要直接说「帮我写一个邮箱校验函数」。这种问法太开放,模型可能写得过于复杂。

换成:

我要一个 isValidEmail(s) 函数,规则是:必须包含 @,@ 前后都不能为空,整个字符串里不能有空格。先帮我写 5 个单元测试覆盖这些规则,再写实现让测试通过。

这样模型会按你的规则严格做。

第二个用法:用测试锁定 Bug

排查 Bug 时,同样可以走测试驱动:

  1. 让 Claude Code 先写一个「能稳定复现 Bug」的测试
  2. 确认这个测试当前是失败的
  3. 然后再让它改代码,让测试由红变绿

这种做法的好处是:以后这个 Bug 再也不会悄悄回来。

第三个用法:回归测试当文档

小项目常常没文档,全靠看代码理解。让 Claude Code 在写代码的同时补几条单元测试,这些测试本身就是「最忠实的文档」——因为它们和代码同步更新,比 README 更可信。

写测试时的几个小习惯

基于一般经验(不是绝对结论),让 AI 写测试时建议注意:

  • 每个测试只验证一件事,不要让一个测试 assert 五条规则
  • 测试名字要能读懂,比如 test_email_without_at_should_fail
  • 不要 mock 一切,能用真实数据就用真实数据,否则测试会沦为「测试模型自己」
  • 测试要快,慢测试不会被频繁跑,跑不上的测试等于没写

常见误区

第一个误区:让模型自己决定要测什么。这样它会挑容易过的测,绕开真正容易错的部分。规则要你来定。

第二个误区:为了覆盖率而写测试。覆盖率不是目标,发现回归才是目标。

第三个误区:测试和代码一起改。如果你发现 Claude Code 在测试失败时直接去改测试而不是改代码,要立刻打住——这是它在「作弊通过」。可以在 CLAUDE.md 里写一条:「测试失败时优先修代码,不要直接改测试。」

小结

测试驱动对 Claude Code 来说,不是高门槛的工程实践,而是一种简单粗暴的「质量保险」。先写测试再改代码,AI 的乱跑空间会小很多,你的审查负担也会轻很多。

让 Claude Code 先写测试再改代码,成功率会高很多 流程图
TDD 红绿循环图:写失败测试(红)→ 让 Claude Code 改代码 → 测试通过(绿)→ 重构,循环箭头,旁边标注「测试是 AI 的护栏」

延伸阅读

如果你还没看前面的基础篇,可以先看《Claude Code 从零搭建》《settings.json 权限配置》《CLAUDE.md 项目规则》这几篇,再回来看本文会更顺。

小结

Claude Code 真正好用的地方,不是让它一次性替你完成所有事,而是把流程拆清楚:哪些让 AI 做,哪些必须人来确认,哪些结果要留下验证记录。这个习惯养成之后,它就更像一个靠谱的编程搭档。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注