ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

测试目标定义:从业务风险倒推测试范围的核心方法

测试目标定义:从业务风险倒推测试范围的核心方法 1. 先搞清楚“测什么”比“怎么测”重要一百倍做测试这行十来年我见过太多团队在“怎么测”上砸了重金——买设备、搭环境、写脚本、跑流水线一套组合拳打得虎虎生风结果一问“你们这套测试到底在测什么”会议室里瞬间安静。这不是段子这是每天都在发生的真实场景。测试用例写了上千条覆盖率报告绿得发亮上线之后用户该骂还是骂问题该漏还是漏。根子不在执行层面在于一开始就没把“测什么”这件事想透。“写在前面这套测试到底在测什么”这个标题乍看像是一篇测试方案的开篇引言但它其实戳中了整个质量保障体系里最容易被跳过、也最致命的一环——测试目标的定义与对齐。不管你是做软件测试、硬件验证、算法评测还是做一碗牛肉面的品控只要涉及“验证某个东西是否达标”你就绕不开这个问题你手里的这套测试到底在测什么它测的是功能对不对还是性能稳不稳是测单点极限还是测系统在真实场景下的综合表现是测“能不能用”还是测“好不好用”这些问题的答案不同测试方案的设计逻辑会完全不同。这篇文章适合谁看如果你是刚接手一个测试项目的工程师面对一堆现成的用例和报告心里犯嘀咕“这些东西到底在证明什么”那这篇就是写给你的。如果你是技术负责人团队汇报测试结果时你总觉得哪里不对但又说不上来这篇也能帮你理清思路。甚至如果你是产品经理想搞清楚研发口中的“测试通过了”到底意味着什么读下去也会有收获。我不打算讲什么高深的理论框架就从实际项目里踩过的坑、吵过的架、返过的工出发把“测什么”这件事拆开揉碎聊清楚。2. 测试目标模糊的四种典型翻车现场2.1 用例全绿但线上崩了覆盖率陷阱先说一个我亲身经历的项目。那是几年前的一个电商促销系统测试团队非常勤奋写了将近两千条用例每次回归测试全部通过覆盖率报告显示行覆盖率达到92%分支覆盖率85%。从数据上看这套测试堪称模范。结果大促当天系统在流量峰值到来后十分钟内就出现了订单丢失的问题。事后复盘发现所有用例都在验证“单个用户下单流程是否正确”没有任何一条用例在验证“一万个用户同时下单时订单状态同步机制是否可靠”。覆盖率再高测的都是单点逻辑而线上崩的是并发场景下的状态一致性。这就是典型的覆盖率陷阱团队把“测试覆盖了多少代码”当成了“测试覆盖了多少风险”。代码覆盖率高只说明你的用例执行到了大部分代码路径但不代表你验证了这些路径在真实压力下的表现。测什么测的应该是风险而不是代码行数。一个支付模块哪怕只有五百行代码如果它涉及资金安全那它的测试深度就应该远超一个五千行的日志打印模块。把测试资源和覆盖率数字挂钩而不是和业务风险挂钩是“测什么”这个问题上最常见的跑偏。2.2 性能测试跑了个寂寞指标选错的代价另一个经典场景是性能测试。很多团队做性能测试的流程是这样的搭一个压测环境用工具打一波流量看TPS和响应时间出一份报告结论写“系统满足性能要求”。但你问他“满足谁的要求什么要求”往往答不上来。我见过一个项目性能测试报告显示平均响应时间200毫秒团队欢天喜地地上线了。结果用户投诉页面加载慢一查发现200毫秒是API网关的平均响应时间而用户实际感受到的页面加载时间包含了前端渲染、图片加载、第三方接口调用等环节真实体感超过五秒。问题出在哪出在测试指标和用户体验指标脱节。这套性能测试测的是“服务端处理请求的速度”但用户关心的是“我点一下到看到结果要多久”。这两个指标之间有巨大的鸿沟。测什么应该测的是端到端的用户体验指标比如首屏渲染时间、可交互时间、完整加载时间而不是只盯着服务端的TPS。当然服务端指标也要看但它应该是辅助定位问题的工具而不是测试的终极目标。2.3 安全测试只跑了扫描器漏掉的逻辑漏洞安全测试领域也有类似的“测什么”困境。很多团队的安全测试就是跑一遍自动化扫描工具看看有没有SQL注入、XSS这些常见漏洞报告出来没有高危问题就算过关。但真正导致数据泄露的往往不是这些扫描器能发现的通用漏洞而是业务逻辑层面的安全缺陷。比如一个优惠券系统扫描器不会告诉你“用户可以无限次领取同一张优惠券”是一个漏洞因为从技术上看这个接口的输入输出都是合法的。但从业务逻辑上看这是一个严重的越权问题。自动化扫描器测的是“代码层面的已知漏洞模式”而安全测试真正应该测的是“攻击者能否利用业务逻辑缺陷获取不正当利益”。这两者之间的差距就是“测什么”没有定义清楚导致的。安全测试的目标不应该是“扫描器没报高危”而应该是“梳理清楚系统的信任边界和关键业务逻辑验证是否存在可被利用的路径”。2.4 兼容性测试的“设备墙”迷思再说一个移动端测试的常见问题。团队买了一面“设备墙”上面摆了几十台不同型号的手机每次发版前在每台设备上手动点一遍核心流程就算完成了兼容性测试。听起来很扎实对吧但问题是这几十台设备是怎么选的往往是“市面上卖得好的”或者“手头正好有的”。结果呢用户反馈的兼容性问题偏偏出现在一台三年前的低端机型上而这台机型恰好不在设备墙上。兼容性测试测什么不是“测尽可能多的设备”而是“测目标用户实际使用的设备分布中的关键区间”。你需要知道你的用户里有多少比例在用低端机、多少在用高端机、多少在用折叠屏、多少在用平板。然后根据这个分布去选择测试设备的覆盖策略。测什么测的是用户真实使用环境下的表现而不是测试团队手头有什么设备。3. 从业务目标倒推测试范围一个可落地的拆解方法3.1 先回答三个问题谁用、怎么用、坏了会怎样要搞清楚“测什么”最有效的方法不是从技术出发而是从业务出发。我习惯在项目启动测试之前先拉着产品、研发、运维一起回答三个问题。第一个问题谁在用这个系统是内部员工还是外部客户是普通消费者还是专业操作人员不同用户群体的技术水平和容错能力完全不同。第二个问题他们怎么用是每天高频使用还是偶尔用一次是在稳定的办公网络下用还是在弱网环境下用是单人操作还是多人协作第三个问题如果坏了会怎样是用户看到错误提示重试一下就行还是会导致资金损失、数据泄露、甚至人身安全风险这三个问题的答案直接决定了测试的深度和广度。举个例子一个内部使用的报表系统用户是财务人员每天上班用坏了顶多是晚半天出报表那测试的重点就应该放在数据准确性和导出格式上性能和安全可以适当降低优先级。但如果是一个面向公众的支付系统用户是消费者坏了会导致资金损失和信任崩塌那测试就必须覆盖高并发、安全渗透、数据一致性、故障恢复等全方位场景。测试范围不是拍脑袋定的是从业务风险倒推出来的。3.2 用风险矩阵给测试范围排优先级回答完上面三个问题之后我会把识别出来的风险点放进一个简单的矩阵里。横轴是“发生概率”纵轴是“影响程度”每个风险点根据这两个维度打分然后决定测试投入。影响程度高、发生概率也高的必须做深度测试包括正常场景、异常场景、边界场景。影响程度高但发生概率低的至少要做一次验证性测试确保基本可用。影响程度低但发生概率高的可以做自动化回归保证不被频繁的变更破坏。影响程度低、发生概率也低的可以暂时不测或者只做冒烟测试。这个矩阵的价值在于它把“测什么”从一个模糊的讨论变成了一个可量化、可排序的决策过程。团队不用再争论“这个功能要不要测”而是看它在矩阵里的位置。当然打分的过程需要经验判断但至少大家有了一个共同的讨论框架。我通常会用下面这个表格来辅助决策风险等级发生概率影响程度测试策略举例极高高高深度测试自动化混沌工程支付扣款、订单创建高低高验证测试定期回归数据恢复、灾备切换中高低自动化回归监控告警日志上报、埋点采集低低低冒烟测试或暂不测试关于页面、帮助文档3.3 把“测什么”写成一句话贴在墙上我有个习惯每接手一个测试项目都会用一句话概括这套测试的核心目标然后把它写在测试计划的最前面甚至打印出来贴在工位上。这句话的格式通常是“这套测试的目的是验证【系统名称】在【特定场景】下能够满足【具体指标】确保【业务价值】不受损。”举个例子“这套测试的目的是验证订单系统在大促峰值流量下能够满足99.99%的请求成功率且平均响应时间低于500毫秒确保用户下单体验不受影响。”这句话一写出来测试的重点就清晰了大促峰值流量、请求成功率、响应时间、下单体验。所有测试用例的设计、测试环境的搭建、测试数据的准备都围绕这句话展开。如果某个用例跟这句话没关系那它就不应该出现在这套测试里。这个方法听起来简单但我见过太多团队连这一句话都写不出来。写不出来就说明“测什么”根本没想清楚。所以如果你现在手上正有一套测试方案不妨先试着用一句话概括它的目标。如果概括不出来那问题可能比你想的要大。4. 不同测试类型下“测什么”的具体拆解4.1 功能测试测的是需求边界而非需求本身功能测试最容易陷入的误区是“照着需求文档一条条验”。需求文档写“用户可以修改昵称”测试就验“输入新昵称点击保存昵称变了”通过。但需求边界呢昵称长度限制是多少特殊字符允许吗修改频率有限制吗修改后其他关联数据会同步更新吗并发修改会怎样这些需求文档里往往没写但恰恰是bug的高发区。功能测试测什么测的是需求的边界和异常路径。正常路径当然要验但那只是及格线。真正体现测试价值的是当输入超出预期时系统是否优雅地处理了当操作顺序被打乱时系统是否还能保持一致当多个用户同时操作同一份数据时系统是否有正确的并发控制我通常会把一个功能拆成“正常路径、边界路径、异常路径、并发路径”四个维度来设计用例确保每个维度都有覆盖。4.2 性能测试测的是瓶颈和拐点而非平均值性能测试报告里最没用的数字就是“平均值”。平均响应时间200毫秒听起来不错但如果10%的请求响应时间是5秒90%的请求是10毫秒平均值也是200毫秒左右但用户体验是灾难性的。性能测试测什么测的是P95、P99分位值测的是系统吞吐量的拐点测的是资源消耗的瓶颈点。具体来说我会关注这几个指标在多少并发用户下系统的响应时间开始显著上升在多少TPS下CPU或内存达到瓶颈当依赖的数据库或缓存出现延迟时系统的降级策略是否有效这些信息才能帮助团队做出容量规划和架构优化决策。只报一个平均值的性能测试基本等于没测。4.3 安全测试测的是信任边界和权限模型安全测试的核心不是找漏洞而是验证信任边界是否清晰、权限模型是否严密。什么叫信任边界就是系统在哪些地方假设“输入是可信的”在哪些地方假设“用户是合法的”。每一个信任边界都是潜在的攻击入口。比如前端传来的用户ID后端是否验证了这个ID确实属于当前登录用户API接口是否校验了调用方的权限还是只依赖前端隐藏了按钮权限模型则是另一个重点。系统里的角色有哪些每个角色能访问哪些资源角色之间是否存在越权路径比如普通用户能否通过修改URL参数访问管理员页面A公司的用户能否查看B公司的数据这些问题的答案才是安全测试真正要验证的东西。自动化扫描器可以帮你发现一些技术漏洞但信任边界和权限模型的问题必须靠人工分析和针对性测试。4.4 兼容性测试测的是用户环境分布的关键区间兼容性测试的资源永远是有限的你不可能在所有设备、所有浏览器、所有操作系统版本上都测一遍。所以“测什么”的关键在于选择正确的覆盖区间。我的做法是先拉一份用户设备分布数据找出占比最高的前10个设备型号和前5个浏览器版本这些是必须覆盖的。然后找出占比虽然不高但属于“极端环境”的比如最低端的机型、最老的系统版本、最小的屏幕尺寸这些是风险最高的也必须覆盖。中间那些占比极低的设备可以通过云测平台做抽样验证。另外兼容性测试不只是测“能不能打开”还要测“核心流程是否完整”。比如一个电商App在低端机上打开首页可能没问题但进入商品详情页时因为图片加载过多导致卡顿甚至崩溃这就是兼容性问题。所以兼容性测试的用例设计应该围绕核心业务流程而不是孤立的页面加载。5. 测试目标与业务方对齐的沟通技巧5.1 用业务语言而不是技术语言描述测试目标测试团队和业务方沟通时最容易犯的错误是用技术术语描述测试目标。你说“我们要做接口的幂等性测试”业务方一脸茫然。你说“我们要确保用户重复点击提交按钮时不会产生两笔订单”业务方立刻点头。测试目标必须翻译成业务语言才能获得真正的理解和认同。我通常会在测试计划评审时把每个测试目标都对应到一个业务场景。比如“性能测试”对应“大促时用户能顺畅下单”“安全测试”对应“用户的个人信息不会被泄露”“兼容性测试”对应“不同手机的用户都能正常使用”。这样业务方才能判断这些测试目标是不是他们真正关心的有没有遗漏优先级对不对5.2 让业务方参与风险矩阵的打分前面提到的风险矩阵如果只由测试团队打分很容易出现偏差。测试团队可能高估某些技术风险低估某些业务风险。所以我会邀请产品经理和业务负责人一起参与打分。具体做法是把识别出来的风险点列出来让每个人独立打分然后对比差异。差异大的地方往往就是认知不一致的地方需要重点讨论。比如测试团队可能认为“数据库主从切换”是一个高风险项但业务方可能觉得“这个功能一年也用不到一次优先级不用那么高”。反过来业务方可能认为“用户头像上传失败”是个大问题因为客服每天收到大量投诉但测试团队可能觉得这只是个边缘功能。通过共同打分双方能对齐认知测试资源也能花在刀刃上。5.3 测试报告要回答“所以呢”而不是“是什么”测试报告是测试目标的最终呈现。但很多测试报告只写了“是什么”——执行了多少用例发现了多少bug覆盖率多少。业务方看完之后心里只有一个问题“所以呢我能上线吗”好的测试报告应该直接回答这个问题基于当前的测试结果系统的风险等级是什么有哪些已知问题这些问题对业务的影响是什么建议上线还是不上线我习惯在测试报告的开头写一段“结论先行”的摘要用业务语言告诉决策者这套测试验证了什么发现了什么结论是什么。后面的详细数据是支撑这个结论的证据。这样业务方不用翻完几十页报告才能找到答案沟通效率会高很多。6. 几个我踩过的坑和总结出的经验6.1 测试目标不是一成不变的项目在推进过程中业务需求会变技术架构会变用户行为也会变。所以测试目标不是定一次就完事了需要定期回顾和调整。我一般会在每个迭代结束时花半个小时和团队一起过一遍当前这套测试还在测我们最关心的东西吗有没有新的风险出现有没有旧的测试目标已经不再重要了有一次我们为一个功能做了大量的兼容性测试覆盖了各种浏览器版本。结果上线后发现用户主要通过移动端访问桌面浏览器的兼容性问题根本没人关心。这就是测试目标没有跟上业务变化的典型例子。后来我们调整了策略把兼容性测试的重点转移到移动端效率立刻提升了。6.2 不要追求“全测”要追求“测得准”测试资源永远是有限的追求“把所有东西都测一遍”是不现实的也是不经济的。与其追求测试的广度不如追求测试的精度。把有限的资源集中在高风险、高价值的场景上比撒胡椒面式的全覆盖要有效得多。我见过一个团队为了追求“测试覆盖率100%”花了大量时间给一些几乎不会执行的异常处理代码写用例。这些用例写完之后从来没有发现过任何bug因为那些代码路径在真实环境中根本不会触发。这就是典型的资源错配。测什么测那些真正会出问题的地方而不是那些看起来“应该测”的地方。6.3 测试目标要能被验证“确保系统稳定可靠”这种测试目标听起来很正确但没法验证。什么叫稳定什么叫可靠标准是什么如果测试目标不能被量化验证那它就只是一个口号没有实际指导意义。好的测试目标应该是具体的、可衡量的。比如“在1000并发用户下P99响应时间低于1秒”“在连续运行72小时后内存增长不超过5%”“在模拟断网30秒后系统能在10秒内自动恢复”。这些目标才能指导测试用例的设计和测试结果的判定。6.4 让开发参与测试目标的制定测试目标不应该由测试团队闭门造车。开发团队对系统的技术风险最清楚让他们参与测试目标的制定能帮助识别出测试团队可能忽略的技术风险点。比如开发知道某个模块最近做了重构虽然功能没变但内部实现变化很大那这个模块就应该被纳入重点测试范围。这种信息只有开发知道测试如果不主动问就会漏掉。我通常会在迭代计划会上专门留出十分钟让开发说一下这个迭代有哪些技术风险点然后测试团队据此调整测试重点。这个习惯坚持下来之后漏测率明显下降。6.5 测试目标要写下来不要只停留在口头最后一条经验也是最简单的一条把测试目标写下来。不要只是在会议上口头说说要形成文档让所有相关方都能看到、能回顾、能对齐。写下来的过程本身就是一个梳理思路的过程很多模糊的地方在写的时候就会暴露出来。而且当项目后期出现争议时一份明确的测试目标文档能帮你快速定位问题是目标定错了还是执行没到位我现在的习惯是每个项目的测试计划第一页就是“测试目标”章节用不超过200字说清楚这套测试要验证什么、不验证什么、优先级如何。这个章节会在项目启动会上和所有相关方过一遍确认无误后才开始后续的测试设计。这个小小的习惯帮我避免了很多后期的返工和扯皮。说到底“这套测试到底在测什么”这个问题答案不在测试工具里不在用例库里而在你对业务的理解和对风险的判断里。工具和用例只是手段搞清楚目标才是根本。希望这些从实战中摸爬滚打出来的经验能帮你下次面对这个问题时不再心虚。
返回列表