开发工作流
用 Claude 驱动的 TDD 写出更干净的代码
红、绿、重构,测试由 AI 来写
Claude Code 在 TDD 方面表现得非常出色:你描述想要的行为,它先写出会失败的测试,然后实现能让测试通过的代码。这颠覆了 TDD 传统的痛点:编写测试不再是耗时的部分。你专注于用通俗语言描述行为,而 Claude Code 负责测试搭建、断言和 mocking 这些重复性工作。结果是更高的测试覆盖率、设计更好的代码,以及更快的开发速度。
使用 Claude Code 进行测试驱动开发遵循红-绿-重构循环:你描述想要的行为,让 Claude 写出一个会失败的测试,然后要求它实现能让测试通过的代码。只要给出清晰的规格说明,Claude Code 就能自主完成整个循环。
循环
使用 Claude Code 的 TDD 循环
描述你想要实现的行为:“用户应该能够通过电子邮件重置密码。该端点应验证邮箱是否存在,生成一个有时效限制的令牌,并发送重置链接。”在任何实现存在之前,Claude Code 会先编写测试,断言预期的 HTTP 响应、令牌生成和邮件发送。它会运行该测试,确认它因正确的原因失败(缺少函数,而不是语法错误)。
接着,Claude Code 会编写能让测试通过的最简单实现。它不会过度设计,只写恰好足以满足测试断言的代码。这种纪律正是 TDD 的闪光点:测试定义了契约,而实现则去履行它。Claude Code 在编写实现后会运行测试套件,验证新测试通过,并且没有破坏现有测试。
有了通过的测试作为安全网,你可以让 Claude Code 清理实现:提取辅助函数、改进变量命名、减少重复、或优化性能。每完成一步重构后,Claude Code 都会重新运行测试。如果某个测试失败,说明重构引入了行为变化,Claude Code 会撤销或调整该变化。这一阶段会在全面测试的支撑下,产出干净、可维护的代码。
实操演练
编写你的第一个测试驱动功能
首先从用户的角度告诉 Claude Code 这个功能应该做什么。不要说“创建一个叫 calculateDiscount 的函数,接收价格和百分比”,而要说“拥有高级会员资格的客户,订单总额应享受 20% 的折扣,但折扣永远不应超过 50 美元”。这种基于行为的描述能产生更好的测试,因为测试验证的是业务规则,而不是实现细节。
Claude Code 会写出一个包含多个测试用例的测试文件:正常路径(高级用户,有效折扣)、边界情况(折扣超过 50 美元上限,价格为零的订单),以及错误情况(非高级用户,负数价格)。在让 Claude Code 实现该功能之前,先审查这些测试。测试用例定义了你的规格;如果缺少某个情况,现在就补上。补一个测试用例的成本,远低于在生产环境中才发现一个遗漏的边界情况。
一旦你批准了测试,就让 Claude Code 去实现该功能。它会编写代码、运行测试,并把结果展示给你。如果所有测试一次就通过,你就可以进入重构阶段。如果有测试失败,Claude Code 会读取失败的输出并调整实现。这个循环通常在一到两次迭代内就能完成,远比手动的编写-运行-调试循环快得多。
为什么有效
为什么 Claude Code 让 TDD 变得更容易
开发者跳过 TDD 的首要原因,是写测试感觉又慢又繁琐,尤其是搭建代码、mocking 和重复性的断言。Claude Code 完全消除了这种阻力。你只需用一句话描述应该发生什么,Claude Code 就会生成包含正确 import、fixture、mock 和边界情况覆盖的完整测试文件。认知负担从“我该如何 mock 这个依赖”转变为“哪种行为才重要”。
当 Claude Code 根据行为描述编写测试时,它会生成开发者常常忘记的边界情况:空输入、边界值、并发访问、空值处理,以及非法的状态转换。它能做到这一点,是因为它见过数百万个测试套件,知道哪些边界情况常常会引发 bug。你无需自己想到每一种情况,就能获得更彻底的测试覆盖。
TDD 之所以难以坚持,是因为跳过测试直接写代码的诱惑始终存在。使用 Claude Code,先写测试实际上比先写实现更快,所以没有跳过测试的动机。红-绿-重构循环因此变得自然,因为 Claude Code 会强制执行每一步:编写测试、运行它以确认失败、实现代码,再次运行测试以确认成功。
框架支持
Claude Code 支持的测试框架
Claude Code 编写 Jest 和 Vitest 测试,具备正确的 mocking、异步处理、快照测试,以及与 React Testing Library 的集成。它生成读起来像规格说明的 describe/it 代码块,并使用 beforeEach/afterEach 来实现干净的测试隔离。
完整支持 pytest,包括 fixture、parametrize、mark、conftest.py,以及 pytest-asyncio、pytest-django、pytest-mock 等插件。Claude Code 编写的测试通过 fixture 实现依赖注入,并遵循 Arrange-Act-Assert 模式。
Claude Code 编写符合 Go 惯用写法的表驱动测试,具备正确的错误包装和子测试;还编写 Rust 的 #[test] 函数,具备正确的 Result 处理、setup/teardown,以及用于基于属性测试的 proptest 集成。
对于全栈 TDD,Claude Code 编写 Playwright 测试,从浏览器端驱动整个应用程序运行。它处理页面导航、表单交互、API 断言和视觉回归,让你只需描述用户故事,它就会生成自动化测试脚本。
常见问题
用 Claude Code 做 TDD 的常见问题
当然可以。Claude Code 会读取你现有的测试基础设施、测试框架、fixture、mock、factory 和约定,并写出能自然融入你现有测试套件的新测试。如果你的项目使用带有 conftest.py fixture 的 pytest,Claude Code 会生成使用这些 fixture 的测试。如果你的 React 项目使用带有自定义渲染工具的 Testing Library,Claude Code 会遵循这种模式。你不需要从零开始。
覆盖率的百分比不如覆盖率的质量重要。Claude Code 帮助你专注于行为覆盖,而不是行覆盖。当你按照功能应该做什么(而不是怎么做)来描述时,生成的测试自然就会覆盖重要的路径。话虽如此,Claude Code 也可以分析你现有的覆盖率报告,识别未被测试覆盖的分支,然后编写有针对性的测试来填补空白。目标应该是全面覆盖业务逻辑和错误处理,而不是 100% 的行覆盖率。
能。Claude Code 编写能让多个组件协同运作的集成测试:直接连接真实测试数据库的 API 端点、与模拟 API 响应交互的 React 组件,或是协调多个依赖的服务层。它处理测试数据库的搭建和清理、测试 fixture,以及模拟服务器的配置。对于 API 集成测试,它生成能验证完整请求-响应周期的测试,包括身份验证、验证和错误响应。
在绿色阶段(测试通过且实现可用)之后,你进入重构阶段。请 Claude Code 改进实现、提取函数、减少重复、改进命名,或优化性能。Claude Code 会进行修改,并在每一步重构后重新运行测试套件。如果某个测试失败,就说明重构改变了行为,Claude Code 会修复这次重构,或将该行为变化标记出来供你审查。测试在整个过程中都充当安全网。
用自然语言描述功能行为,让 Claude Code 写出会失败的测试(红色),然后请它实现能让测试通过的代码(绿色),最后要求进行重构(重构)。使用 Claude Code 的这种红-绿-重构循环比手动 TDD 更快,因为 Claude 同时编写测试和实现,而你则专注于定义需求。
会。Claude Code 在编写每个测试之后,以及每次修改实现之后都会运行你的测试套件。它读取测试输出,识别失败,并不断迭代直到测试通过。你还可以设置钩子,在每次文件编辑后自动运行 linter 和类型检查器,从而创建一个完全自动化的质量关卡。