测试报告里写着“通过率72%”,项目负责人却不敢发布;100条用例中只有8条失败,真正拖慢进度的却是10条阻塞和10条未执行。问题往往不在于测试人员不会记录结果,而在于把 Pass、Fail、Blocked、Not Run 当成了同一种“未通过”。在我参与中大型团队测试流程梳理时,最有效的改进并不是先增加用例数量,而是先建立一套“状态,原因,风险,动作”的分析闭环。
本文用5个步骤,说明如何从执行状态中识别真实风险、减少重复沟通,并让测试报告直接服务于发布决策。
一、先讲结论:用例状态不是结论,而是决策入口
1. 通过率高,不等于版本风险低
通过率只能说明一部分已经执行的用例达到了预期,不能说明核心业务已经完整验证,更不能直接等同于产品质量。一个版本即使有90%的用例通过,只要支付、权限、订单提交或数据保存等关键链路仍处于失败、阻塞或未执行状态,发布风险依然可能很高。
我在实际分析测试报告时,会把“通过率”放在第二层,而不是第一层。第一层先看核心业务是否完成验证,第二层再看各类状态如何分布,第三层才分析失败原因、缺陷等级和剩余风险。这个顺序可以避免团队被单一百分比误导。
| 分析层级 | 核心问题 | 不能替代的指标 |
|---|---|---|
| 业务完整性 | 核心链路是否都形成有效结论 | 不能只看总用例数 |
| 执行状态 | Pass、Fail、Blocked、Not Run如何分布 | 不能把非Pass统一算失败 |
| 问题原因 | 失败来自产品、环境、数据还是用例 | 不能直接把Fail等同于缺陷 |
| 发布风险 | 剩余问题是否影响用户、收入和合规 | 不能只按失败数量排序 |
我的判断原则是:状态数量用于发现异常,状态位置用于判断影响,状态原因用于安排动作,状态趋势用于决定是否可以发布。

2. 五个步骤分别解决什么问题
- 统一状态口径:解决不同人员对同一状态理解不一致的问题。
- 核对数据完整性:解决版本、范围、环境和重复执行导致的统计失真。
- 分析状态分布:解决只看通过率、忽略阻塞和未执行的问题。
- 关联原因与风险:解决无法判断失败是否为产品缺陷的问题。
- 转化为行动决策:解决测试报告写完了,却没人知道下一步做什么的问题。
这5步并不是报告模板上的5个栏目,而是一条实际工作路径。前一步的质量会直接影响后一步。例如,Blocked和Not Run没有区分,后面计算阻塞率和未执行率就没有意义;测试范围没有冻结,任何通过率都可能随意变化。
二、真实场景:为什么团队总在“看懂状态”上浪费时间
1. 同一个状态,在不同人眼里含义不同
在不少团队中,测试人员会把环境不可用的用例标记为Fail,因为工具里没有更合适的选项;有人把尚未排期的用例标记为Skipped;还有人把修复后等待回归的用例直接改成Pass,以便报告看起来更完整。最终,状态数量看起来很整齐,实际却无法还原测试过程。
这种问题在多人协作、多个测试环境并行、自动化与手工测试混合时尤其明显。中大型组织通常同时存在需求测试、回归测试、接口测试和持续集成任务,如果没有统一状态字典,管理者看到的是一张“数字正确、含义混乱”的报告。
2. 一个典型版本的状态分布
下面是一组情景模拟数据,不代表行业平均水平。假设某电商系统在一个版本周期内计划执行100条用例,结果为:Pass 72条、Fail 8条、Blocked 10条、Not Run 10条。表面上看,72%的用例通过,似乎测试已经完成大半;但这个结论至少缺少三个重要信息:失败集中在哪些模块,阻塞是否由同一个环境问题造成,未执行用例是否包含关键业务。
| 状态 | 数量 | 占计划用例比例 | 是否形成有效通过结论 | 首要动作 |
|---|---|---|---|---|
| Pass | 72条 | 72% | 是 | 确认是否覆盖核心链路 |
| Fail | 8条 | 8% | 否 | 复现并判断产品或测试条件问题 |
| Blocked | 10条 | 10% | 否 | 定位阻塞原因和解除时间 |
| Not Run | 10条 | 10% | 否 | 说明未执行原因并重新排期 |

