我至今记得那个周三下午,会议室空调坏了,所有人的衬衫都黏在皮肤上。CEO 坐在对面,敲着桌子问:“不是说功能都开发完了吗?为什么还要两个月才能上线?”我告诉他,按照测试团队的估算,全面回归测试需要六周。他没再多说一个字,但那个眼神我记了十年,不是愤怒,是困惑。他无法理解,为什么代码写完了,项目却不能交付。
那次我们最终还是按时上线了,但不是靠加班加点完成“全面测试”,而是靠一个至今让很多同行觉得离经叛道的决定:主动放弃了60%的测试用例。是的,你没看错。我们砍掉了大半的测试范围,按时交付了系统,上线后没有发生任何导致业务中断的重大事故。六个月后客户续约,三年后系统还在稳定运行。
这篇文章想跟你聊的,就是这样一个反常识的判断:在瀑布模式下,不做全面测试,项目同样可以成功交付。关键在于,你得知道哪些测试可以不做,以及为什么可以不做。
一、核心结论:全面测试是一种成本幻觉
软件行业有一个被反复引用的信条:“缺陷发现得越晚,修复成本越高。”这句话本身没错。但它推导出的那个流行结论,“所以我们要在交付前把每个角落都测一遍”,是一个危险的逻辑跳跃。它假设测试资源是无限的、测试时间是充裕的、测试发现的所有问题都值得修。而这三点,在我经历过的任何一个真实项目中,从未同时成立过。
让我用一个简化的数字来解释这个困局。假设你有一个10万行代码的系统,测试团队梳理出2000条用例。按照“全面测试”的逻辑,你需要执行全部2000条、覆盖所有场景分支。但真实世界里,这2000条用例里有相当一部分对应的是极端异常路径、千年难遇的边界条件、或者用户几乎不可能触发的操作路径。
你消耗在低风险区域上的测试资源,正在挤占高风险区域的验证时间。一个月后,你测试覆盖率达到95%,但核心计费模块和权限校验逻辑因为时间不够只跑了基础路径。上线第四天,一个计费异常的订单造成了客户的直接财务损失。你的95%覆盖率在那一个订单面前,一文不值。

所以我的核心结论非常简单:瀑布模式下的成功交付,从来不取决于你“测了多少”,而取决于你“把测试资源投在了哪里”。放弃全面测试,不是放弃质量,恰恰是为了保卫质量最重要的那部分。
二、我在三家公司的踩坑实录:这个问题到底是怎么产生的
在继续深入之前,我想先跟你同步一个认知:“全面测试”这个执念,不是某一个人的决策失误,而是瀑布模型的系统性产物。你不理解它是怎么来的,就不可能真正摆脱它。
1. 第一家公司的场景:需求冻结后的“自我安慰型测试”
那是一家金融科技公司,做的是一套面向银行的信贷审批系统。典型的瀑布流程:需求阶段两个月,设计阶段一个月,编码阶段四个月,最后的测试阶段安排了六周时间。前期需求评审时,业务方拿出了300多页的需求规格说明书,每个字段、每个校验规则、每个异常分支都描述得清清楚楚。
问题就藏在这300页文档里。当测试团队拿到这份文档开始编写测试用例时,他们严格按照需求条目逐条映射,需求上写了什么,用例就测什么。这种做法在理念上无懈可击:保证了100%的需求追溯性。但现实是,那些长达数十页的异常分支描述,大多来自业务分析师“万一发生这种情况怎么办”的假设性推演,而非真实的业务操作历史。其中有一个“客户在审批流程中同时被两个信贷员操作”的并发场景,测试团队为它编写了7条用例、搭建了独立的测试环境、消耗了将近三天时间。上线后我们查了后台日志:这个场景在接下来两年里一次都没发生过。
这是我第一次意识到:在瀑布模式下,需求文档的“完备性”本身可能是一个陷阱。它把所有风险都扁平化了,让测试团队误以为每一个需求条目都同等重要。而当测试周期接近尾声、上线日逐渐逼近的时候,测试经理面临的是一个不可能的选择:要么砍掉一些“看起来都重要”的用例,要么申请延期。大多数人的选择是第三个,找一些表面上的理由,保留所有用例,但开始压缩每条用例的执行深度。于是测试变成了“点一点、看一眼、通过”的过场戏。我后来给这种测试策略起了一个名字:自我安慰型测试。它满足的是测试覆盖率这个KPI,而不是系统的质量。
2. 第二家公司的惨痛教训:大爆炸式测试的反噬
第二家公司做的是电商SaaS产品,服务中小商家。这次我更深入地参与了整个交付流程,也因此看到了瀑布测试模式最具破坏力的一面,所谓“大爆炸式测试”,就是把所有测试活动全部堆积在编码完成之后的那几周里。
那个项目的节奏是这样的:编码阶段几乎没有任何测试介入。开发人员写完代码,自己简单测一下主路径就标记为“完成”。三个月后,全部功能模块被扔给测试团队。接下来的一个月,是我们团队的至暗时刻。每天早上的例会变成了缺陷通报大会:今天又发现了47个Bug,其中12个阻塞级别。开发忙着修Bug,测试测着被修坏的功能,产品经理在群里问“这个版本到底还能不能上”。
最糟糕的是,我们在最后一周发现了订单核销逻辑中的一个严重缺陷:当用户同时使用优惠券和积分抵扣时,系统可能计算出负金额。这个Bug需要修改核心交易引擎的结算逻辑,而那一行代码一旦改动,意味着关联的库存扣减、账务流水、退款流程全部需要回归验证。我们面临的选择极其残酷:修这个Bug,上线延期至少三周,可能错过双十一窗口期;不修,风控团队说风险可控(他们给了一张内部用券可以人工核对的兜底方案),但我们心里清楚这是埋了一颗定时炸弹。
最终这个项目延了期,团队散了,我背了绩效上的处罚。但这件事让我看清了一个更本质的问题:瀑布把测试压到末端,不只是放大缺陷修复成本,它毁掉的是团队的决策弹性。当你还有时间的时候,你觉得代码还在写、测不了什么;当你终于可以测了,你已经没有时间应对测试发现的问题了。你的唯一选项只剩下“上线”和“延期”两个极端。

