用途
TDD 是一个测试驱动开发技能,面向项目已有的测试框架,提供“红 → 绿”循环的操作指引。它建议在循环开始前和循环过程中查阅,而不是循环结束后才用。
主要能力
- 循环规则:先红后绿,先写失败测试并确认它因正确原因失败(例如缺少路由导致 404,而不是导入拼写错误),再写刚好足够通过的代码,不做投机性功能。每次循环只做一个接缝、一个测试、一个最小实现;下一个测试根据上一轮学到的东西来写,不预先写完所有测试再写实现。重构不属于循环,属于代码审查步骤。
- 好测试的标准:通过公共接口验证行为,而非实现细节;测试读起来像规格说明,能在重构后继续有效。
- 接缝选择:接缝是进行测试的公共边界。按优先级从高到低选择:传输边界(HTTP、RPC、GraphQL,经真实路由并以认证用户身份断言响应与持久化状态)、UI 组件(框架组件测试工具)、CLI 命令(断言退出码与副作用)、后台任务或事件处理器(运行处理器或真实执行分发并断言副作用)、领域服务或动作(直接测试其公共 API)、模型或数据类型(仅限非平凡查询、转换和派生值)。优先使用代码库已有接缝,尽量少用,目标是只用一个。
- 技术栈适配:从清单文件(composer.json、package.json、pyproject.toml、go.mod、Cargo.toml、Gemfile)识别技术栈;当前提供 Laravel(composer.json 中含 laravel/framework)的参考文件,其他技术栈按现有测试套件约定应用规则。
- 各技术栈通用规则:数据库复用套件已有的隔离方式,不引入第二套约定,不指向真实环境数据库;测试数据通过工厂或构建器构建,把有意义的变体命名为状态(如“overdue”发票);队列、邮件、通知、存储和出站 HTTP 用框架 fake 或忠实的内存适配器替换,断言副作用而非内部调用路径,不 mock 自己类的内部;日期相关用框架时间辅助或注入时钟冻结或移动时间,不用 sleep;授权是行为,每个“用户可以 X”的测试都要写“用户不能操作他人记录上的 X”的测试。
- 快速循环:每轮只运行聚焦测试,运行器支持时运行受影响集合;支持并行时并行运行套件;有监视模式时在可用环境下对聚焦测试启用监视,每次保存报告红或绿,否则每轮重跑聚焦测试。用户要求停止测试时,本轮后续不再执行测试命令,保留最后一次聚焦结果,并继续用户要求的代码修改。测试必须顺序无关且不共享数据库状态。CI 仍运行完整套件。
使用方式
开始前,如存在 GLOSSARY.md(或较旧的 CONTEXT.md)先阅读,使测试名称和接口词汇与项目领域语言一致,并遵守所触及区域的 ADR。编写或审查测试前,阅读 references/testing-best-practices.md,并在整个循环中应用其价值门槛和拒绝规则。根据清单识别技术栈后,如存在对应的参考文件,在第一个循环前阅读。
适用场景
以测试优先方式构建功能时,或在既有测试框架下需要 TDD 操作参考时使用。
限制
目前仅提供 Laravel 的专项技术栈参考,其他技术栈需按套件现有约定应用。其他具体细节(如支持的运行器、监视模式可用范围等)暂未提供。