跳转至

测试报告怎么写才有决策价值

一、三页报告换不来一个决定

一份真实报告的开头(原文照抄):

一、测试概述
本次测试于 9 月 8 日开始,9 月 13 日结束,参与人员 3 人,共设计用例 336 条。

二、测试执行情况
执行用例 328 条,执行率 97.6%,通过 316 条,通过率 96.3%。

三、缺陷情况
共发现缺陷 47 个,其中严重 2 个,一般 25 个,轻微 20 个,已修复 43 个。

四、总结
本次测试基本完成,系统功能基本可用,建议后续持续关注。

发出去之后,群里第一个问题不是「哪个缺陷没修」,而是:

CTO:所以明天能不能发?

报告写了三页,没有回答「能不能上线、风险是什么、需要谁决定」。这就是流水账:只有过程数据,没有判断。

测试报告的本质是风险说明书:用数据支撑一个可执行的建议,并让读的人知道要做什么决定。

二、结论先行:一页纸结构

第一屏只放四件事(BLUF:Bottom Line Up Front):

要素 回答什么 示例
结论 可上线 / 有条件上线 / 不可上线 有条件上线
依据 3 条以内硬数据 P0/P1 已清零;核心用例通过率 99.2%;压测 P95 1.82s 优于基线
剩余风险 具体到场景与影响 导出任务在 1 万行以上偶发超时(3/50),影响运营导出,不影响用户下单
决策请求 谁、在什么时间前、决定什么 请 @pm-zhang 在 9-14 18:00 前确认是否接受该 P2 上线后修复

决策只有三档,写清楚就不容易被反复追问:

档位 判定条件 必须附带
可上线 P0/P1=0,准出项全绿,无已知高风险 灰度与观察计划
有条件上线 P0/P1=0,但存在 P2 或有明确限制 条件、责任人、验证方式、兜底开关
不可上线 存在未关闭 P0/P1,或核心指标不达标 阻塞项、修复预估、复测条件

「基本可用」「持续关注」不属于任何一档,属于没结论。

三、三段式摘要:同一份报告,三种读者

管理者、研发、产品关注点不同,摘要要分开写,每段 3~5 行。

给管理者(成本、风险、决策)

结论:建议 9-15 有条件上线(灰度 10% → 50% → 100%)。
依据:P0/P1 已全部关闭;336 条用例执行 328 条,末次通过率 96.3%;
      压测 P95 1.82s(基线 2.0s),错误率 0.02%。
风险:2 个 P2 遗留(导出超时、券列表分页重复),均有开关可降级,不影响交易主链路。
需要决策:是否接受 P2 上线后 48 小时内修复;若要求上线前清零,发布需顺延 1 天。

给研发(改了什么、哪里没测、遗留项)

本次覆盖:退款全链路(含部分退款、审批、回调幂等)、订单状态新增 PARTIAL_REFUNDED、券分摊计算。
未覆盖:IE11 兼容(环境不具备)、第三方支付沙箱的退款到账时延(依赖方限制)。
遗留缺陷:QALAB-231 导出任务 1 万行以上超时(P2,超时阈值 30s,建议先调到 60s);
          QALAB-245 券列表第 2 页重复 1 条(P2,前端分页游标问题)。
回归建议:退款相关改动集中在 RefundCalculator,建议发布后重点观察退款失败率与对账差异。

给产品(用户可见变化、文案、运营影响)

用户可见:订单详情新增「部分退款」状态;退款到账文案改为「1-3 个工作日」。
运营影响:后台新增退款审批入口,客服额度 10000 元,超出需财务审批。
已知问题:导出 Excel 超过 1 万行会超时,运营建议分批次导出(每批 5000 行)。
上线节奏:9-15 10:00 灰度 10%,观察 30 分钟后放量至 50%,16:00 全量。

三段摘要不是把正文复制三遍,而是同一组事实的不同切面,数字必须一致。

四、真实版本报告骨架

