用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/gaoqiongxie/skills-ai --skill test-driven-development命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | test-driven-development |
| description | 测试驱动开发(TDD)方法论,严格执行'红-绿-重构'循环进行新功能开发和Bug修复。当用户开始新功能、修复Bug、或者需要添加测试用例时使用。 |
来源: obra/superpowers (142K⭐) - AI辅助开发方法论框架
参考: TDD (Test-Driven Development) 最佳实践
"写测试不是为了证明代码正确,而是为了发现代码可能存在的错误。" —— 测试即文档
TDD三定律:
┌─────────────────────────────────────┐
│ │
▼ │
┌─────────┐ Write ┌─────────┐ Fix │
│ RED │ ────────▶ │ GREEN │ ───────▶│
│ 失败 │ 测试 │ 通过 │ 代码 │
└─────────┘ └─────────┘ │
▲ │
│ │
└──────────── Refactor ─────────────────┘
重构改进
目标:描述期望的行为
操作:
示例:
// ❌ 这会编译失败或测试失败
@Test
void shouldReturnEmptyListWhenNoData() {
// 假设我们要实现:没有数据时返回空列表
List<User> users = userService.findAll();
assertTrue(users.isEmpty());
}
目标:快速让测试通过
操作:
示例:
// ✅ 最简单的实现
public List<User> findAll() {
return new ArrayList<>(); // 直接返回空列表
}
目标:消除重复、提升代码质量
操作:
示例:
// 重构:移除重复,改进设计
public List<User> findAll() {
return userRepository.findAll(); // 真实实现
}
| 场景 | 使用方式 |
|---|---|
| 新功能开发 | 先写测试,再实现 |
| Bug修复 | 先写测试复现Bug,再修复 |
| 遗留代码 | 添加测试覆盖,再修改 |
| 重构 | 先写测试,再重构 |
| 原则 | 说明 | 示例 |
|---|---|---|
| Fast | 快速 | 避免I/O、网络 |
| Independent | 独立 | 不依赖其他测试 |
| Repeatable | 可重复 | 结果确定 |
| Self-validating | 自验证 | 断言明确 |
| Timely | 及时 | 先写测试 |
// 格式:[方法]_[场景]_[期望结果]
@Test
void shouldReturnEmptyListWhenNoDataExists()
@Test
void shouldThrowExceptionWhenUserNotFound()
@Test
void shouldCalculateTotalPriceWithDiscount()
@Test
void shouldProcessOrderCorrectly() {
// Arrange - 准备测试数据
Order order = new Order();
order.addItem(new Item("Product", 100));
// Act - 执行被测操作
double total = orderProcessor.calculateTotal(order);
// Assert - 验证结果
assertEquals(100, total, 0.01);
}
| 类别 | 测试用例 |
|---|---|
| 正常流程 | 正确输入,正常返回 |
| 边界条件 | 0、空、最大值 |
| 异常处理 | null、非法输入 |
| 边界值 | -1、0、1、最大值+1 |
| 特殊值 | 空字符串、空集合 |
┌─────────┐
│ E2E │ ← 少量,端到端
┌─────────┐
│集成测试 │ ← 中量,按模块
┌─────────┐
│ 单元测试 │ ← 大量,最快最便宜
└─────────┘
| 层级 | 数量 | 执行速度 | 覆盖范围 |
|---|---|---|---|
| E2E | 10-20 | 慢(分钟) | 关键路径 |
| 集成 | 50-100 | 中(秒) | 模块交互 |
| 单元 | 100+ | 快(毫秒) | 函数/类 |
修改代码后,确保:
# 运行所有测试
npm test
# 运行特定测试
npm test -- --grep "UserService"
# 生成覆盖率报告
npm test -- --coverage
## TDD开发记录
### 功能:[功能名称]
#### 🔴 RED - 失败的测试
```java
[测试代码]
[实现代码]
[重构后的代码]
| 场景 | 测试 | 状态 |
|---|---|---|
| 正常流程 | testXXX_Normal | ✅ |
| 空输入 | testXXX_Empty | ✅ |
| 异常输入 | testXXX_Exception | ✅ |
✅ 12 tests passed
⏱️ 0.5s
📊 85% coverage
## 反模式警示
❌ **不要**:
- 先写代码后写测试(事后诸葛亮)
- 测试覆盖所有路径(聚焦关键逻辑)
- 测试依赖实现细节(测试行为非实现)
- 测试之间互相依赖(保持独立)
- 忽略失败的测试(失败即停)
✅ **应该**:
- 测试业务价值,而非技术细节
- 最小化设置代码
- 一个测试一个断言
- 让测试描述文档化