# 测试驱动开发 (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)
```

## 执行检查清单

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

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