3. 第三家公司我开始做“减法”
带着前两家公司的教训,我到了第三家,这次是一家做企业协同办公平台的公司,开发团队大约80人,服务的是几百家百人以上的中大型客户。这个项目的特殊之处在于,客户的业务复杂度很高(组织架构多层级、权限体系精细、审批流可配置),但留给我们的交付窗口非常窄:合同签的是4个月后上线,误差容忍是两周。如果全面铺开测试,光是权限相关的组合场景就超过500种,全部跑一遍至少需要30个工作日。
这一次,我决定做减法。不是偷偷地做、心虚地做,而是把“不做哪些测试”变成一个正式的决策议题,放到和客户、PMO 一起讨论的台面上。这个决定本身是有风险的,客户可能会质疑我们的专业度。但事实证明,当我们用“风险导向”的逻辑去沟通时,客户的理解程度远超我们的预期。这段具体的操作方法和沟通策略,我会在本文第四部分详细展开。现在你只需要知道一个结果:这个项目我们砍掉了大约45%的测试用例,按时上线了系统,上线后第一个月的线上缺陷数是3个,且均为低优先级的展示类问题,无任何核心业务阻断。
三次经历,三个阶段的认知跃迁:第一阶段,我不知道自己在做无效测试;第二阶段,我被迫承受无效测试的后果;第三阶段,我终于学会了主动管理测试范围。如果你也在这条路上挣扎,我希望你跳得比我快一些。
三、两个最常见的误区,坑过90%的瀑布团队
1. 误区一:把“测试覆盖率”等同于“质量保障”
测试覆盖率是软件工程中最容易被误用的度量指标之一。它告诉你你的测试用例覆盖了哪些代码行、哪些需求条目、哪些功能点,但它不告诉你这些覆盖是不是覆盖在了正确的位置上。用军事来打比方:你可以用步兵覆盖一个战场的每一平方公里,但如果你的情报有误、敌人集中在东北角,你的全面布防和全面失败几乎同义。
我在第二家公司做电商SaaS的时候经历过一次非常典型的例子。当时项目最终测试覆盖率做到了94%,项目经理在周报里专门标绿了这项指标。但上线后第一个月我们收到的客户报障中,有超过60%集中在一个模块,促销规则引擎。这个模块几乎每一周都有新的业务需求变更,而我们却把最多的测试资源投给了积分体系(逻辑相对稳定、改动很少),因为积分体系的用例数量多、容易堆高覆盖率。测试覆盖率数字好看,但它掩盖了一个致命的资源错配:你测的都是最不容易出问题的地方。
更隐蔽的问题是,测试覆盖率在瀑布模式下会催生一种“考核驱动”的畸形行为。测试人员在最后冲刺阶段,如果发现覆盖率达不到目标值,天然的倾向是把那些“容易测、不会发现Bug”的用例大量堆上去,比如前端的按钮样式校验、列表页的分页跳转、纯展示类文案的检查。这些用例跑起来快、不依赖复杂环境、通过率接近100%。于是你的周报上覆盖率达标了,但核心业务路径的测试深度却因为时间被挤占而大幅下降。