3. 我通常先问的三个问题
- 这100条用例是不是本轮真正应该执行的范围?
- 其中哪些用例属于核心业务、合规要求或高影响功能?
- 所有非Pass状态是否都记录了可追溯的原因和责任人?
如果这三个问题无法回答,我不会直接在报告中写“测试通过率72%”。更准确的表达应该是:“计划执行100条,已执行80条,其中72条通过;8条失败、10条阻塞、10条未执行,核心业务覆盖率及剩余风险仍需进一步确认。”这句话看起来没有那么漂亮,却更接近真实情况。
三、拆解误区:五种看似省事、实际降低效率的做法
1. 把所有非Pass状态都算成失败
Fail意味着用例已经执行,并且实际结果不符合预期;Blocked意味着计划执行,但被环境、权限、依赖服务、测试数据或前置缺陷阻断;Not Run意味着尚未产生执行结果;Skipped则通常表示根据范围或规则主动跳过。它们的处理责任和时间成本完全不同。
| 状态 | 是否已执行 | 常见原因 | 建议处理方式 |
|---|---|---|---|
| Pass | 是 | 实际结果符合预期 | 确认版本、环境和测试数据可追溯 |
| Fail | 是 | 产品缺陷、数据错误、用例过期 | 复现、归因、关联缺陷并回归 |
| Blocked | 未完成 | 环境、权限、依赖或前置流程阻塞 | 解除阻塞后补测,不建议直接改成Fail |
| Not Run | 否 | 排期未到、资源不足或范围变更 | 补充原因、责任人和计划时间 |
| Skipped | 否 | 明确排除或暂不覆盖 | 记录跳过依据及潜在风险 |
2. 用总通过率代替核心场景完成度
总通过率的最大问题是把所有用例视为同等重要。登录失败、支付失败和一个后台按钮文字错误,都可能各占一条用例,但它们对发布的影响显然不同。测试状态分析必须增加业务权重,否则报告会偏向“数量多的低风险模块”。
我更倾向于同时维护两个数字:总体执行完成度和核心链路有效通过率。前者回答“本轮做了多少工作”,后者回答“最重要的业务是否经得住验证”。两者不能互相替代。
3. 看到Fail就马上提缺陷
失败用例并不自动等于产品缺陷。一次失败可能来自测试账号权限失效、依赖接口返回异常、数据库数据没有初始化、用例步骤已经不适配当前需求,甚至可能是预期结果写错。直接提缺陷会制造无效任务,开发人员修复后仍然无法解决真正问题。
我通常要求测试人员先完成一次最小化复核:重新执行一次、换一组有效数据、核查环境日志、确认需求版本,再决定是否提交缺陷。对于高风险核心流程,可以并行保留“待确认”状态,但不能为了追求缺陷数量而跳过归因。
4. 用最后一次结果覆盖全部历史结果
同一个用例在修复前失败、修复后通过,并不意味着原始失败没有价值。若工具只保留最后一个Pass,团队会失去缺陷发现时间、回归次数和修复有效性的过程证据。尤其是在版本复盘、质量趋势分析和合规审计中,执行历史比最终状态更重要。
正确做法是区分测试轮次,例如冒烟测试、第一轮系统测试、缺陷回归和发布前回归。每轮保留执行时间、版本号、环境、执行人和关联缺陷,最终报告再按当前版本汇总。
5. 为了让报告好看,批量修改状态
这是最危险的一种“效率优化”。把Blocked批量改成Not Run、把Not Run批量改成Pass,短期内可以减少追问,长期会让团队无法判断测试覆盖率和发布风险。报告数字越整齐,决策可能越不可靠。

