---
name: tdd
description: 当需要先编写测试再实现功能的开发流程时使用此规则——测试驱动开发规则，先编写测试再实现功能，提升代码质量。包括：编写失败的测试用例（红）；实现最小代码使测试通过（绿）；重构代码保持测试通过；编写单元测试和集成测试；使用测试框架进行自动化测试；遵循测试最佳实践；确保测试覆盖率；编写可测试的代码；持续重构和改进测试。每当用户提及"测试驱动"、"TDD"、"红绿重构"、"先写测试"、"单元测试"、"测试先行"或需要测试驱动开发、质量保证、代码测试时触发，无论编程语言和测试框架如何。如果需要按照先测试后代码的流程进行开发，请使用此规则。
---

# 测试驱动开发 (TDD) 规则

## 你必须遵循的工作流程

### 红-绿-重构循环（严格执行）

1. **🔴 红阶段（编写失败的测试）**：
   - 在实现任何功能代码之前，必须先编写测试用例
   - 测试必须描述期望的行为，而不是实现细节
   - 运行测试，确认测试失败（红色）

2. **🟢 绿阶段（让测试通过）**：
   - 编写最简单的代码让测试通过
   - 不要过度设计，只实现让测试通过的最小代码
   - 运行测试，确认测试通过（绿色）

3. **🔵 重构阶段（优化代码）**：
   - 在测试通过的基础上，优化代码结构
   - 重构后必须再次运行测试，确保所有测试仍然通过
   - 如果重构导致测试失败，立即回滚或修复

## 你必须遵守的原则

### 测试优先原则

- **禁止**：在编写测试之前实现功能代码
- **必须**：为每个新功能编写测试用例
- **必须**：测试应该清晰、可读、可维护
- **必须**：使用描述性的测试名称，清楚表达测试意图

### 测试覆盖要求

- **必须**：为所有新功能编写对应的测试
- **必须**：测试覆盖以下三种情况：
  - 正常情况（happy path）
  - 边界情况（edge cases）
  - 异常情况（error cases）
- **必须**：确保测试独立运行，不依赖其他测试
- **必须**：确保测试可重复执行，结果一致

## 实践指导

### 编写测试时的思考方式

- 问自己："这个功能应该做什么？"而不是"这个功能如何实现？"
- 测试应该验证行为，而不是实现细节
- 一个测试只验证一个行为或场景

### 发现 Bug 时的处理流程

1. 先编写测试用例重现该 Bug
2. 运行测试，确认测试失败（重现问题）
3. 修复代码
4. 运行测试，确认测试通过（问题已解决）

## 代码示例

```python
# ✅ 正确做法：先写测试
def test_calculate_total():
    assert calculate_total([1, 2, 3]) == 6
    assert calculate_total([]) == 0
    assert calculate_total([-1, 1]) == 0

# 然后实现功能
def calculate_total(numbers):
    return sum(numbers)
```

## 执行检查清单

在提交代码前，你必须确认：

- [ ] 所有新功能都有对应的测试用例
- [ ] 测试覆盖了正常、边界和异常情况
- [ ] 所有测试都能独立运行
- [ ] 所有测试都能通过
- [ ] 测试名称清晰描述测试意图