章节 目的 必填内容 建议篇幅
1 结论与决策请求 让人 10 秒内知道能不能发 档位、3 条依据、风险、决策人与截止时间 半页
2 测试范围 界定「测了什么、没测什么」 覆盖模块、变更点、未覆盖项及原因 半页
3 执行情况 证明测试做完了 计划/执行/通过/跳过、自动化占比 1/3 页
4 缺陷分析 证明风险可控 级别分布、模块分布、遗留项、重开率 1 页
5 专项结论 性能、安全、兼容 指标 vs 基线、漏洞等级、兼容矩阵 半页
6 风险与依赖 说明不确定性 环境差异、第三方依赖、数据限制 半页
7 发布方案 怎么发、怎么退 灰度比例、观察指标、回滚步骤与耗时 半页
8 附录 可下钻 用例清单、缺陷清单、日志与报告链接 不限

4.1 结论段(节选)

结论:有条件上线(Conditional Go)
版本:order-service v2.3.0 / web 2.18.0
发布窗口:2026-09-15 10:00

依据
1. P0/P1 缺陷 0 条未关闭(QALAB-201、QALAB-207 已复验通过)。
2. 核心交易链路用例 118/118 通过;全量末次通过率 96.3%(316/328)。
3. 压测 P95 1.82s、错误率 0.02%,均优于基线(2.0s / 0.1%)。

剩余风险
- QALAB-231:导出任务超过 1 万行时超时(3/50 次),运营功能,有分批导出绕过方案。
- QALAB-245:券列表第 2 页重复 1 条,展示问题,不影响领券与核销。

条件(缺一不可)
1. QALAB-231 的上限由 30s 调整为 60s,并在灰度环境回归通过 —— @dev-li,9-14 18:00 前。
2. 灰度 10% 观察 30 分钟,退款失败率 >0.5% 立即回滚 —— @ops-wang。
3. P2 修复版本 2.3.1 于 9-17 前发布 —— @pm-zhang 确认。

4.2 范围段(节选)

类型 内容 说明
覆盖 退款全链路、订单状态、券分摊、后台审批 对应变更点 12 个
覆盖 接口 46 个(新增 3、变更 9) 含契约测试
未覆盖 IE11 兼容 测试环境无 IE11,按流量 0.3% 接受风险
未覆盖 第三方退款到账时延 沙箱不支持,改为生产灰度观察
不适用 性能容量 本版本无容量变化,复用 2.2.0 压测结论

「未覆盖」必须写原因和替代验证手段。只写「未覆盖」三个字,等于把风险藏起来。

4.3 执行段(节选)

指标 数值 口径
计划用例 336 用例基线 v3
已执行 328 不含跳过 8 条
执行率 97.6% 328 / 336
末次通过 316 重跑通过按末次计
末次通过率 96.3% 316 / 328
跳过 8 IE11 2 条、第三方沙箱 6 条
自动化用例 128 占 38.1%
自动化执行占比 39.0% 128 / 328

4.4 缺陷段(节选)

级别 发现 关闭 遗留 遗留说明
P0 2 2 0 -
P1 6 6 0 -
P2 20 17 3 导出超时、分页重复、通知延迟
P3 19 18 1 文案
合计 47 43 4 均有 owner 与目标版本

补充三个数:

  • 缺陷密度:47 / 23.1 KLOC = 2.03 条/KLOC(未加权;加权口径见质量度量篇)。
  • 重开率:3 / 43 = 7.0%,重开的 3 条均为「修复未覆盖相邻分支」。
  • 缺陷发现阶段:提测前 11 条(23.4%)、提测后 30 条(63.8%)、回归期 6 条(12.8%)。

4.5 性能段(节选)

场景 并发 TPS P95 P99 错误率 基线 结论
下单预览 200 412 182 ms 310 ms 0.00% P95 ≤300 ms 通过
提交订单 100 186 1.82 s 2.94 s 0.02% P95 ≤2.0 s 通过
退款申请 50 96 640 ms 1.21 s 0.01% P95 ≤800 ms 通过
退款查询 200 520 210 ms 402 ms 0.00% P95 ≤300 ms 通过

压测环境:4C8G × 2 实例,MySQL 8.0 主从,Redis 7.2 单节点。环境与生产不同构的部分要写在表下,否则性能结论不可信。