四、专业判断逻辑:从状态名称走向状态,原因,风险,动作
1. 第一步:建立项目自己的状态字典
工具默认状态不能直接当成团队标准。不同测试管理工具、自动化框架和持续集成平台对Skipped、Error、Retest、Quarantined等状态的定义可能不同。项目启动时,应把状态名称、适用条件、是否计入分母、后续动作写成一张状态字典。
| 字段 | 示例内容 | 作用 |
|---|---|---|
| 状态名称 | Blocked | 统一团队用词 |
| 判定条件 | 已排期执行,但外部依赖导致无法完成 | 减少主观标记 |
| 是否计入已执行 | 否 | 保证统计分母一致 |
| 必须填写字段 | 阻塞原因、责任人、预计解除时间 | 让状态可跟踪 |
| 转化路径 | Blocked→Ready→Retest→Pass/Fail | 明确下一步动作 |
2. 第二步:确认统计分母,而不是只看分子
通过率最容易被误用的地方是分母。常见公式是:通过率=Pass用例数÷有效执行用例总数×100%。如果本轮计划100条,但只有80条实际执行,其中72条通过,那么按有效执行用例计算,执行通过率是90%;按计划范围计算,计划范围通过占比是72%。两个数字都可以使用,但含义完全不同,报告必须写清楚。
我建议至少同时展示三类指标:计划完成度、有效执行通过率和核心链路通过率。这样既能看工作完成情况,也能看已执行内容的结果,还能防止低风险用例掩盖核心风险。
- 计划完成度:已产生有效结果的用例数÷计划用例总数。
- 有效执行通过率:Pass用例数÷已执行用例总数。
- 核心链路通过率:核心业务Pass用例数÷核心业务已执行用例总数。
- 阻塞率:Blocked用例数÷计划执行用例总数。
- 未执行率:Not Run用例数÷计划执行用例总数。
3. 第三步:按业务风险给用例加权
如果团队没有成熟的风险模型,可以先采用简单的三级权重:核心链路权重3,重要功能权重2,一般功能权重1。加权不是为了制造复杂报表,而是为了避免“一条支付失败”和“一条页面提示错误”在数字上被视为同等风险。
例如,核心用例有20条,其中15条通过、3条失败、2条阻塞;普通用例有80条,其中57条通过、5条失败、8条阻塞。总体通过率可能还不错,但核心用例的失败和阻塞已经足以阻止发布。此时应优先修复核心链路,而不是先处理普通模块中数量更多的低优先级问题。
4. 第四步:建立异常归因树
对于Fail和Blocked,我会要求团队沿着“产品、环境、数据、依赖、用例”五个方向排查。这样做的好处是把争论从“是不是缺陷”转化为“证据在哪里”。每个异常至少要有复现步骤、环境信息、日志或截图、预期结果和实际结果。
- 产品原因:功能逻辑、接口返回、权限校验或数据处理不符合需求。
- 环境原因:服务不可用、配置错误、版本部署不完整或资源不足。
- 数据原因:账号、库存、订单、权限或初始化数据不满足前置条件。
- 依赖原因:第三方服务、上游接口、消息队列或数据库状态异常。
- 用例原因:步骤过期、预期错误、前置条件缺失或描述不清。
5. 第五步:把分析结果写成明确决策
测试报告不要停留在“有8条失败、10条阻塞”这一层。报告结论至少需要回答:哪些功能已经验证,哪些功能仍没有有效结论,剩余风险是否影响发布,发布前必须完成什么动作,谁负责完成以及预计何时完成。
好的结论应该让产品、研发和测试负责人在同一页上看到行动优先级。例如:“支付成功回调存在2条高优先级失败,订单退款场景4条尚未执行,测试环境阻塞10条用例预计今日18点恢复;当前不建议正式发布,建议先完成支付回归和退款补测。”这比“测试存在一定风险,请关注”更有执行价值。

五、案例分析:用一组执行数据判断是否可以发布
1. 案例背景与原始结果
以下案例是经过匿名化处理的情景模拟,适用于说明方法,不代表某个具体企业的真实统计。某电商系统准备上线一次促销版本,计划执行100条用例,涉及登录、商品检索、购物车、下单、支付、退款、权限和后台报表等模块。
| 模块 | 计划用例 | Pass | Fail | Blocked | Not Run |
|---|---|---|---|---|---|
| 登录与权限 | 15 | 10 | 1 | 1 | 3 |
| 商品与购物车 | 20 | 17 | 1 | 1 | 1 |
| 订单与支付 | 25 | 15 | 5 | 3 | 2 |
| 退款与售后 | 15 | 8 | 1 | 2 | 4 |
| 后台与报表 | 25 | 22 | 0 | 3 | 0 |
| 合计 | 100 | 72 | 8 | 10 | 10 |
如果只看总数,72条通过、8条失败,失败率并不算高;但拆到业务模块后,订单与支付模块有5条失败、3条阻塞,退款与售后还有4条未执行。这意味着真正影响收入和客户体验的链路,恰恰没有形成完整结论。
2. 第一次判断:不能直接发布
该版本的计划完成度为80%,因为只有72条Pass和8条Fail被实际执行,Blocked与Not Run尚未形成完整执行结论。若以已执行的80条计算,通过率为90%;若以计划总数计算,Pass占比为72%。这两个数字都不能单独支持发布。
更重要的是,订单与支付的25条用例中,只有15条通过,核心链路有效通过率为60%。即使后台报表25条用例中有22条通过,也不能用后台模块的稳定表现去抵消支付流程的不确定性。

