修复Bug技能Skill fix-bug

这是一种综合技能,用于自动化整个缺陷修复流程,包括原因调查、修复实施、测试添加、审查、质量保证和PR创建。关键词包括缺陷修复、自动化测试、代码审查、质量保证。

测试 0 次安装 4 次浏览 更新于 3/3/2026

修复Bug技能 - 缺陷修复综合技能

角色

这是一个综合执行缺陷修复全过程的技能。从原因调查、修复实施、测试添加、审查、质量保证到PR创建,自动化完成整个缺陷修复流程。

执行流程

第1阶段:事前确认和分支创建

1-1. 参数确认

  • bug_description:确认缺陷描述
  • issue_number:确认问题编号
  • target:确认修复目标(后端/前端/两者)
  • suspected_files:确认可能存在问题的文件(可选)

1-2. 分支管理

# 查看当前分支
git branch --show-current

# 如果是main分支,则创建新分支
# 分支名称:fix/[bug-description-summary]-[issue_number]
# 例如:fix/login-session-error-456

# 确认不是在main分支

第2阶段:缺陷原因调查

2-1. 错误日志确认

# 后端日志确认(如适用)
grep -r "[bug related keywords]" backend/logs/
grep -r "ERROR" backend/logs/ | tail -50

# 前端控制台错误确认(如适用)
# 使用浏览器DevTools确认错误

2-2. 相关代码搜索

# 如果指定了suspected_files,则优先确认
# 如果没有指定,则从缺陷描述中提取相关关键词进行搜索

# 后端代码搜索
grep -r "[keyword]" backend/src/main/java/

# 前端代码搜索
grep -r "[keyword]" frontend/

2-3. 现有测试确认

# 搜索相关测试用例
# 后端测试
find backend/src/test/java/ -name "*Test.java" | xargs grep -l "[keyword]"

# 前端测试
find frontend/ -name "*.test.ts*" | xargs grep -l "[keyword]"

2-4. 原因分析报告创建

## 缺陷原因调查报告

### 缺陷概述
- [bug_description]

### 重现步骤(推测)
1. [步骤1]
2. [步骤2]
3. [步骤3]

### 原因位置
- **文件**: [文件路径]:[行号]
- **问题**: [具体问题内容]
- **根本原因**: [为什么会出现这个缺陷]

### 影响范围
- [受影响的功能或界面]

### 修复方针
- [如何修复]

### 测试方针
- [如何测试]

第3阶段:缺陷修复实施

3-1. 后端修复(当target为"backend"或"both"时)

最小限度更改修复

  1. 确定原因位置
  2. 进行最小限度的代码更改
  3. 注意不要破坏现有功能
  4. 添加错误处理(如有必要)

修复示例(NullPointerException)

// 之前:有缺陷
public User getUser(UUID userId) {
    User user = userMapper.selectById(userId);
    return user; // user为null时,后续处理将引发NPE
}

// 之后:修复后
public User getUser(UUID userId) {
    User user = userMapper.selectById(userId);
    if (user == null) {
        throw new UserNotFoundException("User not found: " + userId);
    }
    return user;
}

修复后的检查

  • [ ] 无编译错误
  • [ ] 无Lint错误
  • [ ] 现有测试通过
  • [ ] 添加修复位置的测试

3-2. 前端修复(当target为"frontend"或"both"时)

最小限度更改修复

  1. 确定原因位置
  2. 进行最小限度的代码更改
  3. 注意不要破坏现有功能
  4. 添加错误处理(如有必要)

修复示例(useEffect的内存泄漏)

// 之前:有缺陷
useEffect(() => {
  fetchData().then(data => setData(data));
}, []);
// 组件卸载后setData可能被调用

// 之后:修复后
useEffect(() => {
  let cancelled = false;

  fetchData().then(data => {
    if (!cancelled) {
      setData(data);
    }
  });

  return () => {
    cancelled = true;
  };
}, []);

修复后的检查

  • [ ] 无TypeScript错误
  • [ ] 无Lint错误
  • [ ] 现有测试通过
  • [ ] 添加修复位置的测试

第4阶段:测试添加(test-backend/test-frontend)

4-1. 后端测试添加(后端修复时)

/test-backend target_class="[修复的类的完全限定名]" test_type="unit" coverage_target=90

添加缺陷重现测试

@Test
void 缺陷重现_用户ID为null时抛出异常() {
    // given
    UUID userId = null;

    // when & then
    assertThatThrownBy(() -> userService.getUser(userId))
        .isInstanceOf(IllegalArgumentException.class)
        .hasMessageContaining("User ID must not be null");
}

