修复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"时)
最小限度更改修复:
- 确定原因位置
- 进行最小限度的代码更改
- 注意不要破坏现有功能
- 添加错误处理(如有必要)
修复示例(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"时)
最小限度更改修复:
- 确定原因位置
- 进行最小限度的代码更改
- 注意不要破坏现有功能
- 添加错误处理(如有必要)
修复示例(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。
错误处理
如果无法确定原因
- 在更广泛的范围内搜索代码
- 确认所有相关日志
- 搜索类似缺陷报告
- 请求用户提供额外信息
如果修复变得复杂
- 重新考虑修复策略
- 分割成更小的单元
- 判断是否需要重构
- 与用户协商
如果测试未通过
- 重新检查修复内容
- 确认测试的期望值
- 确认没有副作用
- 调整修复
重要注意事项
最小限度更改
- 缺陷修复应保持在最小限度
- 不要重构不相关的部分
- 不要破坏现有功能
必须添加测试
- 必须添加缺陷重现测试
- 防止类似缺陷再次发生
- 添加边界值·异常情况测试
文档更新
- 如果添加了新的错误代码,则在error-codes.md中追加
- 如果更改了数据库,则更新database-design.md
使用的技能列表
- test-backend:后端测试添加(后端修复时)
- test-frontend:前端测试添加(前端修复时)
- review-architecture:架构审查
- qa-check:质量保证
- 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:功能规格书