跳转至

5.3 管理缺陷并回归:记录问题、修复问题、确认不再出错

发现问题不是失败,找不到、说不清、复现不了的问题才危险

修复一个问题,不等于系统已经更可靠

5.2 执行测试后,你可能发现页面提示不清、接口越权、重复提交、状态错误、数据库数据不一致或部署配置遗漏等问题。不要只在聊天记录里说“有 bug”,也不要边测试边随手改几行代码。

一个合格的缺陷管理过程应当形成闭环:发现现象 → 记录并复现 → 判断影响与优先级 → 定位原因 → 最小化修复 → Git 提交 → 重跑原用例 → 检查关联功能 → 更新记录。

本节学习目标

将测试中发现的问题整理为可追踪缺陷,优先修复阻断启动、核心流程、数据正确性和权限安全的问题;完成原用例回归与关联场景回归,形成缺陷清单、修复记录和回归测试结果。

返回上一节:编写并执行测试 返回第四篇:项目开发与业务实现


🎯 本节完成后,你要交付

成果 要求
缺陷清单 每个问题都有编号、现象、复现步骤、影响、优先级和状态
缺陷修复记录 能够说明根因、修改位置、修复方式与对应 Git 提交
原用例回归结果 修复后重新执行导致问题的原始测试用例
关联场景回归结果 检查修复是否破坏登录、权限、状态、数据或相邻功能
未解决问题说明 对暂不修复的问题写明影响、原因、临时处理和后续计划
更新后的测试执行记录 失败项已更新为“已修复并通过”或保留真实状态

不允许用“已知问题”掩盖 P0 缺陷

项目不能启动、不能登录、核心流程无法完成、数据被错误修改或普通用户能越权操作,属于阻断或严重问题,必须修复后才能进入部署与交付。


一、什么是缺陷:不只是“程序报错”

缺陷是系统实际行为与需求、设计、接口约定或合理预期不一致的地方。它可能表现为错误提示,也可能“看起来成功”但数据已经错了。

常见缺陷类型

类型 典型现象 示例
启动与环境 项目无法启动、找不到配置、数据库无法连接 README 说明的命令无法运行
功能缺失 需求中的功能没有实现或入口不可用 管理员无法编辑已发布活动
业务规则 系统没有按规则拒绝非法操作 名额已满仍可报名
数据正确性 数据重复、丢失、关联错误、统计不准 重复报名导致名额扣减两次
权限安全 未登录或无权限用户能够访问、修改数据 普通用户直接调用管理员删除接口成功
状态流程 状态跳转错误、跳过步骤、重复处理 已完成报修可以再次确认
接口协议 状态码、字段、参数或错误信息与约定不一致 参数错误仍返回成功 code
页面体验 页面崩溃、提示不清、入口找不到、刷新丢失状态 空列表显示白屏而非空状态
部署配置 本机能运行,按 README 或 Docker 无法运行 环境变量缺失导致容器连不上数据库

先区分现象和根因

“点击报名没反应”是现象;根因可能是前端没有发送请求、接口地址错误、后端校验失败、数据库异常或权限拦截。缺陷记录先写清可观察现象,定位后再补充根因。


二、第一步:把测试失败写成可复现缺陷

一句“有 bug”不能帮助自己、同学或 AI 助手定位问题。缺陷记录必须让未参与测试的人也能复现。

1. 缺陷最小记录字段

字段 说明
缺陷编号 例如 BUG-001,全程保持不变
标题 用“条件 + 实际问题”描述,例如“已报名用户重复报名仍成功”
来源用例 来自哪条测试用例,例如 TC-WORKFLOW-01-05
发现版本 分支、标签或提交编号
环境 浏览器、数据库、部署方式、账号等关键信息
前置条件 复现问题前必须具备的数据和状态
复现步骤 别人可以逐步照做的操作
预期结果 根据需求或规则,本应发生什么
实际结果 系统实际上发生什么
证据 截图、接口响应、日志、数据库查询结果
严重程度与优先级 影响有多大、修复是否紧急
状态 新建、处理中、待回归、已关闭、暂缓

2. 不合格与合格记录对比

不合格:

报名功能不对,修一下。

合格:

缺陷编号:BUG-003
标题:学生重复报名同一活动时系统仍创建新记录
来源用例:TC-WORKFLOW-01-05
发现版本:v0.5,提交 123abcd
环境:Chrome ;MySQL 8;本机 Docker 部署
前置条件:活动 1001 剩余名额为 2;student01 尚未报名
复现步骤:
1. 使用 student01 登录;
2. 对活动 1001 提交报名;
3. 再次对活动 1001 提交报名;
4. 查看报名列表与活动剩余名额。
预期:第二次报名被拒绝;报名记录仍为 1 条;剩余名额只减少 1。
实际:第二次报名返回成功;产生 2 条报名记录;剩余名额减少 2。
证据:BUG-003-response.png、BUG-003-register-table.png
严重程度:严重
优先级:P0
状态:新建