@Test
void 缺陷重现_不存在的用户ID时抛出异常() {
    // given
    UUID userId = UUID.randomUUID();
    when(userMapper.selectById(userId)).thenReturn(null);

    // when & then
    assertThatThrownBy(() -> userService.getUser(userId))
        .isInstanceOf(UserNotFoundException.class)
        .hasMessageContaining("User not found");
}

4-2. 前端测试添加(前端修复时)

/test-frontend target_file="[修复的文件路径]" test_type="component" coverage_target=90

添加缺陷重现测试

it('缺陷重现:组件卸载后API响应返回也不会出错', async () => {
  const { unmount } = render(<UserProfile userId="123" />);

  // 立即卸载组件
  unmount();

  // 等待API响应
  await waitFor(() => {
    // 确认没有发生错误
    expect(console.error).not.toHaveBeenCalled();
  });
});

第5阶段:通过服务器启动进行操作确认

5-1. 后端修复的情况

cd backend
./gradlew bootRun

确认事项

  • [ ] 服务器正常启动
  • [ ] 修复的功能正常工作
  • [ ] 没有错误日志输出
  • [ ] 确认缺陷不再重现

5-2. 前端修复的情况

cd frontend
pnpm dev

确认事项

  • [ ] 服务器正常启动
  • [ ] 修复的界面/组件正常工作
  • [ ] 控制台没有错误输出
  • [ ] 确认缺陷不再重现

第6阶段:架构审查(review-architecture)

/review-architecture target="[target]"

执行内容

  • 确认是否符合编码规范
  • 确认修复内容的适当性
  • 确认没有副作用

判定

  • ✅ 合格 → 进入第7阶段
  • ❌ 不合格 → 返回第3阶段修复

第7阶段:质量保证(qa-check)

/qa-check target="[target]"

执行内容

  • Lint检查
  • 执行现有测试+新测试
  • 构建验证
  • 确认覆盖率

判定

  • ✅ 合格 → 进入第8阶段
  • ❌ 不合格 → 返回第3阶段修复

第8阶段:PR创建(create-pr)

/create-pr issue_number=[issue_number]

PR说明包含内容

  • 缺陷概述
  • 原因
  • 修复内容
  • 测试添加内容
  • 确认事项

第9阶段:完成报告

## 修复Bug完成报告

### 缺陷概述
- [bug_description]

### 问题编号
- #[issue_number]

### PR URL
- [PR URL]

### 原因
- **文件**: [文件路径]:[行号]
- **问题**: [具体问题内容]
- **根本原因**: [为什么会出现这个缺陷]

### 修复内容
- [具体修复内容]

### 影响范围
- [受影响的功能或界面]

### 测试添加
- 缺陷重现测试:[测试用例数]案例
- 边界值测试:[测试用例数]案例
- 现有测试:全部成功

### 质量保证结果
- ✅ 架构审查:合格
- ✅ QA检查:合格
- ✅ 测试覆盖率:[数值]%
- ✅ Lint/构建:成功
- ✅ 服务器启动·操作确认:完成
- ✅ 确认缺陷不再重现:完成

### 下一步
请审查Pull Request。

错误处理

如果无法确定原因

  1. 在更广泛的范围内搜索代码
  2. 确认所有相关日志
  3. 搜索类似缺陷报告
  4. 请求用户提供额外信息

如果修复变得复杂

  1. 重新考虑修复策略
  2. 分割成更小的单元
  3. 判断是否需要重构
  4. 与用户协商

如果测试未通过

  1. 重新检查修复内容
  2. 确认测试的期望值
  3. 确认没有副作用
  4. 调整修复

重要注意事项

最小限度更改

  • 缺陷修复应保持在最小限度
  • 不要重构不相关的部分
  • 不要破坏现有功能

必须添加测试

  • 必须添加缺陷重现测试
  • 防止类似缺陷再次发生
  • 添加边界值·异常情况测试

文档更新

使用的技能列表

  1. test-backend:后端测试添加(后端修复时)
  2. test-frontend:前端测试添加(前端修复时)
  3. review-architecture:架构审查
  4. qa-check:质量保证
  5. create-pr:PR创建

参考文档

必须参考

  • documents/development/development-policy.md:开发指南
  • documents/development/coding-rules/:编码规范
  • documents/development/error-codes.md:错误代码列表

有助于缺陷调查的文档

  • documents/architecture/database-design.md:数据库设计
  • documents/architecture/system-architecture.md:系统架构
  • documents/features/[功能名]/specification.md:功能规格书