我现在的判断标准很简单:不看覆盖率,看逃逸率。具体来说,我关心的是“高风险模块上线后发现了多少个缺陷”,而不是“所有模块的用例执行率达到多少”。如果计费模块的线上缺陷逃逸率为零,哪怕整个系统的测试覆盖率只有65%,我也认为这次测试是成功的。反过来,如果非核心的UI模块所有用例全过、但支付逻辑出了一个致命Bug,你的99%覆盖率在客户看来等于0。
2. 误区二:认为“不做全面测试”等于“不做测试”
这是我最想澄清的误解。每次我在分享中提出“主动放弃全面测试”这个观点时,总会有人在问答环节问:“所以你是主张少测甚至不测吗?”这个问题的答案恰恰相反:我是主张把测试做得更聪明、更尖锐、更致命。放弃全面测试不是放弃测试,而是放弃那种“漫无目的地撒网”的测试策略。
让我用两种测试策略的对比来把这个区别讲清楚。
| 对比维度 | 全面测试策略 | 风险驱动测试策略 |
|---|---|---|
| 资源分配逻辑 | 按功能点或需求条目平均分配 | 按模块的业务风险等级集中投入 |
| 测试深度差异 | 高风险和低风险模块深度趋同 | 高风险模块深度覆盖、场景穷尽式验证 |
| 低风险模块处理方式 | 和核心模块同标准执行全量用例 | 仅执行冒烟测试或依赖代码审查和CI验证 |
| 典型结果 | 覆盖率虚高,核心模块测试时间被稀释 | 覆盖率较低,核心模块被反复穿透验证 |
| 测试用例总数 | 往往超过2000条 | 通常控制在800-1200条 |
| 测试执行总耗时 | 4-6周 | 2-3周 |
看清楚这个对比之后,你就能理解我说的“更尖锐”是什么意思。风险驱动测试不是测试做少了,而是把那些在低风险区域上消耗的人力工时,转移到了高风险区域的深度验证上。同样是测试三周,一个团队把时间分散在2000条用例上,每条用例平均深度很低;另一个团队只跑800条,但每条都经过多轮次的场景变异、数据组合和边界试探。后者发现的核心缺陷数量,通常远高于前者。
再说一个更直白的比喻。全面测试像是一个安检员在机场对每个旅客都做同样的例行检查,摸一下口袋、扫一眼行李,100%覆盖但深度不足。风险驱动测试像是情报驱动安检,安检员提前知道哪几个航班有风险信号,对这几个航班的人做开箱检查、鞋底扫描、防爆测试,其他航班只做最基础的金属探测。哪种做法更能防住真正的威胁?答案不言自明。
四、可执行的减法:我验证过的风险和优先级评估体系
聊完了“为什么”,这一部分我们来聊“怎么做”。我需要先给你一个坦诚的交待:不做全面测试的前提,是你有一套经得起推敲的评估体系来支撑你的“减法决策”。你不能拍脑袋砍用例,那叫赌博,不叫策略。下面这套方法,是我在第三家公司总结和迭代出来的,它不复杂,但执行起来对团队的分析能力和沟通能力有一定要求。
1. 第一步:在需求阶段就画出你的风险地图
瀑布模型有一个被严重低估的优势:它给了你一段集中的需求分析时间,而这段时间恰好可以同步完成风险标注。很多团队把需求阶段全部用在了功能澄清和UI确认上,完全没有从风险视角审视那份需求规格说明书。等到编码快结束、测试计划要开始写了,才匆匆忙忙凭直觉做一遍分类。那时候已经晚了,因为你已经投入了大量开发资源,任何功能在你眼里都变得“不能不做、不能不测”。
正确的做法是:在需求评审的同时,由测试负责人或质量架构师牵头,对每一个用户故事或功能特性做一轮正式的风险评估。我不建议用复杂的公式或工具,一张简单的风险评估矩阵表就够了。评估两个维度:
- 影响严重性:如果这个功能出错了,对客户业务的冲击有多大?从5(数据丢失、资金损失、合规违规)到1(纯展示瑕疵、无业务影响)逐级打分。
- 发生概率:根据功能的技术复杂度、外部依赖数量、历史变更频率等因素,判断它出错的概率。同样从5(新开发的复杂算法、多系统交互、无历史参照)到1(成熟的代码库、逻辑简单单一、多年稳定运行)。
两项相乘,得到这个功能模块的风险值。25分和16分是高危,9到15分是中危,8分及以下是低危。这个打分过程必须邀请产品和开发负责人参与,而不能只由测试团队闭门完成。因为产品经理知道哪个功能是客户采购决策中的关键需求,开发负责人知道哪个模块的技术栈最不稳定。三方信息对齐之后,你画出的风险地图才是一张有共识基础的地图。

