名称: 测试优先缺陷修复 描述: 当用户报告缺陷、描述意外行为、说某事“坏了”、“不工作”、“失败”、提及代码中的“错误”、“问题”或“漏洞”,或要求“修复”某事时,应使用此技能。强制实施测试驱动的缺陷修复工作流。
测试优先缺陷修复
强制实施严格的缺陷修复工作流,以防止回归并并行化修复尝试。
核心工作流
当报告缺陷时,按顺序遵循以下步骤:
阶段 1: 重现和记录
- 理解缺陷 — 收集关于预期与实际情况的细节
- 确定测试位置 — 确定项目中测试所在的位置(检查
tests/、__tests__/、spec/、*.test.*、*.spec.*模式) - 编写失败测试 — 创建一个演示缺陷的测试
阶段 2: 使用子代理修复
- 启动修复子代理 — 使用任务工具,设置
subagent_type=general-purpose来尝试修复 - 运行测试 — 通过运行特定测试验证修复
- 如有需要迭代 — 如果测试仍然失败,用新方法启动额外的子代理
阶段 3: 验证和完成
- 运行完整测试套件 — 确保未引入回归问题
- 报告成功 — 确认缺陷已修复,并通过通过的测试作为证据
编写失败测试
测试命名约定
命名测试以描述缺陷:
# Python (pytest)
def test_user_login_fails_when_email_has_uppercase():
...
# Python (unittest)
def test_should_handle_empty_input_without_crashing(self):
...
// JavaScript (Jest/Vitest)
it('should not crash when input array is empty', () => { ... });
test('handles special characters in username', () => { ... });
// TypeScript
describe('UserService', () => {
it('returns null when user not found instead of throwing', () => { ... });
});
测试结构
每个缺陷重现测试遵循以下模式:
def test_bug_description():
# 1. 安排 - 设置触发缺陷的条件
input_data = create_problematic_input()
# 2. 执行 - 执行导致缺陷的操作
result = function_under_test(input_data)
# 3. 断言 - 验证预期的(正确)行为
assert result == expected_value # 初始时应失败
找到正确的测试文件
检查项目结构以获取现有测试模式:
# 查找测试文件
find . -name "*.test.*" -o -name "*.spec.*" -o -name "test_*.py" | head -20
# 查找测试目录
ls -la tests/ __tests__/ spec/ test/ 2>/dev/null
# 检查 package.json 中的测试命令
grep -A5 '"test"' package.json
启动修复子代理
使用任务工具并行化修复尝试:
任务工具参数:
- subagent_type: "general-purpose"
- description: "修复 [缺陷描述]"
- prompt: 包括:
1. 缺陷描述
2. 失败测试的位置和内容
3. 怀疑原因(如果已知)
4. 约束:"运行测试以验证您的修复有效"
并行修复策略
启动多个具有不同方法的子代理:
- 直接修复代理 — 专注于导致缺陷的直接代码
- 根本原因代理 — 调查更深的架构问题
- 边缘情况代理 — 查找相关代码中的类似缺陷
当项目缺少测试时
如果项目没有测试基础设施:
- 先设置最小测试框架
- 在合适位置创建测试文件
- 记录测试设置以供将来使用
快速测试设置命令
# Python
pip install pytest
mkdir -p tests && touch tests/__init__.py
# JavaScript/TypeScript
npm install --save-dev jest
# 或
npm install --save-dev vitest
# Go
# 测试已内置,创建 *_test.go 文件
验证修复
子代理报告完成后:
# 运行特定测试
pytest tests/test_module.py::test_bug_description -v
npm test -- --grep "缺陷描述"
go test -run TestBugDescription -v
# 运行完整套件以检查回归问题
pytest
npm test
go test ./...
示例工作流
用户报告: “登录函数在邮箱有空格时崩溃”
阶段 1 — 编写失败测试:
# tests/test_auth.py
def test_login_handles_email_with_spaces():
"""缺陷:当邮箱包含空格时登录崩溃"""
auth = AuthService()
# 这应返回错误,而非崩溃
result = auth.login("user @example.com", "password")
assert result.success == False
assert "invalid email" in result.error.lower()
运行测试以确认失败:
pytest tests/test_auth.py::test_login_handles_email_with_spaces -v
# 预期:失败(演示缺陷)
阶段 2 — 启动子代理:
任务工具:
- subagent_type: "general-purpose"
- description: "修复邮箱空格崩溃"
- prompt: "修复当邮箱包含空格时登录崩溃的问题。
缺陷:AuthService.login() 在邮箱有空格时崩溃而非返回错误。
失败测试:tests/test_auth.py::test_login_handles_email_with_spaces
修复后,运行:pytest tests/test_auth.py::test_login_handles_email_with_spaces -v
测试必须通过以确认修复。"
阶段 3 — 验证:
# 特定测试通过
pytest tests/test_auth.py::test_login_handles_email_with_spaces -v
# 通过
# 无回归问题
pytest tests/test_auth.py -v
# 所有测试通过
与钩子的集成
此插件中的 bug-report-detector 钩子自动:
- 检测用户报告缺陷时
- 提醒 Claude 遵循测试优先工作流
- 在创建或修改测试文件前阻止编辑/写入工具
附加资源
参考文件
references/test-frameworks.md— 框架特定的测试模式references/common-bugs.md— 常见缺陷模式和测试策略
示例文件
examples/python-bug-test.py— Python pytest 示例examples/js-bug-test.js— JavaScript Jest 示例
脚本
scripts/find-tests.sh— 在项目中定位测试基础设施