4.6 发布方案段(节选)

灰度:10%(按用户 ID 尾号 0-9)→ 观察 30 分钟 → 50% → 观察 30 分钟 → 100%
观察指标:退款失败率(阈值 0.5%)、下单 P95(阈值 2.0s)、5xx 率(阈值 0.1%)、
          退款单量(同比昨日 ±40%)
回滚:开关 refund.partial.enabled=false(5 分钟生效);镜像回滚
      kubectl rollout undo deploy/order-service -n prod(实测 3 分 40 秒)
数据:refund_item 表只增不删,回滚不回删数据

五、指标口径:分母不写清,数字就是噪音

指标 公式 口径细节 常见错误
用例执行率 已执行 / 计划 跳过是否计入计划?本例计入计划、不计入已执行 把跳过算作已执行,执行率虚高
通过率 末次通过 / 已执行 必须声明「末次执行」 用「任一次通过」,重跑刷通过率
缺陷密度 缺陷数 / KLOC 是否加权、代码范围 分母混入生成代码
遗留缺陷 未关闭数 按级别 + 影响 + owner + 目标版本 只报总数,不报级别
重开率 重开单数 / 关闭数 一单多次重开算 1 按次数算,指标虚高
RT P95 / P99 场景、并发、数据集必须一致 只报平均值
错误率 失败请求 / 总请求 区分业务失败与系统错误 把 4xx 业务校验算成错误

「通过率 96.3%」这句话本身不完整。完整的表述是:

末次通过率 96.3%(316/328),分母为已执行用例,不含跳过 8 条;
若按计划用例 336 计,通过率为 94.0%(316/336)。

两个数都写,避免被追问时临时换算。

性能指标同理,必须带「场景 + 并发 + 数据集 + 环境」四要素:

提交订单接口:100 并发、商品 200 个、用户 5 万、优惠券 3 张,
P95 1.82s、P99 2.94s、错误率 0.02%,4C8G × 2 实例。

只写「响应时间 1.8 秒」,无法判断是否达标。

六、图表选择

报告里至少要有一张「趋势」和一张「分布」,其余按需。选择原则:看趋势用折线,看构成用堆叠,看对比用条形,看收敛用双轴。

目的 用什么 不要用 原因
8 周缺陷/逃逸趋势 折线图(双线:发现、关闭) 饼图 饼图无法表达时间
缺陷按模块分布 横向条形图 3D 饼图 条形长度可直接比较
缺陷按级别构成 100% 堆叠柱 分离饼图 看占比随版本变化
执行进度 累计曲线(计划 vs 实际) 仪表盘 仪表盘没有过程信息
收敛判断 双轴:柱状新增/关闭 + 折线累计未关闭 单一总量折线 总量掩盖新增与关闭的差
性能分布 P50/P95/P99 表格 + 箱线图 平均值折线 平均值掩盖长尾
用例执行/通过 分组条形(计划/执行/通过) 词云 无信息量

三条硬规则:

  1. 一张图只回答一个问题,标题写成结论,例如「2.3.0 提测后新增缺陷连续 4 天下滑」,而不是「缺陷趋势图」。
  2. 图上标出阈值线,例如 P95 基线 2.0s、CFR 15%。
  3. 图必须能下钻,附录里给出对应的用例 ID 或缺陷 key,否则无法行动。

七、怎么写「不建议上线」

结构固定六段:结论 → 硬依据(≥3 条)→ 影响量化 → 备选方案 → 复测条件 → 决策请求。

结论:不建议按原计划 9-15 上线,建议延期至 9-18。

依据
1. P1 未关闭 3 条:QALAB-301 部分退款金额少退(必现 5/5)、QALAB-305 退款回调重复核销、
   QALAB-309 审批通过后状态不再流转。三者均在核心资金链路。
2. 提交订单压测 P95 从 1.82s 升至 2.63s(+44%),超过基线 2.0s;错误率 0.02% → 0.31%。
   定位到 RefundService 同步调用对账接口,阻塞主线程 380ms。