3. 第二次判断:继续拆分失败原因
进一步复核发现,8条失败中有5条来自支付和订单流程。其中3条能够稳定复现,表现为支付成功后订单状态没有及时更新;1条是测试数据失效导致,1条因需求规则变更但用例尚未同步。10条Blocked中有6条来自同一套测试环境的支付回调服务异常,另有2条受权限配置影响,2条受前置用例未通过影响。
| 异常类别 | 数量 | 是否直接判定为产品缺陷 | 处理优先级 |
|---|---|---|---|
| 可稳定复现的支付状态错误 | 3条 | 是,建议创建高优先级缺陷 | 最高 |
| 测试数据失效 | 1条 | 否,先修复数据 | 中 |
| 需求变更导致用例过期 | 1条 | 否,先更新用例 | 中 |
| 支付回调环境异常 | 6条 | 否,先恢复依赖服务 | 高 |
| 权限配置问题 | 2条 | 通常不是产品缺陷 | 中 |
| 前置用例未通过 | 2条 | 需结合前置缺陷判断 | 高 |
经过归因后,团队会发现“8条失败、10条阻塞”并不是18个同等严重的问题。真正需要研发优先处理的是3条可稳定复现的支付状态错误;测试环境恢复后,至少有6条阻塞可以重新执行;需求过期的用例则应从统计中剔除或重新评审。
4. 第三次判断:形成发布建议
在支付状态错误修复并完成回归前,我会建议暂缓正式发布。原因不是失败数量达到某个固定阈值,而是失败集中在核心交易链路,并且退款场景尚未完成验证。即使研发确认支付缺陷已修复,也需要重新执行支付成功、支付失败、重复回调、订单超时和退款关联等场景。
如果业务方必须按期上线,可以把取舍写清楚:限制发布范围、关闭高风险促销入口、增加线上监控、安排值班人员、保留回滚方案,并在规定时间内补齐未执行用例。带风险发布不是一句“业务要求上线”就结束,而是把风险、控制措施和责任人明确记录下来。

六、不同情况下的行动建议:状态不同,处理动作不能相同
1. Pass较多,但核心用例未覆盖
这种情况首先要暂停庆祝“通过率高”。应立即筛选核心业务标签、用户故事、风险等级或发布阻断标识,重新计算核心链路完成度。若核心用例仍处于Not Run或Blocked,应优先调配人员和环境,而不是继续执行更多低风险用例。
- 确认核心用例清单是否完整。
- 将核心用例从普通统计中单独拆出。
- 为未执行项补充责任人和完成时间。
- 在核心链路完成前,不输出“整体测试通过”的结论。
2. Fail数量少,但集中在核心流程
失败数量少不代表影响小。支付、登录、权限和数据保存等流程通常具有较高业务影响,即使只有1条失败,也可能阻断发布。此时应优先看缺陷严重程度、复现稳定性、影响用户范围和是否存在绕行方案。
如果问题能够稳定复现、影响主流程且没有替代路径,我会把它列为发布阻断项。如果问题只影响极端边界场景,并且有明确绕行方案,则可以提交风险评审,但不能在报告中悄悄降低它的状态。
3. Blocked数量较多,且集中在同一环境
大量Blocked通常意味着测试系统本身存在瓶颈。此时继续让测试人员重复点击没有意义,应先恢复环境、补齐数据或修复依赖服务。若短时间内无法恢复,可以采用替代环境、接口模拟、历史稳定数据或分层验证方案,但必须标注验证边界。
| 阻塞原因 | 短期替代方案 | 长期改进方向 |
|---|---|---|
| 测试环境不稳定 | 切换备用环境或隔离故障服务 | 增加环境健康检查和部署回滚机制 |
| 测试数据不足 | 准备标准数据集或数据工厂 | 建立可重复初始化的数据管理流程 |
| 依赖接口未完成 | 使用契约模拟或固定返回值 | 提前冻结接口契约并开展联调 |
| 权限配置错误 | 临时开通最小必要权限 | 建立角色权限基线和配置校验 |
4. Not Run数量较多,但原因明确
Not Run并不必然意味着团队效率低。有些用例确实属于后置验证、范围外功能或需要特定数据才能执行。关键在于是否有明确原因、是否得到业务确认、是否评估了未覆盖风险。
如果是范围变更,应从本轮计划中移除或标记为延期,而不是继续计入当前版本完成度;如果是资源不足,应重新排期并明确负责人;如果是时间不够,则要按照风险优先级选择补测范围,不能平均分配剩余时间。
5. 自动化测试出现大量Skipped或Error
自动化结果不能机械套用手工测试状态。Skipped可能是条件不满足、依赖数据缺失或脚本主动跳过;Error可能是框架、浏览器、接口连接或执行节点异常。自动化报告应额外关联流水线编号、脚本版本、执行节点和日志地址。
如果同一脚本连续多轮Skipped,不应继续把它当作“自动化覆盖率”。更准确的做法是把自动化用例分成已有效执行、脚本异常、环境异常和主动跳过四类,单独统计脚本健康度。