2. 第二步:给不同风险等级匹配完全不同的测试策略
风险地图画好之后,策略匹配就变得异常直接。我用的是一套三级策略,每一级都有明确定义,不给模糊空间:
(1)高危模块:执行“战术饱和打击”
对计费、支付、权限、核心交易链路这类模块,不仅不能省测试,反而要比你原来计划的测得更深、更狠。具体做法包括:
- 需求阶段就启动测试设计:不等编码完成,测试人员在需求冻结后立刻开始设计用例。这个过程会反向检验需求的完整性和一致性,开发还没动手,测试就已经在挑战业务逻辑的边界了。
- 强制要求开发侧提供单元测试:高危模块的代码提交必须附带对应的单元测试,并在CI流水线中自动执行。单元测试不是终点,而是确保“测试团队拿到的是一个基本功能已验证过的版本”。
- 分配最有经验的测试人员:不要让新人对付核心计费逻辑。高危模块的测试必须是团队里经验最丰富的那一两个人,他们能在探索性测试中嗅到深埋的逻辑漏洞。
- 做场景组合变形:对于计费这类模块,我要求测试人员不仅要跑正向用例,还要故意构造数据冲突,同一订单在多个促销规则下同时匹配、同一账户在近乎零余额时触发自动扣款、退款中再次被扣款。这类场景在需求文档里通常是不会单独列出的,但恰恰是线上故障的高发地带。
(2)中危模块:执行“有限深度验证”
这类模块的业务价值中等、出错影响可控、或者出错后有简单的降级或兜底方案。测试策略可以大幅简化:主路径全量覆盖,异常路径只验证最高频的3种情况,不追求穷尽。时间上控制在每个中危模块3到5个测试人天。
(3)低危模块:执行“哨兵式监控”
这是最容易被过度测试的重灾区。我的做法很直接:原则上不安排独立的功能测试资源。低危模块的质量保障主要依赖三道防线:第一道是开发自测(主路径跑通),第二道是代码审查(由资深开发扫一眼关键逻辑),第三道是CI流水线中集成的冒烟测试套件(自动化跑一遍核心接口)。上线后通过监控告警来兜底,如果有问题,快速回滚或热修复。

这套三级策略在第一线执行时,最大的阻力不是不理解,而是“政治正确”的压力。测试人员会本能地觉得:“我就算只给低危模块做最基础的冒烟测试,万一上线出了一点点问题,担责的不还是我吗?”这个顾虑非常真实,我完全理解。所以接下来要说的第三步,比技术分析更重要。
3. 第三步:用风险披露代替测试报告,把决策责任透明化
传统的瀑布测试流程中,测试经理在测试结束后要出具一份测试报告,内容不外乎:计划多少用例、执行了多少用例、通过率如何、残余缺陷有多少。这份报告隐含着一个前提假设:测试团队对质量负全责。但这个前提本身就是错的,质量是产品、开发、测试三方共同构建的,任何一方都不可能单独承担全部责任。
我把测试报告改成了风险披露报告。报告的格式并不复杂:
- 已测试的高危区域及验证结论:我们深度验证了哪些核心链路,结论是什么。
- 未测试或浅度测试的区域清单:明确列出哪些模块我们只做了冒烟测试甚至未安排测试资源。
- 每个未深度测试区域的业务影响评估和兜底方案:比如“消息推送模块只验证了主路径,未覆盖极端并发场景,已有监控告警覆盖,若出现延迟可通过降级开关关闭非关键通知”。
- 上线建议及风险接受声明:测试团队基于以上分析给出的推荐意见,“建议上线”或“建议上线但需增加监控”或“不建议上线”。
这份报告不是测试团队在“甩锅”,而是在把隐性的风险显性化。它让项目经理、技术总监、甚至客户代表清楚地看到:我们不是没测完,我们是基于风险等级有策略地分配了测试资源。现在这些资源分配的结果摆在桌面上,是否接受残余风险、是否按期上线,这个决策不再由测试团队独自承担。
我在第三个项目中第一次使用风险披露报告的时候,项目总监看完沉默了几秒。然后他说了一句话让我记忆深刻:“这是我在这个项目里看到的第一份说实话的测试报告。”原来他心里一直清楚全面测试不现实,但他从来没有收到过一份敢于直面这个现实的正式文件。这份报告给了他作为决策者最需要的东西,不是100%的覆盖率承诺,而是清晰的风险边界和一个有依据的决策基础。
五、来自一线的数据:选择性测试和全面测试的实际差距
光讲方法论不够。我需要给你一些真实的数据对比,让你看到“不做全面测试”到底在项目交付上产生了哪些可衡量的差异。以下数据来自我第三家公司三个可对比的瀑布项目(均使用 PingCode 进行项目管理和测试管理,因此工时和缺陷数据有统一口径可追溯)。
| 对比指标 | 项目A(全面测试策略) | 项目B(半策略测试) | 项目C(风险驱动策略) |
|---|---|---|---|
| 功能模块总数 | 24个 | 22个 | 26个 |
| 测试用例总数 | 2180条 | 1650条 | 980条 |
| 高风险模块用例占比 | 22% | 38% | 68% |
| 测试执行总人天 | 96人天 | 74人天 | 52人天 |
| 延期天数 | 延期21天 | 延期7天 | 按时上线 |
| 上线后30天缺陷总数 | 14个 | 9个 | 3个 |
| 上线后严重缺陷数(P0/P1) | 3个 | 2个 | 0个 |
| 上线后缺陷中核心模块占比 | 71% | 44% | 0% |
这组数据至少说明了几件事,而且这几件事和我前面几部分的论述是高度一致的:
第一,测试用例总数和交付质量之间不是正相关关系。项目A用例最多、人天投入最大,但上线后的缺陷总数和严重缺陷数都是最高的。项目C用例最少,却实现了零严重缺陷交付。
第二,测试资源的分布方式比总量更重要。项目C把68%的用例投向了核心高风险模块,这个比例几乎是项目A的3倍。结果也很直接:项目A有71%的上线缺陷集中在核心模块,说明测试资源投错了地方,而项目C在核心模块上零缺陷逃逸。
第三,延期不会必然带来更高质量。项目A延期了三周,并没有换来更少的线上缺陷。因为在延期的那三周里,团队只是把更多时间消耗在了低风险区域的穷举验证上,表面上看用例执行得更多了,实际上并没有触碰真正需要深挖的逻辑分支。