3. 回滚未验证:refund_item 表新增外键,回滚脚本执行失败(ERROR 1217: Cannot delete
   or update a parent row),预计回滚耗时 >30 分钟,超过 10 分钟红线。

影响量化
- 若带上述问题上线:预计每万笔退款出现 3~5 笔金额错误,按日均 1400 笔估算,日影响 0.4~0.7 笔,
  单笔平均 90 元;重复核销可能导致券二次使用,资损不可逆。
- 若延期 3 天:市场活动 9-16 的退款承诺无法兑现,预计客诉 200+。

备选方案
A. 延期至 9-18,修完 3 个 P1 + 修回滚脚本(推荐)。
B. 9-15 只上线查询类改动,退款写路径用开关关闭(需产品确认活动文案)。
C. 带开关上线,但把退款入口仅开放给内部账号 24 小时(可验证真实流量)。

复测条件
- 3 个 P1 关闭并在 2.3.1-rc1 复验通过;
- 压测 P95 ≤2.0s、错误率 ≤0.1%;
- 回滚演练 ≤10 分钟,脚本在预发环境实际执行成功。

决策请求
请 @cto-liu 在 9-14 20:00 前选择 A/B/C;若选 A,需市场同步调整 9-16 的活动文案。

写法要点:

要点 差写法 好写法
依据 「存在较多问题」 具体 key + 复现率 + 指标数值 + 阈值
影响 「影响用户体验」 影响笔数/金额/客诉量,给计算过程
方案 「建议延期」 A/B/C 三个方案及各自代价
请求 「请领导决定」 指定人、时间点、决定内容

不要用「风险较大」这种无法反驳也无法执行的表述。每一个「风险」后面必须跟一个数字或一个可验证事实。

八、流水账反例与改写

段落 流水账原文 问题 改写
概述 「本次测试从 9 月 8 日到 9 月 13 日」 时间不是结论 「结论:有条件上线,2 个 P2 不影响主链路」
执行 「执行 328 条,通过 316 条」 没有分母口径与跳过原因 「执行率 97.6%(328/336),跳过 8 条:IE11 2、沙箱 6」
缺陷 「发现 47 个,修复 43 个」 不区分级别与遗留风险 「P0/P1 清零;遗留 4 条 P2/P3,均有 owner 与目标版本」
性能 「性能测试通过」 没有指标与基线 「提交订单 P95 1.82s,基线 2.0s,错误率 0.02%」
风险 「存在一定风险,建议关注」 无法行动 「导出 >1 万行超时,3/50,建议阈值 30s→60s,@dev-li 9-14 前」
总结 「系统基本可用」 不是决策 「建议灰度 10%,退款失败率 >0.5% 回滚」

同一份数据,改写后页数更少,但每个数字都能支撑一个动作。

九、可直接复制的 Markdown 模板

# 订单 v2.3.0 测试报告

> 结论:有条件上线 | 报告人:@qa-wang | 日期:2026-09-14 | 版本:v2.3.0

## 1. 结论与决策请求

- **结论**:有条件上线(灰度 10% → 50% → 100%)
- **依据**
  1. P0/P1 未关闭 0 条
  2. 核心链路用例 118/118 通过;全量末次通过率 96.3%(316/328)
  3. 提交订单 P95 1.82s(基线 2.0s),错误率 0.02%
- **剩余风险**:QALAB-231 导出超时(P2,有绕过);QALAB-245 分页重复(P2,展示层)
- **决策请求**:@pm-zhang 于 9-14 18:00 前确认 P2 上线后修复

## 2. 测试范围

| 类型 | 内容 | 说明 |
| --- | --- | --- |
| 覆盖 | 退款全链路、订单状态、券分摊、审批 | 变更点 12 个 |
| 未覆盖 | IE11 兼容 | 环境不具备,流量 0.3%,接受风险 |
| 未覆盖 | 第三方到账时延 | 沙箱限制,改为灰度观察 |
| 不适用 | 容量 | 无容量变化,复用 2.2.0 结论 |

## 3. 执行情况

