SuperAPI AI 工具集

tdd-best-practices

测试与质量

查看项目

更新于 10-19 16:15

技能介绍

用途

tdd-best-practices 是一个面向测试驱动开发的智能体技能。它适用的问题场景是:如何由测试驱动实现、如何组织测试套件,以及如何在测试事后补写的代码库中恢复 TDD 纪律。

工作方式

  • 先写一个失败的测试,然后用最少代码使其通过。
  • 只在所有测试全绿时重构。
  • 测试行为而非实现,测试公共 API 而非私有方法。
  • 测试的简洁程度应与被测生产代码相当。
  • 难以修改的测试套件与难以修改的生产代码代价相同。

Red-Green-Refactor 循环

  • RED:写一个描述下一行为的失败测试。
  • GREEN:写最少代码使其通过。
  • REFACTOR:清理代码与测试,不引入新行为。

纪律在于顺序:绝不在 RED 时重构;在 GREEN 时只添加当前失败测试所要求的行为。

三条法则(Uncle Bob)

  1. 没有失败单元测试前不得写生产代码。
  2. 单元测试只写到足以失败即可;有意缺失的公共 API/类型可作为有效的首个 RED,无关的编译或环境设置失败不算。
  3. 生产代码只写到足以让当前失败测试通过。

设计工作流

  1. 发现测试命令并描述行为:使用仓库工具,命名下一个可观察结果。
  2. 写失败测试:暴露预期断言或缺失的新能力,而非无关设置错误;回归测试必须复现已有缺陷。
  3. 使其通过:走最简单路径,之后可清理。
  4. 重构:消除重复、改进命名、降低复杂度。
  5. 重复:下一个测试应是前进的最小一步。

选择测试粒度

  • 单元测试:隔离单个类/函数,毫秒级,验证单个单元行为。
  • 集成测试:多个真实协作者,秒级,验证模块边界可用。
  • 验收/E2E:从用户视角测整个系统,分钟级,验证功能端到端可用。

逻辑密集代码从单元测试开始;采用由外向内 TDD 时从验收测试开始;集成测试填补衔接处。

经验法则

  • 何时 mock:在单元/应用测试中 mock 或伪造 I/O 边界;在适配器集成测试中,当 SQL、排序规则、约束、搜索分析器、事务或协议行为本身就是测试主题时,使用真实的一次性基础设施。
  • 测试 Aggregate:使用真实 Value Object 和子实体,通过根测试命令,包括被拒绝的命令不改变状态与待发事件。
  • 测试 Domain Events:在 Act 之后断言精确事实:类型/名称、聚合标识、业务载荷、数量与受控元数据;订阅者处理与真实总线注册分开测试,并用集成测试证明持久化的重复/重试行为。
  • 测试 Value Object:测试适用的公共契约:不同实例的语义相等、精确不变量边界,以及暴露的规范化、哈希、防御性复制、运算或序列化行为;注入时钟或策略,而非读取环境上下文。
  • 测试太大:大量设置是检查夹具清晰度和测试范围的信号,而非测试过大的证据;当多个行为或失败原因耦合时拆分。
  • 测试随重构频繁破裂:说明测试耦合到实现而非行为,应将断言移到公共 API 表面。
  • 无法先写测试:把先写测试的困难视为设计或边界信号;遗留约束、框架耦合或缺失接缝可能需要先写特征测试再重新设计。

警示信号

  • 仅在特定执行顺序下通过的测试。
  • 复现生产逻辑的 mock(过度 mock)。
  • 无断言的测试(如 assertTrue(true))。
  • 以方法而非行为命名的测试。
  • 在 CI 上运行超过 10 分钟的测试套件。
  • 内部细节变化时破裂而非行为变化时破裂的测试。

参考文档

资料列出多份参考文档,分别涉及:测试边界与独立预言机(behavioral-feedback)、Red-Green-Refactor、FIRST、测试金字塔与三角测量(tdd-core-practices)、Meszaros 测试替身分类与古典派/模拟派区别(test-doubles)、伦敦派与芝加哥派、BDD、ATDD(tdd-schools)、15 种反模式与恢复策略(tdd-anti-patterns)、多种语言的循环示例(tdd-language-examples)、投影测试(projection-testing)、数据迁移测试(migration-testing)、Value Object 测试(value-object-testing)、Aggregate 测试(aggregate-testing)、领域事件测试(domain-event-testing)、事务测试(transaction-testing)、缓存测试(cache-testing)、领域错误测试(domain-error-testing)、查询条件测试(criteria-testing)。

相关技能

  • 当类难以测试时使用 oop-best-practices,先改进设计。
  • 为无测试的遗留代码添加特征测试时使用 refactoring-best-practices。
  • 在测试前确定 Aggregate 边界与不变量归属时使用 ddd-best-practices。
  • 在测试前设计迁移工作流与切换门槛时使用 data-migration-best-practices。

来源影响

该技能综合自 Kent Beck《Test Driven Development: By Example》、Freeman 与 Pryce《Growing Object-Oriented Software, Guided by Tests》、Michael Feathers《Working Effectively with Legacy Code》、Gerard Meszaros《xUnit Test Patterns》、Ian Cooper 的演讲、James Carr 的 TDD 反模式文章、Ottinger 与 Langr 的 FIRST 文章、Dan North 的 BDD 文章,以及 CodelyTV 的 Aggregates、Value Objects、Repository Pattern、Domain Events、Domain Modeling Errors、Criteria Pattern、Infrastructure Design Transactions、Infrastructure Design Cache、Four Rules of Simple Design 等课程内容。

限制

资料未提供该技能的安装命令、运行平台、具体价格或收费方式,也未给出实际执行环境要求,这些信息暂未提供。