我需要特别强调一下:这组对比不是实验室条件下的完美控制实验。三个项目面对的业务需求复杂度不同、团队人员配置有差异、客户侧的验收标准也不完全一样。所以在引用这些数据时,我不希望你理解为“项目C的方法绝对最优”,而是希望你看到一种显著的统计趋势:当你有意识地提高测试资源的集中度、主动放弃低风险区域的过度测试之后,项目按期交付的概率上升了,核心模块缺陷逃逸的概率下降了。这个趋势,在我后来的多次实践中不断被印证。
六、不同场景下的行动指南:做减法要因时因地制宜
到这里,我们已经把风险驱动测试的理念和方法讲清楚了。但我知道,任何一个方法论在不同场景下都面临适配问题。以下是我根据多年项目经验,梳理出的四种常见场景以及对应的测试策略调整建议。你可以对照自己当前身处哪种场景,来决定“减法”的力度和方向。
1. 场景一:内部管理系统 / 后台运营工具
特征:用户量小(多为内部员工)、出错影响可控、无直接商业损失、可接受快速修复。
测试策略:这是最适合大胆做减法的场景。我的建议是只对涉及数据持久化(增删改正确性)、权限控制(不能越权访问)的模块做深度测试,其他一切功能模块走冒烟测试加开发自测的路径。用例总数可以压缩到同等规模电商项目的40%以下。
典型风险控制手段:建立快速回滚机制。内部系统对停机容忍度较高,一旦线上出现问题,5分钟回滚比1000条测试用例更有效。另外,给内部用户提供“问题反馈直达开发”的快速通道,他们是你的免费探索性测试力量。
2. 场景二:B端 SaaS 产品(百人以上组织使用)
特征:多租户、权限复杂、客户付费、有合同约束和SLA条款。
测试策略:这个场景下做减法需要更审慎。你必须保证与计费、数据隔离、权限校验、核心业务流程相关的模块接受饱和式测试。但与此同时,大量的配置页面、报表展示、辅助工具型功能,仍然可以降级处理。我在第三家公司使用的 PingCode 就是类似场景,产品服务的是数百家中大型企业客户,组织架构的复杂度和权限矩阵的精细度远超一般SaaS产品。测试资源分配上,我们把将近70%的精力投给了权限体系、工作项流转引擎和多级协作逻辑这三块,而仪表盘展示、个人工作台、消息通知等模块全部走低强度验证路线。
特别提醒:SaaS 产品有一个额外风险点,版本升级对存量客户的影响。建议在每次发布前,针对TOP5的标杆客户(按付费金额或合同条款严格度排序)做专项回归验证,确保这些客户的典型配置场景不被新版本破坏。这个动作占用的测试资源不大,但对客户续约率和信任度的维护价值极高。
3. 场景三:面向C端消费者的产品
特征:用户基数大、操作路径分散、舆论风险高、故障扩散极快。
测试策略:面向C端的产品在“不做全面测试”这件事上其实有天然优势,但这个优势不在测试环节,而在灰度发布和功能开关。C端产品比企业软件更容易实现小范围灰度验证:新功能上线先开1%的用户,观察核心指标和错误日志,没问题再逐步放量到5%、20%、100%。这种策略可以把“全面测试”的压力从测试环境释放到生产环境的一部分用户身上,同时将潜在风险控制在极小范围内。
但需要补充一点:支付、登录、交易闭环这三个环节在任何情况下都不能做减法。C端用户对钱和个人信息的敏感度远高于B端客户联系人,一次支付异常可能在社交媒体上迅速发酵。在这三个环节上,你不仅要做全量正向用例,还要投入专门的模糊测试和安全测试资源。
4. 场景四:强监管行业产品(金融、医疗、政务)
特征:合规要求严格、审计追溯必须完备、事故可能承担法律责任。
测试策略:我必须坦率地告诉你,在强监管行业里,“不做全面测试”这句话不能随便说。合规要求往往明确规定了测试覆盖率的底线,这是硬约束,不是你能博弈的范畴。但你依然可以有所作为,在满足合规底线的前提下,把额外的测试资源向高风险区域倾斜,而不是把所有合规要求以外的资源都撒在低风险区域上。
以金融行业为例,监管通常要求需求追溯矩阵和测试用例之间有完整的映射关系,但并没有规定每条映射必须有同等深度的测试。你的合规底线是“每条需求至少有一条用例覆盖”,这很容易做到。在此基础之上,你可以把大量的人力小时投入到涉及资金清算、风险评级、反洗钱规则、账户余额变化等核心链路的高强度测试中,而对例如前端的客户信息查询界面、报表导出格式、非核心类通知推送等模块保持最基础的验证深度即可。

