Coding

缺陷根因分析

Try it

当某个 Bug 频繁复现、线上有缺陷需要做事后分析、或者发现同一类问题反复出现需要根治时使用此技能。从症状出发用 5Why、因果图和鱼骨图等方法系统化定位缺陷根源,区分直接原因、间接原因和系统原因。不要只修症状——根因分析的价值在于找到让同类 Bug 不再发生的系统性改进措施,同时分析漏测原因来优化测试设计。 ⚠️ 本技能示例可能调用外部日志/监控工具,请在受控环境执行。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

What it does

当某个 Bug 频繁复现、线上有缺陷需要做事后分析、或者发现同一类问题反复出现需要根治时使用此技能。从症状出发用 5Why、因果图和鱼骨图等方法系统化定位缺陷根源,区分直接原因、间接原因和系统原因。不要只修症状——根因分析的价值在于找到让同类 Bug 不再发生的系统性改进措施,同时分析漏测原因来优化测试设计。 ⚠️ 本技能示例可能调用外部日志/监控工具,请在受控环境执行。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

The skill document

⚠️ 安全警告:本技能的示例可能涉及订单号、支付金额、截图、身份证、手机号等敏感数据。 实际使用时请勿粘贴真实生产数据、客户信息或财务凭证;测试前应脱敏/掩码处理。 本技能仅在 workspace/ 输出评估文件,不持久化、不外传、不跨会话复用。

Bug根因分析

核心原则

看到错误,能快速缩小根因范围——这不是魔法,是可学习的映射模式。

症状分类与根因映射

症状1:返回错误

症状表现:
- HTTP状态码错误(4xx/5xx)
- 业务错误码
- 错误信息

根因方向:
├─ 代码层
│   ├─ 逻辑错误:条件判断错误
│   ├─ 空指针:对象未初始化
│   ├─ 数组越界:索引超出范围
│   └─ 类型转换:类型不匹配
│
├─ 数据层
│   ├─ 数据缺失:必要数据不存在
│   ├─ 数据错误:数据格式/值错误
│   ├─ 数据冲突:唯一性约束
│   └─ 数据过期:数据已失效
│
├─ 配置层
│   ├─ 配置缺失:配置项未配置
│   ├─ 配置错误:配置值错误
│   ├─ 环境差异:不同环境配置不同
│   └─ 配置变更:配置被意外修改
│
└─ 依赖层
    ├─ 依赖不可用:第三方服务故障
    ├─ 依赖超时:响应超时
    ├─ 依赖返回错误:第三方返回异常
    └─ 依赖版本不兼容:接口变更

症状2:数据不对

症状表现:
- 数据缺失
- 数据错误
- 数据不一致
- 数据格式异常

根因方向:
├─ 写入问题
│   ├─ 写入失败:数据库操作失败
│   ├─ 写入丢失:事务未提交
│   ├─ 写入延迟:异步写入未完成
│   └─ 写入重复:重复提交
│
├─ 读取问题
│   ├─ 缓存不一致:缓存与DB不同步
│   ├─ 读取过滤:查询条件过滤
│   ├─ 读取延迟:读从库延迟
│   └─ 读取缓存:读到旧缓存
│
├─ 同步问题
│   ├─ 同步延迟:主从同步延迟
│   ├─ 同步失败:同步任务失败
│   ├─ 同步冲突:并发同步冲突
│   └─ 同步丢失:同步任务遗漏
│
└─ 转换问题
    ├─ 格式转换:数据格式转换错误
    ├─ 编码问题:字符编码不一致
    ├─ 精度丢失:浮点数精度问题
    └─ 时区问题:时区转换错误

症状3:性能退化

症状表现:
- 响应时间变长
- 吞吐量下降
- 资源占用高