| 指标 | 数值 | 口径 |
| --- | --- | --- |
| 计划 / 执行 / 跳过 | 336 / 328 / 8 | 跳过:IE11 2、沙箱 6 |
| 执行率 | 97.6% | 328 / 336 |
| 末次通过率 | 96.3% | 316 / 328 |
| 自动化占比 | 38.1% | 128 / 336 |

## 4. 缺陷

| 级别 | 发现 | 关闭 | 遗留 |
| --- | --- | --- | --- |
| P0 | 2 | 2 | 0 |
| P1 | 6 | 6 | 0 |
| P2 | 20 | 17 | 3 |
| P3 | 19 | 18 | 1 |

- 缺陷密度:2.03 条/KLOC(47 / 23.1 KLOC,未加权)
- 重开率:7.0%(3/43)
- 遗留清单:见附录 B,含 owner 与目标版本

## 5. 性能与安全

| 场景 | 并发 | P95 | 错误率 | 基线 | 结论 |
| --- | --- | --- | --- | --- | --- |
| 提交订单 | 100 | 1.82 s | 0.02% | ≤2.0 s | 通过 |
| 退款申请 | 50 | 640 ms | 0.01% | ≤800 ms | 通过 |

- 安全:高危 0,中危 2(已有豁免单 SEC-11、SEC-12)

## 6. 风险与依赖

| 风险 | 等级 | 影响 | 措施 | Owner |
| --- | --- | --- | --- | --- |
| 导出超时 | P2 | 运营导出失败 | 阈值 30s→60s,分批导出 | @dev-li |
| 分页重复 | P2 | 展示重复 | 2.3.1 修复 | @dev-chen |

## 7. 发布方案

- 灰度:10% → 30 分钟 → 50% → 30 分钟 → 100%
- 观察:退款失败率 <0.5%、下单 P95 <2.0s、5xx <0.1%
- 回滚:开关 refund.partial.enabled=false(5 分钟);镜像回滚(实测 3 分 40 秒)
- 数据:refund_item 只增不删

## 8. 附录

- A 用例清单:<链接>
- B 缺陷清单:<链接>
- C 压测报告:<链接>
- D 安全扫描:<链接>

模板里所有 <链接> 都必须是可访问地址,发外发版本时替换为脱敏后的静态页。

十、发布后回填

报告不是发布即结束,24 小时和 72 小时要回填两段:

## 9. 上线观察(回填)

### 24 小时
- 灰度 100% 完成时间:9-15 16:20
- 退款失败率:0.12%(阈值 0.5%)
- 下单 P95:1.74s(基线 2.0s)
- 5xx 率:0.01%
- 新增线上缺陷:1 条(QALAB-260,券列表分页重复未完全修复,P3)

### 72 小时
- 退款量:4210 笔,失败 5 笔(0.12%),均为渠道超时,已自动重试成功
- 对账差异:0
- 结论:风险可控,QALAB-260 并入 2.3.1

逃逸缺陷按统一口径登记,否则季度统计无法复用:

project = QALAB AND type = 缺陷 AND environment = "prod"
  AND created >= "2026-09-15" AND created < "2026-10-15"
  AND fixVersion = "2.3.0"

归档命名固定为 {版本}-测试报告-{发布日期}.md,并附一个 metrics.json(执行率、通过率、遗留数、逃逸数),方便季度汇总时直接读取,而不是再从文档里抠数字。

十一、检查清单

  • 第一屏有结论、3 条依据、剩余风险、决策人与截止时间
  • 结论是三档之一,没有「基本通过」「持续关注」
  • 执行率与通过率都写了分子分母,跳过原因已列
  • 通过率注明「末次执行」口径
  • 遗留缺陷按级别列出,每条有 owner 与目标版本
  • 未覆盖项写了原因与替代验证手段
  • 性能指标带场景、并发、数据集、环境、基线
  • 安全结论区分高危与中危豁免
  • 回滚方案有开关名与实测耗时
  • 每个风险都能量化到笔数/金额/耗时
  • 「不建议上线」给出了 A/B/C 备选方案与复测条件
  • 发布后 24h/72h 已回填,逃逸缺陷已登记

相关阅读