七、在“测”与“不测”之间,每一步取舍都要回答三个问题
方法论讲完之后,我还想留给你一个可以直接用在项目决策中的思维框架。任何时候当你面临一个功能模块要不要深入测试、测到什么程度的决策时,你可以问自己(或者说服团队一起回答)这三个问题:
1. 这个功能如果出错了,最坏的结果是什么?
这个问题拷问的是影响严重性,但它要求你具象化思考,而不能停留在“会影响用户体验”这种模糊的表达上。“最坏的结果”必须是具体的、可衡量的:是产生一笔负金额订单导致财务追款?是客户数据错乱引发合规投诉?还是某个页面样式错位让产品经理抱怨几句?把结果具象化之后,决策的焦虑感会大幅下降,因为你会发现绝大多数功能的最坏结果是可接受的,只有少数几个功能的失败会触发你无法承受的连锁反应。为那几个功能倾尽全力,剩下的随它去。
2. 如果我们不深度测试这个功能,我们有其他兜底手段吗?
这个问题帮助你识别替代性保障机制。兜底手段的形式多种多样:上线后的实时监控告警、特定功能的降级开关、数据库的变更审计日志、甚至可以是一份简单的“出现问题后人工处理的SOP”。我在内部管理系统项目中,大量依赖的就是最后一种,人工兜底在用户量小、业务节奏慢的场景下是性价比极高的替代方案。一个有经验的后端开发,在收到告警后5分钟内查询日志、定位问题、手动修复数据,这个效率远远高于测试团队花费3天时间去穷举一个极不可能发生的边界场景。
3. 不做这个测试,上线后出了问题,我们有能力多快响应?
这个问题评估的是团队的运维成熟度和应急响应能力。一个关键前提是:你的持续交付基础设施是否支持快速回滚?你的热修复流程是几分钟还是几天?你的错误日志是聚合可查询的还是散落在各台机器上需要手工grep的?如果这些基础能力不健全,你的“不做全面测试”就是在走钢丝。反过来,如果团队有能力在发现问题后15分钟内完成回滚或热修复,那么很多测试风险是可以被运维能力所对冲的。这就是为什么在运维能力强的团队里,测试策略可以更激进而不会带来更多的线上事故。
这三个问题不是只在测试计划阶段回答一次就够的。我建议在每次迭代评审或项目里程碑检查时,都把这三个问题重新过一遍。因为随着开发进程的推进,你对某些功能的风险判断可能会发生变化,一个最初认为风险不高的模块,可能因为后期的需求变更或技术方案调整而变得脆弱了。持续的风险重评估,是确保你的减法决策始终成立的安全绳。