七、不同情况下的取舍:效率不是少做测试,而是少做无效测试
1. 扩大测试范围,还是优先保证核心链路
时间充足时,可以按照完整范围执行;时间紧张时,我不会平均压缩每个模块,而会优先保证核心链路、近期改动区域、高缺陷密度区域和合规要求场景。这样做的代价是普通功能覆盖可能下降,但换来的是真实风险更早暴露。
| 选择 | 收益 | 代价 | 适用场景 |
|---|---|---|---|
| 全量执行 | 覆盖范围最大,便于形成完整报告 | 耗时长,可能延迟发布 | 大版本、核心架构变更、时间充足 |
| 风险优先 | 更快验证关键链路 | 普通功能覆盖可能不足 | 紧急修复、窗口期短、资源有限 |
| 分层发布 | 降低一次性暴露风险 | 需要灰度、监控和回滚能力 | 可控制用户范围的线上发布 |
| 延期发布 | 为修复和补测争取时间 | 可能影响业务计划和市场窗口 | 核心缺陷无法绕过或风险不可控 |
2. 追求更高通过率,还是保留真实异常
如果团队考核只看通过率,测试人员自然会倾向于关闭、跳过或修改异常状态。更健康的做法是把考核重点放在状态准确率、异常归因及时性、核心场景覆盖率和缺陷回归闭环率上。测试报告越真实,团队越有机会改进产品和流程。
我更看重“异常是否被正确处理”,而不是“异常是否被消失”。一条被准确标记为Blocked并在当天解除的用例,价值可能高于一条被错误改成Pass的用例,因为前者让团队知道环境或依赖存在问题。
3. 引入工具,还是先修流程
对于100人以上、多个研发团队并行的组织,使用统一测试管理平台通常可以减少版本、用例、缺陷和报告之间的人工拼接。以PingCode为例,它主要面向中大型企业及100人以上组织,可用于统一管理测试用例、执行结果、缺陷关联和版本信息,并支持私有化部署。
如果企业原先使用其他项目管理系统,迁移时不应只搬运用例标题,还要核对状态映射、历史执行记录、字段权限、缺陷关联和报表口径。PingCode支持Jira平滑迁移,这类能力对已经积累多年项目数据、又需要进行国产替代的团队具有实际价值。不过,工具只能提高数据流转效率,不能替团队决定什么是核心风险。
| 工具能解决的问题 | 工具不能替代的判断 |
|---|---|
| 统一记录版本、用例和执行状态 | 哪些业务属于发布阻断项 |
| 关联缺陷、需求和回归结果 | 失败是产品问题还是测试条件问题 |
| 自动生成状态分布和趋势报表 | 通过率是否因范围调整而失真 |
| 支持多人协作与权限管理 | 是否接受某项剩余风险 |
| 支持私有化部署和历史数据迁移 | 组织是否具备统一流程和数据治理能力 |