根因方向:
├─ 数据库问题
│   ├─ 慢查询:SQL执行慢
│   ├─ 索引缺失:缺少必要索引
│   ├─ 锁等待:锁竞争
│   ├─ 连接池耗尽:连接数不够
│   └─ 数据量增长:数据量变大
│
├─ 代码问题
│   ├─ 算法复杂度:算法效率低
│   ├─ 循环嵌套:循环次数多
│   ├─ 内存泄漏:内存未释放
│   ├─ 线程阻塞:线程等待
│   └─ 频繁GC:垃圾回收频繁
│
├─ 缓存问题
│   ├─ 缓存穿透:缓存未命中
│   ├─ 缓存雪崩:缓存集中失效
│   ├─ 缓存击穿:热点key失效
│   └─ 缓存容量:缓存容量不足
│
└─ 资源问题
    ├─ CPU瓶颈:CPU占用高
    ├─ 内存瓶颈:内存不足
    ├─ IO瓶颈:磁盘IO慢
    └─ 网络瓶颈:网络延迟高

症状4:没反应

症状表现:
- 点击无反应
- 操作无效果
- 界面卡住

根因方向:
├─ 前端问题
│   ├─ JS报错:JavaScript错误
│   ├─ 事件绑定:事件未绑定
│   ├─ 状态异常:前端状态错误
│   ├─ 网络请求:请求未发出
│   └─ 渲染异常:DOM渲染错误
│
├─ 网络问题
│   ├─ 请求丢失:网络丢包
│   ├─ 请求超时:网络超时
│   ├─ 连接断开:网络断开
│   └─ DNS解析:DNS解析失败
│
├─ 后端问题
│   ├─ 请求未接收:请求未到达
│   ├─ 处理阻塞:处理线程阻塞
│   ├─ 响应丢失:响应未返回
│   └─ 服务不可用:服务宕机
│
└─ 中间件问题
    ├─ Nginx问题:Nginx配置错误
    ├─ 网关问题:网关路由错误
    ├─ MQ问题:消息队列阻塞
    └─ 限流问题:触发限流

症状5:偶发问题

症状表现:
- 时有时无
- 特定条件出现
- 难以复现

根因方向:
├─ 并发问题
│   ├─ 竞态条件:并发操作冲突
│   ├─ 死锁:线程互相等待
│   ├─ 线程安全:共享资源竞争
│   └─ 资源泄露:资源未释放
│
├─ 环境问题
│   ├─ 环境差异:不同环境表现不同
│   ├─ 配置差异:配置不一致
│   ├─ 依赖状态:依赖服务状态
│   └─ 硬件差异:硬件性能差异
│
├─ 数据问题
│   ├─ 数据状态:特定数据状态触发
│   ├─ 数据量:数据量达到阈值触发
│   ├─ 数据顺序:数据顺序影响
│   └─ 数据时效:数据过期触发
│
└─ 时序问题
    ├─ 时序依赖:操作顺序影响
    ├─ 定时任务:定时任务触发
    ├─ 缓存过期:缓存过期触发
    └─ 会话超时:会话过期触发

分析流程

步骤1:收集信息

信息收集清单:
├─ 症状描述:具体表现是什么?
├─ 复现步骤:怎么复现?
├─ 环境信息:什么环境下出现?
├─ 时间信息:什么时候出现?
├─ 影响范围:影响多大?
└─ 相关日志:日志有什么?

步骤2:分类症状

根据症状表现分类:
- 返回错误 → 代码/数据/配置/依赖层
- 数据不对 → 写入/读取/同步/转换问题
- 性能退化 → 数据库/代码/缓存/资源问题
- 没反应 → 前端/网络/后端/中间件问题
- 偶发问题 → 并发/环境/数据/时序问题

步骤3:缩小范围

根据症状分类,逐层排查:
1. 先排除外部因素(依赖/环境)
2. 再排除配置因素
3. 再排查数据因素
4. 最后排查代码因素

步骤4:验证假设

验证方法:
1. 复现问题
2. 修改假设条件
3. 验证问题是否消失
4. 确认根因

根因分析表

Bug ID症状分类根因方向根本原因验证方法
BUG-001返回错误数据层数据格式错误修改数据后验证
BUG-002性能退化数据库慢查询添加索引后验证

症状分类速查

从现象到根因方向