3. 不要把多个问题塞进一条缺陷

以下写法不利于修复:

登录、列表、删除、页面样式都有问题。

应拆分为独立缺陷:

1
2
3
BUG-004:错误密码登录后页面没有提示原因
BUG-005:管理员删除对象后列表没有自动刷新
BUG-006:空列表页面显示不完整

这样每个问题可以独立分配优先级、提交修复和回归验证。


三、第二步:评估严重程度和修复优先级

“看起来不舒服”和“会破坏核心数据”不能放在同一个优先级。先修高风险问题,避免在低价值优化上耗尽时间。

1. 缺陷严重程度

等级 定义 示例 交付前要求
阻断 系统无法启动、无法测试或核心流程完全无法继续 数据库初始化失败、所有用户不能登录 必须修复
严重 数据错误、权限绕过、核心流程错误或关键角色无法操作 普通用户可删除记录、重复扣库存 必须修复
一般 非核心功能错误,有替代方式但影响使用 查询条件无效、列表刷新不及时 尽量修复;未修复需说明
建议 文案、样式、低频体验问题 提示语不够清楚、按钮间距不一致 可列入优化清单

2. 与 P0/P1/P2 的关系

优先级 常见对应缺陷 处理原则
P0 阻断、严重的启动、登录、核心流程、数据与权限问题 立即修复;回归通过前不能交付
P1 重要功能失败、常见异常、重要页面体验 优先修复;无法修复需写明限制
P2 非核心体验、低频边界、后续优化 记录即可,可在交付后继续改进

3. 一个简单的判断顺序

发现问题后依次问:

1
2
3
4
5
是否不能启动?
→ 是否影响登录或核心流程?
→ 是否会造成数据错误或权限越权?
→ 是否影响常用功能?
→ 是否只是非核心体验问题?

权限问题默认按严重处理

即使页面隐藏了按钮,只要普通用户可以直接通过接口、修改 URL 或篡改对象 ID 完成越权操作,就可能泄露或破坏数据,应按 P0 或至少严重问题处理。


四、第三步:定位问题,但不要盲目大改

定位的目标是找出最小根因和影响范围,不是借修一个 bug 顺便重写整个模块。

1. 从证据开始定位

证据 可以帮助判断什么
页面截图 用户看到什么、入口和提示是否正确
浏览器 Network 请求是否发出、URL/参数/请求体是否正确、状态码和响应是什么
浏览器 Console JavaScript 是否报错、前端数据处理是否异常
后端日志 哪个接口、服务、SQL 或异常发生问题
接口测试响应 不依赖页面时后端行为是否仍然错误
数据库查询 操作前后是否产生、修改或删除了正确数据
Git diff / 日志 问题可能由哪次改动引入

2. 沿请求链路排查

对“点击按钮后结果不正确”的问题,可按以下顺序检查:

1
2
3
4
5
6
7
8
9
页面操作
→ 前端参数和请求
→ 接口路由与身份认证
→ 参数校验
→ 业务规则与状态判断
→ DAO / Mapper / SQL
→ 数据库事务和实际数据
→ 接口响应
→ 前端结果处理与页面刷新

不要一看到页面异常就先修改 CSS,也不要一看到接口失败就先改数据库。先确认问题在哪一层出现。

3. 使用 AI 协助定位时的正确上下文

可以给 AI:

1
2
3
4
5
6
7
8
缺陷编号:BUG-003
预期结果:重复报名应被拒绝。
实际结果:第二次报名仍成功,生成重复记录。
复现步骤:……
接口请求与响应:……
相关代码文件:……
数据库查询结果:……
请先分析可能的根因、影响范围和最小修改方案,暂不要直接修改代码。

不要只说:

报名功能有 bug,帮我修。

先确认方案,再让 AI 修改

AI 可能给出能临时通过当前用例的修复,但破坏其他流程。先理解它准备改哪些文件、为什么改、会影响什么,再执行修改。


五、第四步:最小化修复并保留 Git 证据

1. 一个缺陷一次只做一件事

推荐的修复节奏:

1
2
3
4
5
6
7
8
9
选择一个缺陷
→ 阅读相关代码与测试证据
→ 提出最小修改方案
→ 修改少量文件
→ 本地编译或启动
→ 执行原测试用例
→ 执行关联回归用例
→ Git 查看差异
→ 提交修复

避免:

1
2
3
4
5
6
发现重复报名
→ 顺便重构全部报名模块
→ 更换前端框架
→ 修改数据库字段
→ 加入新功能
→ 不知道哪个改动解决了问题

2. 修复前后对照记录

项目 内容
缺陷编号 BUG-003
根因 服务层未判断当前用户是否已有该活动报名记录
修改文件 RegistrationService.javaRegistrationMapper.xml
修改方式 新增“用户 + 活动”唯一查询;重复时抛出业务异常
数据库调整 增加唯一约束(如适用)
影响范围 报名创建接口、管理员报名统计、重复报名测试
原用例回归 TC-WORKFLOW-01-05:通过
关联回归 首次报名、名额已满、管理员查询:通过

3. 提交信息应说明修复目的

1
2
3
4
5
6
7
8
9
# 好的提交信息
git commit -m "fix: 阻止用户重复报名同一活动"
git commit -m "fix: 校验订单取消后的非法状态转换"
git commit -m "fix: 拒绝普通用户调用管理员删除接口"

# 不推荐
git commit -m "修改"
git commit -m "修 bug"
git commit -m "update"

提交前检查:

1
2
3
git status
git diff --check
git diff

确认没有把数据库密码、构建产物、调试截图、无关格式化或未完成代码混入修复提交。


六、第五步:执行两层回归测试

修复完成后,至少完成两层验证:原用例回归关联场景回归

1. 原用例回归:确认问题本身已解决

原用例就是发现缺陷的那条测试用例。例如 BUG-003 来自 TC-WORKFLOW-01-05,修复后必须用同一账号、同一前置数据和同一步骤重新执行。

缺陷编号 原测试用例 修复前结果 修复后结果 状态
BUG-003 TC-WORKFLOW-01-05 重复报名 第二次成功 第二次被拒绝,数据不变 通过

如果修改后原用例仍失败,不要标记“待回归通过”,应继续保持“处理中”。

2. 关联场景回归:确认没有引入新问题

修复重复报名时,不能只验证“第二次被拒绝”,还应确认:

关联场景 为什么要测 预期
首次报名 新增校验不能误伤正常流程 正常报名成功
不同用户报名同一活动 校验范围应是“同一用户 + 同一活动” 不同用户可正常报名
名额已满报名 规则之间不能互相覆盖 拒绝且原因正确
管理员查看名单 新增约束不能影响列表查询 数据仍正确显示
取消报名后再次报名 若业务允许,需要验证状态恢复规则 按需求允许或拒绝

3. 常见修改的关联回归范围

修改点 至少回归什么
登录、Token、Session 登录成功、错误登录、退出、未登录访问、不同角色登录
Filter / 拦截器 / 权限 正常用户访问、未登录访问、管理员访问、普通用户越权、静态资源访问
数据库表或 SQL 新增、查询、修改、删除、历史数据读取、初始化脚本
状态转换规则 正常状态流转、非法跳转、重复操作、多角色后续操作
前端请求封装 列表、详情、表单提交、错误提示、登录过期跳转
公共工具或全局异常处理 至少两个不同模块的正常响应和错误响应

回归不是再测一遍全部系统

回归的范围由修改影响决定。小修复先测原用例和直接关联功能;改了公共认证、数据库脚本或全局组件时,回归范围必须扩大。


七、第六步:关闭、暂缓或重新打开缺陷

1. 缺陷状态建议

1
2
3
4
5
新建
→ 已确认
→ 处理中
→ 待回归
→ 已关闭

也可以使用:

暂缓 / 不修复 / 重复 / 无法复现

但每种非“已关闭”的状态都必须说明理由。

状态 含义 使用条件
新建 已发现但尚未确认或处理 刚由测试发现
已确认 已复现,确认是系统问题 复现步骤和证据完整
处理中 正在分析或修改代码 有明确负责人或处理计划
待回归 代码已修复,尚未重新执行测试 有对应修复提交
已关闭 原用例与关联回归均通过 证据完整
暂缓 当前版本不处理 P2 或已知限制,有后续计划
无法复现 按步骤无法再次出现 必须记录环境与尝试过程

2. 什么情况下不能关闭

下列情况都不能把缺陷标为“已关闭”:

  • 只修改了代码,没有运行原测试用例;
  • 页面看起来正常,但接口或数据库没有验证;
  • 原问题消失,但关联功能出现新问题;
  • 只在开发环境成功,部署环境没有验证;
  • 找不到修复提交、测试证据或实际结果;
  • 用手工改数据库绕过了问题。

3. 暂缓问题怎样说明

例如一个 P2 的体验问题可以暂缓:

1
2
3
4
5
6
缺陷编号:BUG-015
问题:首页在窄屏幕下按钮换行不美观。
状态:暂缓。
原因:不影响启动、核心流程、数据与权限;当前优先完成 P0/P1 测试与部署。
临时处理:在 README 已知限制中说明仅建议使用桌面浏览器。
计划:答辩后继续优化响应式布局。

P0 和严重权限、数据问题不能用“时间不够”直接暂缓。


八、维护缺陷清单与回归记录

建议在项目中创建:

1
2
3
4
5
6
docs/testing/
├── 测试计划.md
├── 测试用例.md
├── 缺陷清单.md
├── 回归测试记录.md
└── test-evidence/

缺陷清单模板

# 【项目名称】缺陷清单

测试版本:【填写】
最后更新:【填写】

| 编号 | 标题 | 来源用例 | 严重程度 | 优先级 | 状态 | 修复提交 | 回归结果 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| BUG-001 | 【填写】 | TC-【填写】 | 阻断/严重/一般/建议 | P0/P1/P2 | 新建/处理中/待回归/已关闭 | 【填写】 | 【填写】 |

---

## BUG-001:【标题】

- **发现版本:** 【填写】
- **测试环境:** 【填写】
- **前置条件:** 【填写】
- **复现步骤:**
  1. 【填写】
  2. 【填写】
- **预期结果:** 【填写】
- **实际结果:** 【填写】
- **影响范围:** 【填写】
- **证据:** 【截图、接口响应、日志或 SQL 查询位置】
- **根因分析:** 【填写】
- **修复方式:** 【填写】
- **修改文件:** 【填写】
- **修复提交:** 【提交编号与说明】
- **原用例回归:** 【通过/失败,证据】
- **关联回归:** 【填写】
- **最终状态:** 【填写】

回归测试记录模板

1
2
3
4
5
# 【项目名称】回归测试记录

| 缺陷编号 | 修复提交 | 原测试用例 | 原用例结果 | 关联回归范围 | 关联结果 | 最终状态 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| BUG-001 | 【填写】 | TC-【填写】 | 通过/失败 | 【填写】 | 通过/失败 | 已关闭/继续处理 |

九、用 AI 协助缺陷管理的边界

AI 可以帮助:

  • 根据缺陷记录检查是否缺少复现步骤、预期结果或证据;
  • 分析日志、堆栈、接口响应和相关代码;
  • 给出可能的根因和最小修改建议;
  • 根据改动范围列出建议回归测试点;
  • 帮助整理缺陷清单和提交信息初稿。

AI 不能替代:

  • 实际复现问题;
  • 确认数据库是否被错误修改;
  • 判断修复后的页面和接口是否真实通过;
  • 虚构“已回归通过”的结果;
  • 在没有理解影响范围时大规模重构代码。

推荐提示词

使用测试与缺陷管理思路,帮助我分析以下问题。

缺陷编号:BUG-【填写】
来源用例:TC-【填写】
预期结果:【填写】
实际结果:【填写】
复现步骤:【填写】
接口响应、日志或截图说明:【填写】
相关代码文件:【填写】

请输出:
1. 缺陷记录是否完整;
2. 可能根因及需要确认的证据;
3. 最小修改方案;
4. 修改可能影响的功能;
5. 原用例与关联回归测试清单。
不要直接修改代码,也不要虚构测试结果。

十、提交前自查

  • 每个失败测试项已转化为独立缺陷记录;
  • 缺陷记录包含版本、环境、前置条件、复现步骤、预期和实际结果;
  • 已区分阻断、严重、一般和建议问题;
  • P0 问题已优先处理,没有被随意暂缓;
  • 修复前已确认根因或至少缩小影响范围;
  • 每次修复尽量对应一个明确问题与一个 Git 提交;
  • 修复后已重新执行原测试用例;
  • 已根据改动范围执行关联回归;
  • 只有原用例和关联回归通过后才关闭缺陷;
  • 未修复问题已记录影响、原因、临时处理和后续计划;
  • 没有用手工改数据库、临时改代码或虚构结果掩盖问题。

本节小结

缺陷管理的目标不是让清单看起来没有问题,而是让问题可追踪、修复可证明、质量可持续改进:

记录可复现问题 → 按影响排序 → 定位最小根因 → 小范围修复 → Git 留痕 → 原用例回归 → 关联场景回归 → 如实关闭或暂缓。

完成本节后,项目应解决影响启动、核心流程、数据和权限的关键缺陷。下一节将整理部署所需的配置、数据、环境变量和启动清单,为从开发环境走向可交付环境做准备。

下一节:5.4 部署准备:配置、数据与启动清单 返回上一节:编写并执行测试