八、落地模板:把5个步骤变成每天可执行的检查表
1. 执行前:确认范围和状态口径
- 确认版本号、测试环境和计划执行时间。
- 确认本轮用例范围,移除已取消或延期的需求。
- 标记核心链路、高风险模块和合规场景。
- 确定Pass、Fail、Blocked、Not Run、Skipped等状态的判定标准。
- 明确哪些字段必填,例如实际结果、环境、日志、缺陷编号和阻塞原因。
2. 执行中:记录事实,不提前下结论
- 实际结果与预期不一致时先标记Fail,并保留证据。
- 无法执行时标记Blocked或Not Run,不要为了报告好看直接修改。
- 记录测试数据、账号、浏览器、设备、接口版本等复现条件。
- 同一用例多次执行时保留执行轮次,不用最后一次结果覆盖历史。
- 发现公共环境问题时,及时通知相关负责人,避免多人重复执行。
3. 执行后:输出四张核心表
| 表格 | 至少包含字段 | 主要用途 |
|---|---|---|
| 状态汇总表 | 计划数、Pass、Fail、Blocked、Not Run及占比 | 了解总体完成情况 |
| 核心链路表 | 业务场景、优先级、当前状态、剩余动作 | 判断关键业务是否可发布 |
| 异常归因表 | 状态、原因类别、证据、责任人、预计完成时间 | 推动问题闭环 |
| 发布风险表 | 风险描述、影响范围、规避措施、接受人 | 支持发布评审和风险留痕 |
4. 报告结论模板
可以采用下面的结构,但不要机械复制固定比例:
- 测试范围:本轮覆盖哪些版本、需求和业务模块。
- 执行结果:计划多少条,已执行多少条,各状态分别多少条。
- 核心风险:哪些失败、阻塞或未执行项位于关键链路。
- 原因判断:产品、环境、数据、依赖和用例问题分别有多少。
- 发布建议:建议发布、条件发布、延期发布或暂缓发布。
- 后续动作:具体任务、责任人、完成时间和回归范围。
一个合格的测试报告,应该让不熟悉测试细节的管理者也能在几分钟内回答三个问题:现在能不能发布,不能发布的主要原因是什么,完成哪些动作后可以重新评估。若报告仍需要测试人员口头解释半小时,说明状态分析还没有真正完成。