八、从今天开始,你可以做的三件事
读完这篇文章(如果能看到这里,感谢你的耐心),你可能已经认同了“不做全面测试也能交付”这个判断,但回到工位上,手里的项目日程表、测试计划模板、领导的预期,看起来一切都没有变。这就是知道和做到之间的鸿沟。
我没办法替你填平这道鸿沟,但我可以给你三个具体到明天就能动手的行动项。这三件事不需要你获得任何人的批准,不需要采购任何工具,不需要修改任何流程文档,它们只是你作为项目参与者可以主动选择的行为方式。
1. 在下一个迭代计划会议开始前,自己画一张风险地图
不要等团队给你安排,不要等PMO下发的模板。拿一张A4纸或者打开一个空的文档,列出下一个交付版本里所有的功能模块。按照我第四部分给出的两个维度,影响严重性和发生概率,给每个模块打上1到5分,然后乘出一个风险值。你会发现这个过程本身就在重塑你的判断:有些你以前觉得必须要测透的模块,算完分数之后你发现自己其实也说不出它为什么那么重要。
在迭代计划会议上,把这张风险地图摊开在桌上。你不一定需要说服所有人当场接受,但仅仅是让产品和开发看见这张图,就已经在改变讨论的质量。你会发现关于测试资源的对话,开始从“测了多少条用例”转向“测对了哪些地方”。
2. 选一个低风险模块,主动提议减少其测试投入
选一个项目里公认“即使出错了也不会死”的模块,可能是后台的一个批量导出功能、报表页面的一套筛选组合、或者用户一年也用不到三次的某个辅助小工具。在制定测试计划时,明确提议将这个模块的测试等级从一个完整的“功能测试”降为“冒烟测试加开发自测”。把你的理由书面化:这个模块的风险等级是低,业务影响小,有快速修复兜底,因此不必消耗测试资源。
这一步的价值不在于省下的那几天测试工时,而在于你在团队里种下了一个概念:测试资源是有限的,而有限资源的分配是可以讨论、可以不同意的。只要有一次这样的讨论发生了,并且上线后证明这个决定没有带来恶果,你的团队就往前迈了一大步。
3. 在下一份测试报告里,增加一个“未测试区域及风险评估”章节
不管你现在用的测试报告模板长什么样,在末尾加上一章。只写一段话也行。列出这一轮测试中哪些模块我们没有深入测试,没有深入验证的原因是什么,对上线后的业务风险预估是多大,以及建议的兜底措施是什么。
你不要低估这段话的力量。当“未测试”这件事被白纸黑字地写进正式文档,并且附带了有理有据的风险评估时,它就从一种“我们没做完”的失败叙事,转变成了“我们做了策略性取舍”的专业判断。这不仅是在向干系人透明化风险,更是在帮整个团队建立一种更成熟的质量认知:质量不是靠测掉每一个用例来证明的,质量是靠精准识别并控制关键风险来构建的。
九、写在最后:少测一点,多交付一些
我写这么多,不是想劝你变成一个轻视测试的人。恰恰相反,我在整个职业生涯中始终尊敬那些对质量近乎偏执的测试工程师。他们会在周五晚上抓着一个深埋的并发Bug不放,会让开发改到第七版才点头放行,会在评审会上顶着上线的压力坚持自己的判断,这些人是软件行业质量的脊梁。
但我同样看到了一面不被常谈论的事实:当测试资源被宣称要“全覆盖”的时候,它反而什么都覆盖不好。那些最需要深度验证的核心逻辑,往往因为测试周期被低风险区域的用例消耗殆尽,而只得到了浅层的例行公事。而那些被反复测试的辅助功能,上线三五年可能都等不到一次真实的用户故障。这不是测试团队的错,这是瀑布模式在资源分配上的结构性缺陷。
所以我的最终建议其实不是关于“要不要全面测试”的,它是关于“你敢不敢诚实地面对自己项目的风险边界”。如果你敢,你会发现你需要做的测试比你以为的要少得多;你省下的时间比你以为的要多得多;而你的交付质量,并不会因此下降。你会开始按期上线,开始收到客户对交付速度的认可,开始在复盘会上谈论“风险决策”而不是“Bug数量”。
少测一点,多交付一些。不是偷懒,而是把力气花在真正值得的地方。
如果你正在筹备下一个瀑布项目的测试计划,而这篇文章里的某些判断让你感到认同或不认同,我都建议你找一个安静的时间,把你当前项目的功能列表调出来,对着它问一遍那个最朴素也最锋利的问题:如果这次我只测40%,我会选测哪40%?那个答案,就是你真正应该用力守护的东西。
常见问题解答(FAQ)
1. 不做全面测试,瀑布项目真的能安全交付吗?
我所在的项目组一直用瀑布模型,每次都要做大量测试才能放心上线。最近听说有人主张不做全面测试也能交付,这听起来太反常识了,难道不会出大问题吗?到底什么情况下可以冒这个风险?
先说结论:在资源有限、周期固定的瀑布项目中,追求100%的全面测试反而可能导致更严重的延期和质量事故。我亲身经历过一个内部管理系统项目,原计划3个月,测试阶段占了1个月,结果因为平均分配测试资源,核心的权限模块只测了表层功能,上线第一天就爆出重大越权漏洞,紧急修复花了3天。
教训是:全面测试不等于有效测试。后来我们改用风险驱动测试,先绘制风险地图,把影响严重性×发生概率高的模块(比如支付、权限、计费)列为高风险,投入80%的测试资源做深度快测;低风险模块(比如报表导出、日志查看)只做冒烟测试+代码走查。
最终项目按时交付,高风险模块零故障,低风险模块出现2个小Bug,后续热更新修复。所以关键不是不做测试,而是策略性地选择测试范围。
2. 怎么判断哪些测试可以砍掉,哪些必须保留?
每次做迭代规划时,我都纠结哪些功能需要重点测、哪些可以放一放。公司给的测试时间就那么多,如果按传统思路每个模块都测一遍,核心功能反而测不细。有没有一套简单可用的判断标准,让我能快速决策?
我总结了一个四象限评估法。开一个30分钟的评审会,产品、开发和测试一起给每个功能模块打分:影响严重性(1-5分,从少量用户不便到核心业务瘫痪)和发生概率(1-5分,基于历史缺陷密度和需求变更次数)。然后画个四象限:高风险高概率(评分乘积>=16)必须深度测试,编写详细测试用例+探索性测试;
高风险低概率(8-15)做关键路径测试+代码审查;低风险高概率(8-15)做常规功能测试+CI集成验证;低风险低概率(1-7)只做冒烟测试。
举个例子:一个报销系统的“发票识别”模块影响严重性5(识别错了报销就错了),但概率2(已有成熟SDK),乘积10,归为第二类,我们没做全量发票类型测试,只测了最常见的3种格式,加上SDK单元测试,上线后一切正常。
而“用户登录”模块影响严重性5,概率4(经常改密码规则),乘积20,是重中之重,我们花了整队40%的测试时间。这个方法帮团队减少了30%的测试总时长,且故障率几乎没有变化。
3. 如果只做部分测试,上线后出Bug谁来负责?团队内部会不会互相甩锅?
我们团队之前因为测试不全出过一次线上事故,开发说测试没测到,测试说开发代码质量差,最后谁也不认账。如果主动放弃全面测试,这种责任划分问题会不会更严重?怎么避免团队内耗?
这个问题非常现实。我的做法是:在项目启动阶段就和领导、团队签一份《风险接受协议》。具体来说,在风险评估会议上,我们输出一张“测试决策表”,明确每个模块的测试等级、故意省略的测试范围、以及对应的风险等级。
比如一个内部知识库的搜索功能,我们评估风险低(产品影响小,用户少),决定只测“按标题搜索”这一种场景,省略“按正文关键词高亮”的边界测试。这个决策由产品负责人、技术负责人和测试负责人三方签字确认。上线后即使出Bug,也不是某一个人的锅,而是集体决策的后果。
更重要的是,我们要在迭代回顾会上复盘这些“放弃”的测试:有没有导致预期外的事故?如果有,下次就把这个模块的风险等级调高。没有事故,说明决策正确,团队会更信任这个流程。我经历过3个这样的项目,团队反而因为明确的责任边界减少了甩锅,因为每个人都知道风险在哪里、为什么做这个取舍。
4. 有没有真实的公司案例,证明不做全面测试的瀑布项目成功了?
网上大部分文章都在强调测试左移、全面覆盖的好处,很少看到有人分享‘不全测’还成功的真实案例。我想知道有没有知名的企业或者中小团队,在瀑布模型下用策略性测试拿到过好结果?最好有具体数据。
我直接讲一个自己辅导过的案例。一家做医疗SaaS的创业公司,30人团队,用瀑布模型开发一个诊所管理系统的2.0版本,周期4个月。他们最初计划:前3个月开发,最后1个月全面测试。但第2个月时客户要求提前1个月交付(原因是政策窗口期)。如果按原计划,测试要砍到2周。
测试负责人找到我,我们一起做了风险驱动测试调整。核心结果:交付周期缩短25%(从4个月到3个月),测试工作量从原来的480人时降为240人时。质量表现:上线后前30天,高风险模块(电子病历、医保结算)0个严重Bug;
低风险模块(消息通知、排班显示)一共出现11个Bug,其中8个在当天通过热修复解决,3个留到2周后的补丁版本。客户满意度反而提高了,因为核心业务一次都没断过。对比之前的1.0版本(全面测试用了6周,但还是有3个P0级Bug导致停服),验证了策略性测试的有效性。
这个案例说明:不是全面测试让项目安全,而是把好钢用在刀刃上让项目成功。记住一个公式:测试ROI = (严重缺陷发现数×修复成本节省) / 测试投入。当你的测试资源有限时,优化ROI比追求覆盖率更聪明。
核心关键词
文章包含AI辅助创作:不做全面测试,瀑布项目也能交付,发布者:fiy,转载请注明出处:https://worktile.com/kb/p/3978600
微信扫一扫
支付宝扫一扫
读者评论
作为测试经理,这篇文章让我松了口气。我们团队一直被‘覆盖率必须90%以上’的KPI压着,结果就是疯狂补低风险用例,核心业务反而测不透。上次因为计费模块测得不深,上线后出了大问题。现在想想,文中说的‘风险导向测试’才是正解,把资源砸在最要命的地方,比表面上的100%覆盖率有价值得多。不过,要说服老板和客户砍用例,还得靠数据说话,这点文章里的对比图很有说服力。
说实话,看完第一反应是:这不就是偷懒的借口吗?但仔细想想,我在瀑布项目里的确见过太多‘为了测而测’的浪费时间。开发写完代码,测试花几周跑那些几乎不可能触发的边界用例,最后上线出Bug的还是核心逻辑。不过,我还是担心:万一‘低风险’的判断失误怎么办?文中说用逃逸率来评判,但逃逸率也是事后才知道的。风险评估本身就需要经验,新手团队可能更容易踩坑。
作为被延期逼疯过的项目经理,这篇文章简直说出了我的心声。每次测试说‘还要三周’的时候,我都想咆哮:为什么写代码的时候不测?但瀑布就这样,测试被压到最后。文中那个‘大爆炸式测试’的案例太真实了,我们上次因为一个核心Bug被迫延期,错过了推广窗口。后来学乖了,让测试在编码阶段就介入关键模块,虽然不算正式流程,但确实有效。不过,完全砍掉60%用例还是太激进,我可能只敢砍30%。
作为甲方,看到这个标题差点血压升高,不做全面测试?这不是糊弄我们吗?但读完文章,我发现人家说的‘放弃’是有前提的:把测试资源集中在核心业务上,而不是撒胡椒面。想想我们自己的项目,经常是验收测试跑了一堆界面样式、文案的用例,真正影响业务的支付、权限反而没怎么深挖。如果能用数据和风险矩阵沟通,我倒觉得可以接受。毕竟,按时上线一个核心稳健的系统,比延期三个月找一个完美但有Bug的版本要好。