多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

高质量测试的12个步骤:从需求理解到资产沉淀的完整方法论

高质量测试的12个步骤:从需求理解到资产沉淀的完整方法论 高质量测试的12个步骤做测试这行越久越发现一个扎心的事实测试用例写得再多不如想清楚怎么测。很多团队天天喊着“保证质量”结果上线前还是被线上问题打脸。问题出在哪不是执行不够努力而是测试这件事本身缺少一套系统的方法论。这几年我待过几家不同类型的公司从传统软件到嵌入式硬件从纯手工测试到自动化测试框架搭建踩过的坑不少也逐渐沉淀出一套相对固定的打法。今天把这套“高质量测试的12个步骤”完整梳理出来它不是教科书里那种高高在上的理论而是我实际项目中真刀真枪用过、验证过的操作路径。这套方法适合谁如果你是刚入行的测试工程师它能帮你建立完整的测试思维避免上来就闷头写用例如果你是测试组长或技术负责人它可以直接作为团队测试流程的参考框架哪怕你是开发、项目经理看完也能理解一个“靠谱的测试”到底应该怎么推进。1. 测试前的认知对齐先想清楚再动手1.1 第一步理解需求从“用户视角”还原业务场景很多测试工程师拿到需求文档第一件事就是打开原型图开始写用例。这个习惯我强烈建议改掉。测试的起点不是用例而是需求理解。我见过太多因为需求理解偏差导致的返工。有一次我们测试一个订单导出功能开发实现的是导出当前筛选条件下的数据测试人员却按照“导出全部数据”来设计用例结果功能上线后销售部门反馈导出的数据不对。复盘时才发现需求文档里写的是“导出列表数据”但“列表”指的是经过筛选后的结果——这个隐含信息在需求评审会上口头提过测试当时没在场。怎么才叫真正理解需求至少要做到三点第一能用自己的话把业务流程讲清楚包括正常路径和异常路径第二能说出这个功能服务的用户是谁、使用频率如何、出问题会造成什么影响第三能识别出需求里没说但实际必须考虑的边界条件比如数据量极大时表现如何、网络中断时怎么处理。实际操作中我建议测试人员在需求评审前先自己过一遍需求文档把不懂的地方、有疑问的地方都标出来。评审会上重点听产品讲解业务背景和用户场景而不是只盯着界面细节。有条件的话最好能约产品经理做一个15分钟的业务澄清把所有模糊地带一次性问清楚。提示需求理解环节如果发现需求本身存在逻辑漏洞或前后矛盾一定要当场提出不要等到测试阶段才发现那时候改动的成本已经翻了不止一倍。1.2 第二步识别风险确定测试的优先级和重点不是所有功能都需要同等强度的测试。高质量测试的核心是“把有限的测试资源投入到风险最高的地方”。风险识别可以从几个维度来评估功能是否涉及金钱交易、是否影响核心业务流程、是否频繁被用户使用、改动是否涉及底层架构、依赖的外部系统是否稳定。每个维度可以打分分数高的功能优先安排深度的功能测试、自动化测试和性能测试分数低的做冒烟级验证即可。举一个实际例子一个后台管理系统的“用户列表查询”功能和“结算账单导出”功能相比前者只是展示数据后者直接关系到钱。如果把测试资源平均分配那结算模块潜在的金额计算错误很可能因为测试深度不够而漏到线上。合理做法是用户列表做基础的功能验证结算账单则要覆盖各种金额格式、分页边界、大数据量下的性能表现。风险识别还有一个容易被忽视的点代码变更影响分析。哪怕这次只改了一个字段的长度限制也要评估这个字段被哪些下游系统消费。有些问题不是出在改动本身而是出在改动“牵一发动全身”的连锁反应上。1.3 第三步制定测试策略决定“测什么”和“怎么测”测试策略不是在测试计划里写一堆漂亮话而是要做几个关键决策。第一个决策测试的深度和广度。线上出问题容忍度高的内部工具可以只做核心路径测试面向外部客户的支付、交易类系统必须做全链路覆盖包括异常场景、容灾场景。第二个决策自动化测试的投入比例。这个要看项目阶段和团队能力。如果是从零搭建自动化测试框架初期投入会比较大建议优先覆盖稳定且频繁回归的模块比如登录、订单流程、核心接口如果项目还处于频繁迭代、页面结构经常变动的阶段过早做UI自动化可能得不偿失反而应该先做接口层的自动化。第三个决策测试环境的匹配程度。测试环境的数据量、配置和线上差异越大测试结果的可信度越低。如果条件允许尽量搭建一个与线上配置对等的预发布环境尤其是涉及数据库读写、缓存、消息队列的项目。策略定下来之后还要对应地规划测试进度和资源。测试计划的粒度不要太粗至少要以周为单位标注清楚每个阶段的入口条件和出口条件。所谓入口条件就是什么情况下可以开始某类测试所谓出口条件就是达到什么标准可以判定测试通过、允许进入下一阶段。2. 测试用例的设计与准备细节决定成败2.1 第四步编写高质量的测试用例用例设计是整个测试过程中最能体现功力的环节。很多人写用例就是把正常流程走一遍边界值和异常场景全靠临时发挥这种习惯非常危险。我常用的用例设计组合是等价类划分 边界值分析 场景法三种方法结合。等价类划分是把输入数据分成有效和无效的类别每个类别取一个代表值边界值分析专门针对边界条件比如输入框限制1-100个字符那0、1、100、101这四个值必须覆盖场景法则关注用户完整操作链路上的每一步包括前置条件、操作步骤、预期结果。举个例子测试一个登录功能很多人会写“输入正确的用户名和密码登录成功”和“输入错误的密码登录失败”这两个用例就结束了。但高质量的做法远不止这些用户名长度边界最短、最长、超长、密码是否区分大小写、多次输错后是否出现验证码或锁定、登录后session超时时间、重复提交登录请求、特殊字符和SQL注入字符的处理……这些都要覆盖到。用例编写还有一个要点预期结果必须具体可验证。不能写“页面显示正常”这种模糊描述要写清楚具体显示什么文案、跳转到哪个页面、数据库中的数据变成什么状态。这样执行用例的人才不会产生理解偏差后续自动化脚本编写也更容易。注意用例不是写完就完事了。我建议每个用例标注优先级P0/P1/P2P0是阻塞性用例不通过不能上线P1是核心功能用例尽量全部通过P2是边缘场景用例允许有少量失败但需要说明原因。2.2 第五步准备测试数据和测试环境测试数据的准备往往比想象中更花时间也更影响测试效率。我踩过最大的坑就是测试环境数据太“干净”导致很多问题测不出来。测试数据的准备有几个原则第一必须包含真实场景中的典型数据比如用户的真实姓名、手机号、地址格式而不是一串test111第二必须包含边界数据比如最大长度的字符串、超长文本、空值、特殊字符第三必须包含异常数据比如格式错误的手机号、不存在的ID、过期的时间戳第四数据量要覆盖从零到千万级的规模尤其是分页查询、报表导出类功能数据量少的时候测不出性能问题。环境方面要做的事更多。搭建一套可用的测试环境不仅仅是把服务启动起来还要核对中间件版本是否与线上一致、配置文件中的参数是否已按测试需要调整比如超时时间、并发数限制、外部依赖第三方API、短信服务、支付网关是否已通过mock或沙箱环境接入。这里我特别想提一下移动端测试和嵌入式测试的环境特殊性。App测试需要覆盖不同品牌的手机、不同的系统版本、不同的屏幕分辨率还需要准备弱网测试环境。fiddler或Charles模拟弱网是常用手段但要注意模拟的参数要接近真实场景比如3G网络下的延迟和丢包率而不是随便填一个很慢的数值。另外测试数据一定要有“可重复使用”的机制。手动造数据不仅慢而且容易漏。现在很多团队会用自动化脚本批量构造测试数据或者直接使用数据工厂模式在测试用例运行前自动准备前置数据。这块投入的ROI很高强烈建议做。2.3 第六步搭建或复用自动化测试框架自动化测试这个话题聊得很多但真正落地的团队并不多。我见过不少团队买了昂贵的商业工具最后沦为摆设也见过一些团队用开源框架干得风生水起。核心差异不在于工具多贵而在于框架设计是否贴合业务。主流开源自动化测试框架里接口层我推荐用Python或者Java系的组合。Python的requestspytest上手快、生态好Java的RestAssuredTestNG适合已有Java技术栈的团队。UI层选择就复杂一些Web端基本是Selenium的天下移动端Appium是最常见的方案。这几年Playwright和Cypress也火起来了特别是Playwright安装简单、API友好对复杂交互场景的支持比Selenium更好新项目可以优先考虑。但是自动化测试框架的搭建要遵循“渐进式”原则。不要一上来就追求大而全的框架什么报告系统、CI集成、数据驱动全部上齐结果写了一堆底层代码却没有几条真实的测试用例在跑。我的建议是先跑通一条最简单的用例然后把最核心的业务流程自动化等稳定了再逐步扩展。自动化用例的设计也有讲究。UI自动化最怕页面元素频繁变动所以元素定位要优先用稳定的属性比如id、data-testid少用容易变化的xpath路径。接口自动化要注重断言的设计不只是校验HTTP状态码还要校验业务字段的值、数据库的变化、下游系统的调用情况。我个人的体会是自动化测试的价值不在于“代替手工”而在于“把手从重复劳动中解放出来去做更有创造性的探索性测试”。如果一个用例你只需要跑一次手工执行就够了如果一个用例你每个月要跑二十次那就值得自动化。3. 测试执行与过程管理让每一轮测试都有效3.1 第七步执行测试用例做好过程记录测试执行听起来简单——照着用例一步步操作就行。但实际操作中很多测试人员会犯一个错误机械执行缺少思考。执行测试时要有两个意识。第一是“怀疑意识”每一步操作都要思考这个结果合理吗有没有可能开发实现得不对但是用例设计本身也没覆盖到如果测试数据和预期结果不匹配是我的前置条件设置错了还是产品本身行为有变化第二是“探索意识”按用例执行完之后可以顺着手头的场景往周边扩展一下这个按钮在这个状态下点击会怎样如果先做A再做B结果是不是不一样很多隐蔽的bug就是这么发现的。执行过程中一定要及时记录。这里的记录不只是简单勾选“通过/失败”而是要记录测试数据是什么前置条件是什么实际结果和预期结果的差异在哪里如果失败错误信息是什么最好能截图或录屏作为缺陷报告的附件。这些记录不仅是编写缺陷报告的依据也是后续复现问题的重要线索。我还建议测试人员养成“执行一轮就小结一轮”的习惯。每完成一轮测试花10分钟整理一下哪些模块bug最多哪些类型的用例从来没有失败过下一轮测试的重心应该放在哪里这样每一轮测试都不是简单重复而是有策略地推进。3.2 第八步缺陷管理让问题真正被解决缺陷管理是整个测试流程中信息密度最高、最容易引发团队矛盾的环节。一个高质量的缺陷报告应该包含以下几个要素缺陷编号、标题、所属模块、严重级别、优先级、前置条件、复现步骤、实际结果、预期结果、附件截图或日志。关于缺陷标题我有一个很深的体会标题写得好不好直接决定了开发愿不愿意第一时间看。“页面报错”和“订单列表页在数据量超过1000条时点击下一页出现500错误”相比后者明显更高效。好的标题应该包含模块名、触发条件、具体表现三个要素。复现步骤的编写要做到“最小可复现”。我经常看到测试人员写了一大段步骤但开发按步骤操作却复现不出来。原因往往是一些隐含条件没有写清楚——比如“先登录A账号再切换B账号”“必须先在设置页操作一次才能触发”。这些看似不起眼的细节恰恰是问题定位的关键。缺陷的级别划分也要有统一标准。我的习惯是P0代表系统崩溃、数据丢失、核心功能完全不可用必须立即修复P1代表主要功能受影响有替代方案但用户体验差必须在发布前修复P2代表次要功能问题或界面细节问题可延后修复P3代表建议性优化不影响使用。级别定得太高会消耗开发耐心定得太低又会漏掉重要问题这个度需要测试负责人根据项目情况来把控。缺陷的流转也不能放养。今天提了bug三天没动静到了发布前一天才发现一堆问题没处理这是很多团队的常态。要避免这种情况测试负责人需要每天跟踪缺陷状态对超过24小时没有任何更新的缺陷主动跟进确认是开发还没有看、看了没思路、还是在等待某些信息。推一步走一步不可取测试要在缺陷管理上主动一点。3.3 第九步回归测试守住“改动不影响已有功能”的底线回归测试可能是测试流程中最容易被压缩、却又最不应该被压缩的环节。很多上线事故都不是新功能出了问题而是旧功能被新改动意外影响。回归测试的范围怎么确定我总结了一个三步法。第一步分析本次改动的代码涉及哪些模块第二步分析这些模块与哪些其他模块存在数据交互或业务依赖第三步把第一步和第二步的并集作为回归范围。如果有自动化测试用例覆盖这些模块尽量全量跑一遍如果没有自动化覆盖则优先手工回归核心路径。回归测试的执行时机也很重要。理想情况下每轮迭代结束、缺陷修复验证通过后都要做一轮全量回归。如果项目周期紧至少要保证所有P0用例和核心流程用例全量回归其他用例抽样回归。抽样不是随机抽而是优先选择与本次改动相关的用例、历史上出过bug的用例、以及跨模块联动较多的用例。这里还要特别提醒一个容易忽略的场景环境差异导致的回归问题。有些功能在测试环境验证通过但上线后出问题往往是因为测试环境和生产环境的配置差异比如Nginx超时时间、数据库连接池大小、第三方接口的沙箱和正式环境。所以有条件的情况下上线前尽量在预发布环境再做一轮烟雾测试覆盖登录、核心业务主流程、支付或关键查询这类高频路径。4. 测试收尾与长效闭环把经验变成资产4.1 第十步探索性测试专找“计划之外”的漏洞探索性测试是我个人非常喜欢的一个环节。它的核心思想是在测试执行过程中测试人员一边学习系统、一边设计测试、一边执行测试不被预先写好的用例束缚。为什么计划内的用例已经把功能覆盖了还需要探索性测试因为用例是“按预期设计”的而用户是无章法的。用户不会按你的用例来操作系统他们会乱点、会快速重复提交、会在弱网环境下切换页面、会用奇怪的数据格式输入。——而这些恰恰是探索性测试能发现的。做探索性测试有几种有效的方法。一种是“破坏者视角”什么操作可能导致系统出错就做什么比如上传超大文件、并发提交多个请求、在流程进行中强制杀掉App、快速切换账号。另一种是“小白用户视角”想象一个完全没受过培训的用户按照最自然的操作习惯来使用系统看哪里会卡住、哪里会产生疑惑、哪里有引导缺失。我印象最深的一次探索性测试是在测试一个文件上传功能时我突发奇想传了一个0字节的空文件结果前端传完之后没有任何提示后端一直转圈最终整个页面卡死。这个场景没有任何一个预设用例覆盖但真实用户完全可能误选一个空文件——后来这个bug被定为P1上线后确实有用户踩到了。探索性测试最好安排在功能测试接近尾声、系统相对稳定的时候做给测试人员留出相对充裕的时间。如果时间紧张至少要在核心功能模块上各安排30分钟的探索性测试。4.2 第十一步质量度量用数据说话测试做得怎么样不能靠感觉要有数据支撑。质量度量不是为了一堆漂亮报表而是为了让团队能看得见质量的变化趋势及时发现问题。常用的测试度量指标有用例执行通过率、缺陷总数及级别分布、每轮测试发现的新缺陷数量、缺陷修复率、缺陷平均修复时长、上线后线上缺陷数等。这些指标可以组合起来看。比如用例通过率很高但缺陷密度也很高说明用例设计不够精准测到了问题但没有把所有问题用例化缺陷修复率低说明开发资源不足或缺陷本身描述不清需要测试侧配合改进。我建议每个迭代结束后测试负责人输出一份简要的质量报告内容不用太长但要包含本轮测试的范围和结论、发现的缺陷总数和分布情况、未解决问题清单、线上风险的评估建议。“能不能上线”这个结论一定要明确不要含糊其辞说“应该没问题”——测试的职责就是给出一个明确的质量结论供项目组做发布决策。质量度量的数据一定要真实。我见过有团队为了追求好看的数据把失败的用例标注为“阻塞”而不是“失败”或者反复修改用例的预期结果来迁就实现的错误行为。这种自欺欺人的做法最终坑的是自己的团队。4.3 第十二步复盘与资产沉淀把经验变成团队的肌肉记忆迭代结束后最重要、但也最容易被跳过的事就是复盘和资产沉淀。复盘会怎么开才有效我建议遵循三个原则第一不追责、只找原因氛围要开放不然没人愿意说实话第二聚焦系统性问题如果某个模块连续三个迭代都有bug那问题不在测试用例覆盖不足而可能在代码架构、需求质量或团队协作层面第三结论必须落地成行动项每个问题都要有对应的改进措施、负责人和完成时间。资产沉淀有几个具体的动作。第一测试用例库的更新——把复盘中发现的新场景、新边界及时补充进用例库而不是停留在个人笔记里。第二自动化测试脚本的维护——新增的核心功能如果值得做自动化趁热打铁写掉拖得越久重构成本越高。第三知识库的整理——典型缺陷的根因分析、疑难问题的排查过程、常用工具的使用技巧都值得记录下来方便新同学快速上手。我还有一个习惯每个迭代挑一个性质最典型的bug写一份“bug故事”。不是简单的缺陷报告而是把这个bug的发现过程、排查思路、根因分析、修复方案、防范措施完整地描述出来发布到团队的知识库里。这比培训文档生动得多也更能帮助团队建立对系统脆弱点的共同认知。5. 常见问题与避坑实录5.1 测试时间被压缩怎么办几乎每个测试工程师都遇到过这种情况开发延期了上线时间不动测试时间被无限压缩。这种时候硬刚没用要讲策略。首先要做的是“风险分级沟通”。把测试范围分为必测项和选测项明确告诉项目组必测项不测完上线风险有多大选测项如果砍掉哪些用户场景可能出问题。让决策层带着风险意识去做取舍而不是默默加班把所有用例跑完导致质量下降。其次要“充分利用自动化”。如果之前已经沉淀了自动化测试用例这时候就是它们发挥价值的时候。全量回归用自动化跑手工资源集中到新功能测试和高风险模块的探索性测试上。最后不要把压力全部自己扛。测试是质量保障的一个环节但不是唯一环节。要推动开发做代码走查、自测、单元测试从源头减少流入测试环节的缺陷数量。5.2 测试环境不稳定怎么办测试环境不稳定是团队协作中的老大难。服务频繁重启、数据被其他同事搞脏、第三方接口超时……这些问题会严重干扰测试效率。应对措施有几个方向。一是推动环境治理固定测试环境的管理责任人制定环境使用公约比如不允许在测试环境乱改数据、不允许随意重启服务。二是引入环境隔离每个迭代用独立的环境或数据库schema避免相互影响。三是搭建测试数据自恢复机制用脚本定期重建干净的测试数据集出了问题一键恢复而不是靠人肉去整理数据。如果经常因为第三方接口不稳定而测试受阻建议投入做一个mock服务把第三方接口的响应脚本化既能保证测试稳定性又能覆盖各种异常返回场景。5.3 缺陷复现不了怎么办这是测试工程师最崩溃的时刻之一明明刚才还报错让开发来看时又正常了或者测试环境能复现开发本地环境就是复现不了。我的排查思路是这样。第一先确认触发条件尽可能缩小复现路径把“偶尔出现”变成“必然出现”第二收集尽可能多的现场信息——日志、截图、数据库状态、网络请求记录、操作时间点第三考虑环境差异——开发的本地配置和测试环境有什么不同数据库数据有什么差异这些看起来“小”的区别往往就是复现不了的原因。如果实在复现不了不要硬扛。可以把缺陷记录为“偶现问题”附上已收集到的全部信息标记为低优先级持续观察。同时建议开发在代码中增加更详细的日志埋点下次再出现时能拿到更多线索。注意还有一种情况缺陷没有复现不代表缺陷不存在。我见过一些偶现问题复现不了就关闭了结果上线后每个月都出现一次直到某次用户量峰值时才大规模爆发。偶尔出现的bug背后大概率有更深层的系统性问题。5.4 自动化测试脚本维护成本高怎么办很多团队自动化测试做了一段时间后发现维护成本越来越高跑一次脚本要修半天最终放弃了。这个问题的根源往往是当初为了快速见效没有重视脚本的可维护性。降低维护成本有几个实战技巧。第一元素定位要做“分层管理”把页面元素集中在一个独立的文件里管理页面结构变了只需要改一处第二测试用例要做“数据驱动”测试数据通过外部文件或参数传递不要硬编码在脚本里第三用例之间要相互独立每个用例自己负责数据准备和清理不能依赖其他用例的执行结果第四合理设置自动化用例的运行频率UI自动化不需要每次提交代码都跑可以放在每日夜间执行接口自动化则可以在CI流水线里随时跑。另外自动化测试不是越早做越好。页面还在频繁改版的时候UI自动化脚本的收益是负的。我的建议是功能稳定了再做UI自动化接口稳定了再做接口自动化不要为了“赶时髦”而强行上马。6. 关于测试这件事我个人最想说的一句话回到标题“高质量测试的12个步骤”我梳理一下全流程的内在逻辑前三个步骤解决的是“想清楚测什么、为什么测、怎么测”中间三个步骤解决的是“用什么测、在哪里测、靠什么测”再后面三个步骤解决的是“怎么执行有效、怎么发现问题、怎么守住回归”最后三个步骤解决的是“怎么从测试执行进化到质量保障、怎么把个人经验变成团队资产”。这套流程看起来步骤很多但实际执行时很多环节是可以并行或省略的——比如一个小到不能再小的工具型H5页面可能只需要需求理解、边界分析、一轮手工测试加探索性测试就够了。关键不在于12个步骤必须全部走一遍而在于你心里始终有这12个维度的意识知道每个项目应该取舍什么、关注什么。我个人在实际操作中最深的体会就是测试不是“找茬”而是“提供质量信息”。你测出一个bug不只是告诉开发“这里有问题”而是帮助团队理解“这里为什么会有问题、影响范围有多大、应该怎么预防”。当你带着这种心态去做测试你就不再是一个只能机械执行用例的执行者而是真正参与产品质量建设的工程师。这种视角的转变比学会任何测试工具都重要。
返回列表