九、下一步怎么做:从今天的测试报告开始改
1. 今天先做一件事:重新计算三种通过率
打开当前版本的测试报告,分别计算计划范围通过占比、有效执行通过率和核心链路通过率。不要急着比较哪个数字更高,而要在每个数字后面写清楚分母。很多团队在这一步就会发现,过去报告中的“通过率”其实混合了计划范围、有效执行和历史结果。
2. 明天补齐异常状态的原因字段
对所有Fail、Blocked、Not Run逐条补充原因、负责人和下一步动作。没有原因的Blocked,无法安排资源;没有计划的Not Run,无法判断风险是否会持续;没有复现证据的Fail,也无法有效推动研发处理。
3. 下一个迭代建立核心链路视图
不要等待所有用例都整理完再做风险分析。先列出登录、权限、下单、支付、数据保存、退款等对业务影响最大的场景,单独观察它们的状态、缺陷和回归结果。核心链路视图一旦建立,测试负责人就能从“总数管理”转向“风险管理”。
4. 团队规模扩大后再考虑平台化治理
当团队超过100人、项目并行数量增加、多个环境同时运行,依靠个人表格维护状态通常会逐渐失控。此时可以评估PingCode等支持测试管理、缺陷关联、版本追踪、私有化部署和历史数据迁移的项目管理平台,减少信息分散和重复汇总。
但平台选型要先看状态模型是否能适配现有流程,再看迁移能力、权限、部署方式、报表和集成能力。工具名称不是效率的核心,统一口径、保留证据、关联风险、明确动作才是测试执行效率真正提升的原因。
5. 最终记住这句判断口诀
先定口径,再看分布;关联原因,判断风险;明确动作,形成闭环。
用例执行结果分析的价值,从来不是把测试报告做得更漂亮,而是让团队更早知道哪里没有被验证、哪里可能影响用户、哪里需要投入资源,以及什么条件满足后才能放心发布。下一轮测试开始前,先把状态字典和核心链路清单建立起来;测试结束后,再用5个步骤复核数据、分析风险并输出决策。这样做,通常比单纯增加测试人员或堆积更多用例更能提高整体效率。
常见问题解答(FAQ)
1. 如何用5个步骤分析测试用例执行结果状态,避免只看通过率?
我以前整理测试报告时,曾经遇到过通过率达到72%,但版本仍然不敢发布的情况。后来我发现,真正影响判断的不是通过率本身,而是失败、阻塞和未执行用例分别集中在哪些业务环节,以及这些状态背后的原因是什么。
我建议按以下5个步骤分析:第一步,先统一状态口径。明确Pass、Fail、Blocked、Not Run、Skipped和Retest分别代表什么,尤其要区分“执行后失败”和“根本没有形成执行结论”。不同测试工具的状态定义可能不同,项目应以内部状态字典为准。第二步,核对数据完整性。
检查版本号、测试范围、环境、执行人、执行时间、测试数据和缺陷编号是否齐全。如果修复前后的结果混在一起,或者同一条用例被重复执行后只保留最后状态,统计结果就可能失真。第三步,分析状态分布,而不是只计算通过率。
以100条用例为例,Pass为72条、Fail为8条、Blocked为10条、Not Run为10条。表面上通过率是72%,但仍有18条用例没有得到有效通过结论。
状态数量占比应关注的问题 Pass7272%是否覆盖核心业务链路 Fail88%是产品缺陷还是测试条件异常 Blocked1010%阻塞原因、责任人和解除时间 Not Run1010%未执行是否有明确范围依据 第四步,把状态和模块、缺陷、环境关联起来。
失败数量最多的模块不一定风险最高,关键要看失败是否集中在支付、权限、订单、数据保存等核心场景。第五步,将分析结果转化为动作。报告中不要只写“测试通过率72%”,而应明确哪些核心流程已验证、哪些风险尚未关闭、谁负责处理、何时补测,以及当前是否具备发布条件。
我在实际复盘中最看重的一点是“状态与业务重要性的交集”。10条普通后台用例未执行,和2条支付主流程用例Blocked,绝不是同一个风险等级。测试效率的提升,最终体现为更快识别风险和做出决策,而不只是更快填完状态。
2. Pass、Fail、Blocked和Not Run应该如何区分?
我刚开始负责测试报告时,曾把Blocked和Fail一起统计,认为它们都属于“不通过”。后来开发排查发现,有些Blocked只是测试环境或前置数据不可用,并不能说明产品功能已经失败,这种统计方式会误导项目判断。
这四种状态的核心区别,在于“是否完成了有效验证”以及“下一步需要采取什么动作”。Pass表示实际结果符合预期,但它只证明当前条件下该用例通过,并不代表整个模块或版本没有风险。如果核心场景覆盖不足,Pass数量再多也不能替代完整性判断。Fail表示已经执行,但实际结果与预期不一致。
此时不能立即把它等同于产品缺陷,还要先复现问题,并检查环境、账号、数据、依赖服务、用例步骤和需求是否发生变化。Blocked表示计划执行,但受到外部条件阻断。例如测试环境不可用、前置用例未通过、接口依赖尚未部署、账号没有权限或关键测试数据缺失。Blocked的首要动作是解除阻塞,而不是直接创建缺陷。
Not Run表示尚未执行,原因可能是排期未到、测试范围调整、资源不足或临时跳过。它没有形成任何验证结论,因此不能计入Pass,也不能默认视为低风险。
状态是否实际执行典型处理动作报告中的表达 Pass是确认覆盖范围并保留证据已验证通过 Fail是复现、定位、关联缺陷并回归验证未通过 Blocked未完成解除环境、依赖或数据阻塞暂无法验证 Not Run否补充计划或说明跳过依据尚未验证 我的经验是,状态字段旁边必须增加“原因”和“下一步动作”两个字段。
例如“Blocked,预发布环境支付网关未配置,由环境负责人在18:00前处理”,比单独记录一个Blocked更有管理价值。如果团队经常出现同一场景被不同人员标记成不同状态,应立即维护状态字典,并在测试管理平台中限制可选值或增加填写说明。状态口径不一致,往往比少测几条用例更容易造成错误决策。
3. 为什么通过率很高,版本仍然可能不能发布?
我曾经看到一份测试报告,整体通过率超过90%,但发布评审仍然被叫停。进一步拆分后发现,失败用例集中在订单支付,另外还有一批权限和退款用例根本没有执行,整体比例掩盖了核心链路风险。
通过率高只能说明“已执行用例中通过的比例较高”,不能直接代表版本质量、测试完整度或可发布性。问题通常出在三个地方。第一,分母口径可能不一致。通过率一般按“Pass用例数÷有效执行用例总数”计算,而未执行率和阻塞率应按计划执行用例总数计算。如果把不同分母混用,报告中的百分比就无法比较。
第二,数量没有体现业务权重。登录、支付、权限、订单、数据保存等核心用例数量可能不多,但一旦失败,影响范围往往大于大量普通展示类用例。测试结论必须同时看状态数量和业务优先级。第三,未执行项和阻塞项会造成验证盲区。下面这个示例中,虽然Pass有72条,但18条用例没有形成有效通过结论。
模块PassFailBlockedNot Run风险判断 订单支付12521高风险,需优先处理 权限控制8114验证不完整 后台展示30121相对稳定 其他功能22154需确认阻塞原因 从表面数据看,后台展示的通过数量最高;但从发布风险看,订单支付的失败更值得优先处理。
我的判断顺序通常是:先看核心链路是否完成,再看高优先级缺陷,随后看Blocked和Not Run是否存在集中区域,最后才参考整体通过率。发布报告建议至少回答四个问题:哪些范围已经验证?哪些范围没有验证?剩余问题会影响哪些用户或业务?发布前必须完成哪些动作?
如果报告不能回答这四个问题,即使数据很完整,也还没有真正支持决策。
4. 如何通过状态分析提高测试效率,而不是增加报表工作量?
我以前遇到过每天都在更新测试状态,却没有减少重复沟通的问题。后来把状态和模块、缺陷、环境、责任人、下一步动作关联起来后,测试会议不再逐条询问“这条为什么失败”,而是直接处理集中出现的风险。
提高效率的关键不是增加统计指标,而是让每一种状态都能触发明确动作。可以采用“状态,原因,证据,动作,截止时间”的记录方式。对于Fail,先确认是否可以稳定复现,再检查日志、接口响应、截图和测试数据。如果能够复现,关联缺陷并标注影响模块;
如果无法复现,记录复现条件和待补充信息,避免测试人员与开发反复口头沟通。对于Blocked,不要只填写“环境问题”。应进一步写清楚是服务未部署、数据缺失、账号权限不足还是前置缺陷阻断,并指定负责人和解除时间。阻塞项如果超过约定时间仍未解决,应升级为项目风险,而不是一直停留在普通状态。
对于Not Run,必须区分“尚未排期”“主动跳过”“范围取消”和“资源不足”。这几种原因对应的管理动作完全不同:尚未排期需要补计划,主动跳过需要评估风险,范围取消需要更新测试范围,资源不足则要重新分配人员。我建议每轮执行结束后,按模块生成一张简表,而不是只看总览。
模块状态集中情况可能原因下一步动作 支付Fail集中接口参数或金额计算异常优先复现并回归 权限Not Run集中账号和角色数据未准备补充数据并安排执行 接口依赖Blocked集中依赖服务未部署确认部署时间并准备替代验证 自动化测试还要特别关注Skipped、Retried和Quarantined等状态。
自动化报告中出现大量Skipped时,不能把它们当成“脚本执行完成”;需要检查标签筛选、依赖服务、流水线参数和测试数据。大量Retry成功也不一定代表稳定通过,反而可能提示环境或代码存在间歇性问题。
最终,建议把测试报告固定为“范围、状态分布、核心模块、缺陷风险、阻塞项、未执行项、发布建议、后续计划”八个部分。这样做的结果是:测试人员减少重复解释,开发更快定位问题,项目负责人也能根据风险而不是单一通过率做决定。
核心关键词
原创文章,作者:飞飞,如若转载,请注明出处:https://worktile.com/solution-1/archives/43898
读者评论
文章把Pass、Fail、Blocked和Not Run区分开来很有必要,尤其是通过率72%与有效执行通过率90%的差异,能提醒团队先确认统计分母,再讨论发布风险。
按核心链路加权的思路比较实用。支付、权限、订单等关键场景即使数量不多,也不应被大量低风险用例的通过结果掩盖,适合用于发布评审。
文中提到失败不应直接等同于产品缺陷,这一点符合实际。环境、权限和测试数据都可能造成失败,先复核再提缺陷能减少无效沟通,但需要明确责任人和处理时限。
状态字典和执行历史是落地难点。团队如果没有统一判定条件,统计指标仍会失真;建议同时保留版本、环境、执行轮次和状态变更记录,便于回归和复盘。