现象症状分类大概率方向优先排查
报500错误返回错误后端异常/数据异常日志ERROR + 入参数据
返回空数据返回错误查询条件/权限过滤SQL日志 + 权限配置
页面白屏返回错误前端解析/接口数据格式F12看接口响应
金额不对数据不对计算逻辑/精度问题核对计算公式
状态不更新数据不对状态机/回调处理检查状态流转日志
账单对不上数据不对数据一致性/事务问题核对多个数据源
页面越来越慢性能退化慢查询/数据累积慢SQL日志
高峰期就挂性能退化并发/资源不足压测复现+监控
点按钮没反应没反应前端事件绑定/接口不通F12看请求是否发出
加载中不动没反应后端处理卡住/死锁线程堆栈+DB锁查询
偶尔支付失败偶发问题并发冲突/超时并行多次复现
特定时间出问题偶发问题定时任务/缓存过期核对定时任务时间+缓存策略
只有某用户出问题偶发问题数据隔离/权限对比正常/异常用户数据

输出示例

Bug描述:"用户支付成功但订单状态仍为待支付" → 症状分类:数据不一致(症状2) → 根因映射:数据层问题→检查支付回调处理逻辑 → 分析流程:

  1. 收集信息:支付网关回执、订单日志、数据库记录
  2. 分类症状:数据不一致
  3. 缩小范围:支付回调→订单状态更新→数据库写入
  4. 验证假设:手动触发回调验证状态变更

Bug描述:"页面加载越来越慢" → 症状分类:性能退化(症状3)→ 数据库/缓存层排查

检查清单

根因分析完成后检查:

  • 是否收集了完整信息?
  • 是否正确分类症状?
  • 是否逐层排查根因?
  • 是否验证了根因假设?
  • 根因描述是否清晰?
  • 验证方法是否可行?

Related skills

当发现了一个 Bug 需要提交、自己提的 Bug 被开发打回来了、或者团队 Bug 质量参差不齐需要统一规范时使用此技能。一个高质量的 Bug 报告应该让开发看一遍就能复现并定位,不需要来回追问。包含清晰的复现步骤(从环境准备到操作序列到预期/实际结果)、根因推测、影响范围评估和必要附件。 ⚠️ 本技能示例可能调用外部抓包/日志工具,请在受控环境执行。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

2 installs

当团队缺陷管理混乱、Bug 没有统一的分级标准、或者领导要看缺陷趋势数据时使用此技能。覆盖缺陷从提交到关闭的完整生命周期,包括严重度/优先级分级规范、各状态流转条件和时效要求、缺陷度量和趋势分析。如果缺陷管理不规范,复盘数据就是垃圾——"严重Bug数量下降"可能是因为大家不再标记严重了。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

3 installs

5WHY根本原因分析专属引导师,通过追问-校验-判定流程帮助用户快速定位问题根源;适用于设备故障、生产异常、质量缺陷等现场问题分析

1 installs

当一个迭代结束、一个项目完成、或者发生线上事故需要事后分析时使用此技能。通过系统性的回顾会议和数据复盘,把个人和团队的经验教训转化为可复用的组织资产。不要沦为"说说好话走个形式"——有效的复盘需要有数据支撑(缺陷趋势/漏测分析/效率数据)、有根因分析(为什么出问题)和有 action items(下次怎么做不一样)。输出复盘报告和改进项追踪表。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

1 installs

当开发提了 PR、代码变更需要确定测试范围、或者想通过分析代码来预测可能出 Bug 的区域时使用此技能。从测试视角分析代码变更的影响范围、识别高危模式和典型风险区域。不要看完整代码逻辑——你只需要关注变更类型(新增/修改/删除/重构)、影响范围(接口定义/数据库字段/业务逻辑)和相关依赖,据此确定最小回归测试范围。输出代码变更影响分析报告。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

2 installs

识别那些"看起来很简单但实际风险很高"的测试区域,帮你在有限的测试资源下做优先级判断。当测试时间不够、不知道应该重点测哪些功能、或者直觉告诉你某个功能可能有问题但说不上来为什么时,应当使用此技能。典型的危险信号包括:频繁变更的模块、第三方依赖、资金/安全相关功能、历史Bug多发区域。每一个识别出的风险点都需要标注概率和影响等级,并附上缓解建议。 本技能属于 QA Test Skills 技能集(49 个技能之一),完整工作流体验需安装全套:npx skills add Kokxi/qa-test-skills

1 installs