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

文章详情

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

软件测试教程总结:从用例设计到缺陷管理,功能测试完整入门

软件测试教程总结:从用例设计到缺陷管理,功能测试完整入门 做软件测试这几年我最大的一个感受是很多人把测试这件事想简单了。以为测试就是“点点点”、提几个 bug 就算完事可真到线上出问题的时候才发现当初很多环节根本没抓住。这篇《软件测试教程总结一》我想把测试入门必学的那一套东西从头捋一遍测试到底要解决什么问题、用例该怎么写、bug 怎么管、测试报告怎么出。内容适合刚入行的测试新人也适合想补一补质量意识的开发同学。看完之后你能对手工功能测试的完整链路有一个清晰的认识后续再学自动化、性能测试也有底子。1. 先想明白软件测试到底在解决什么问题1.1 质量不是“测出来的”很多人一听说测试第一反应就是“测试保证质量”。这句话不能说错但容易误导人。质量不是测试这一个环节能“测”出来的。真正决定质量的是需求分析、架构设计、编码规范、代码评审、环境部署、上线策略这整套流程。测试是这条链路上一个非常重要的反馈环节它的价值不是给产品“兜底”而是尽早发现问题、暴露风险让团队有机会在成本还低的时候修正。我见过不少团队需求一句话带过开发闷头写完测试拿到一个半成品开始测最后上线前疯狂修 bug。这种模式下测试再怎么努力也只是在给前面的偷懒买单。所以你在做测试的时候不要只盯着“找 bug”这个结果更要关注“这个 bug 是怎么被引入的”。需求模糊、设计遗漏、开发自测不足这些问题如果能在测试过程中被反馈出来才是测试更大的贡献。把测试当作信息反馈系统而不是质检关卡你的测试思路会完全不一样。1.2 测试的四个维度功能、性能、兼容、安全软件测试的范围比我刚入行时想象的要宽得多。从大方向上看至少要关注四个维度功能、性能、兼容性、安全性。功能测试验证的是“该做的事情有没有做对”比如登录校验、下单流程、退款状态性能测试关注的是“扛不扛得住”比如 1000 个用户同时抢购会不会卡死兼容性测试看的是“换个环境还能不能跑”包括不同的操作系统、浏览器、屏幕尺寸、网络条件安全测试则关注“会不会被人钻空子”比如越权访问、SQL 注入、敏感信息泄露。这四个维度的优先级并不是固定的。一个内部管理后台功能正确性可能比性能更重要一个面向公众的电商活动页性能和兼容性就是生死线。测试新手不用一上来就四个维度全铺开但脑子里面要有这张地图至少拿到一个需求时能清楚自己正在测的属于哪个维度还有哪些维度需要他人协作或者后续补齐。这只是第一期总结我先重点讲功能测试这是所有测试体系的地基后面的内容里再逐步展开性能、兼容和安全。2. 测试体系的整体设计与分类2.1 按阶段分单元、集成、系统、验收测试体系最常见的分法是沿着软件开发的生命周期展开。单元测试是在代码层面验证单个函数、单个模块的行为通常由开发同学完成。集成测试关注的是模块与模块之间的交互比如 A 服务调用 B 服务之后返回值能不能被正确解析。系统测试是把整个软件当作一个整体来测验证它是否符合需求文档里的预期这是测试工程师的主战场。验收测试则由产品、业务方甚至真实用户来做目的是确认“这东西确实解决了我的问题”。很多新人会把系统测试和验收测试混为一谈。它们最大的区别在于判断标准系统测试依据的是需求和设计文档关注实现是不是正确验收测试依据的是用户场景和业务价值关注需求本身是不是有意义。举个例子一个功能做出来了系统测试发现按钮点了有反应、数据能存进库符合需求但验收测试可能会发现这个功能放在用户操作路径里根本没人会去点因为它解决的是一个伪需求。这两个阶段视角不同价值也不同。2.2 按执行方式分手工测试、自动化测试、探索式测试平时大家争议比较多的是手工测试和自动化测试到底谁更“高级”。我的看法很简单它们解决的是不同的问题。手工测试的优势在于灵活和敏锐。人可以在操作过程中突然察觉“这里好像不太对”这种直觉和联想能力脚本很难替代。自动化测试的优势在于可重复和高效。回归测试、大数据量校验、跨浏览器兼容检查这些场景靠手点不仅慢还容易漏自动化跑一遍就能稳定输出结果。还有一种方式是探索式测试它介于两者之间甚至可以说是一种思维模式。执行者不按照写好的用例机械执行而是边测试边学习、边设计边执行通过观察系统行为不断调整进攻方向。早期没有需求文档、时间又紧迫的项目探索式测试能发挥很大作用。但要注意探索式测试不是“乱点一通”它背后需要有测试思维支撑知道先测核心功能再测边界场景最后找薄弱环节。2.3 按关注点分功能、回归、冒烟、性能、安全除了阶段和执行方式测试还可以按关注点继续拆分。功能测试关注业务逻辑是否正确回归测试关注“改了 A 之后 B 有没有坏”冒烟测试是每次提测之后先跑一遍核心主流程用来判断“这个包值不值得继续往下测”性能测试关注响应时间、吞吐量、资源占用安全测试关注漏洞和权限问题。这里我特别想提醒的是冒烟测试和回归测试的区别。很多团队把这两个混在一起测试包一上来就全量回归结果执行到一半发现主流程直接崩了前面全都白测。正确的节奏应该是开发提测后先花 10 分钟执行冒烟用例主流程通了再进入完整的功能测试和回归测试。冒烟用例不求多只求覆盖最核心的用户路径比如登录、首页加载、新建数据、提交订单。这一关没过直接打回。3. 测试用例设计核心细节与实操要点3.1 测试用例的标准字段测试用例是测试工作的基本单元也是最能看出一个测试工程师功底的地方。一条完整的用例不是“输入一个账号点击登录”这么简单至少要包含以下几项。序号、所属模块、用例标题、前置条件、测试数据、操作步骤、预期结果、实际结果、优先级、用例类型。这里面我最看重的三个字段是前置条件、测试数据和预期结果。前置条件没写清楚执行者可能在不同的状态下开始操作结论完全不一样。测试数据直接决定用例能不能复现比如“输入一个已存在的用户名”和“输入一个不存在的用户名”是两条用例不能混在一起。预期结果写得太模糊还不如不写比如“页面显示正确”就等于没说“页面右上角显示登录成功提示文案为‘欢迎回来’并跳转到首页”才是一条可以验证的用例。3.2 经典用例设计方法怎么落地用例设计的终极问题是如何用有限的用例覆盖尽可能多的场景。教科书上最常见的方法有等价类划分、边界值分析、场景法、错误推测法。很多新手学了方法却不知道怎么用核心原因是没理解它们各自适合解决什么问题。等价类划分是把输入数据按“预期结果相似”分成几类每一类只取一个代表性数据来测。比如年龄输入框合法范围是 18 到 60 岁那就可以分成三类小于 18 的非法类、18 到 60 的合法类、大于 60 的非法类。边界值分析则是专门盯着输入范围的边界因为从经验来看边界附近最容易出 bug比如 17、18、60、61 这几个值必须测。场景法适合流程型功能比如“用户下单支付成功”“下单支付超时取消”这样的业务路径把主流程、备选流程都走一遍。错误推测法靠的是经验和直觉比如提交表单后快速重复点击按钮、网络中断后恢复连接、上传文件中途取消这些操作用户很容易触发开发又容易忽略。把这几个方法组合使用效果好得多。通常流程是先画业务流程场景再用等价类和边界值覆盖每个环节的输入最后用错误推测补一些异常场景。看起来工作量不小但真正执行起来会发现漏测率比想到哪测到哪低得多。3.3 用例评审与维护很多人写完用例就直接开测跳过了用例评审这一步。等到测到一半才发现跟开发理解的业务规则完全不一致只能推翻重来。用例评审不仅仅是走流程它是一次需求对齐的机会。评审会上测试讲用例开发确认实现方案产品确认业务预期三方一致了才动手执行能省下大量返工时间。用例也不是一次写死就能用终身的。业务需求一变用例就得跟着调整。比较常见的问题是需求从“管理员可以删除用户”改成了“管理员可以禁用用户但保留数据”如果用例没跟上测试还在验证删除逻辑就会闹出笑话。老项目尤其要注意用例库的维护。我的习惯是每个迭代结束后花一点时间清理用例标记废弃的、更新变更的、补充漏掉的这样用例库才能一直保持可用状态。千万别把用例库当成一次性的文档写完就往抽屉里一扔那是给自己埋坑。4. 实操过程执行、缺陷管理与测试报告4.1 执行前的准备与环境检查测试执行看起来简单实际上开局先踩坑的大有人在。最典型的情况是用例设计没问题需求也理解清楚了结果一点开系统就报错折腾半天发现是环境问题。所以执行的第一步不是急着点按钮而是先做环境自检。你需要确认三件事第一当前测试环境版本是否正确指的是哪个分支构建的包会不会把开发自己没测完的代码也带进来了第二测试数据是否准备到位该造的数据造好了没有比如会员等级、优惠券、订单状态这些前置条件第三关联系统是否可用测试支付功能时商户平台有没有连上测试登录时认证服务正不正常。这些基础工作做扎实后面执行起来才顺畅。我自己的习惯是先跑一遍冒烟用例主流程通了再铺开执行如果冒烟都过不了先提 bug 然后找开发确认不硬着头皮往下测。4.2 提 bug 与缺陷生命周期提 bug 是测试最日常的动作但提得好不好直接影响开发解决效率。一条合格的 bug 记录至少包含标题、复现步骤、实际结果、预期结果、测试环境、严重程度和优先级。标题要让人一眼看出问题在哪比如“个人中心修改头像后返回列表页页面白屏”就比“个人中心有问题”有用得多。复现步骤必须能让人照着操作一次就复现环境信息不能省有些 bug 只在特定浏览器、特定账号下出现漏了环境描述等于白提。缺陷生命周期其实不复杂无非是从“新建”到“修复”再到“关闭”。但过程中有几个细节经常被忽视开发修复了 bug 之后测试不仅要验证原问题是否解决还要验证相关功能有没有被影响这就是前面说的回归。一个 bug 修复后引入另一个 bug 的情况并不少见。另外有些 bug 开发会标记为“不予修复”测试不能直接默默关闭而是要确认产品意见。如果这个 bug 确实会影响用户就要坚持推动修复或者明确风险范围否则上线后爆炸了背锅的还是测试。4.3 写一份能用的测试报告测试报告不是给领导看的“功德簿”而是告诉团队“当前软件能不能上线”的判断依据。一份能用的测试报告至少需要回答几个问题测试范围是什么覆盖了哪些功能哪些没覆盖用例执行情况如何总用例数、通过数、失败数、阻塞数遗留 bug 有多少每个的严重程度怎样有没有影响上线的致命问题质量结论是什么可以上线、有条件上线、还是不能上线。我见过最没用的测试报告是写了一堆测试过程唯独没有结论。项目负责人看完还是不知道到底能不能发版。写报告的时候要敢于下结论哪怕结论是“不建议上线因为存在一个致命 bug路径是……”也比模棱两可强。有条件上线的情况也要把条件写得清清楚楚比如“支付模块存在中风险 bug但本次版本不涉及支付改造可上线需在下一个版本修复”。这样团队才能做决策测试报告才真的有价值。5. 常见问题与排查技巧实录5.1 环境问题占了测试工作一半测试过程中遇到的坑有一半以上不是代码问题而是环境问题。最典型的有测试环境配置了线上数据导致把别人的订单查出来了数据库没有执行最新脚本功能页面上报错本地联调和测试环境用的地址不同跨域请求直接失败还有就是“明明刚才还好好的现在忽然不行了”这种多数是环境被别人动过。排查环境问题我的经验是三步走第一步看控制台和网络请求前端报错还是接口报错一眼能分出来第二步确认当前环境指向的后端地址、数据库、配置中心是不是被切到别的环境了第三步自己尝试复现如果换一台机器或换个账号就正常了大概率是环境数据问题。记住一个原则遇到问题先别急着提 bug先确认是环境问题还是代码问题。把环境问题当 bug 提给开发不仅浪费时间还会消耗团队的信任。5.2 用例漏测总是事后才发现怎么办漏测是最让人头疼的问题有时候明明用例覆盖率看起来很高上线后还是出了问题。排查下来要么是业务流程里的某个分支场景当时没考虑到要么是多个功能组合在一起的交互漏掉了。比如单个功能都测过没问题但 A 功能和 B 功能同时操作时数据状态互相覆盖这种组合场景单测用例很难覆盖到。解决漏测问题不能只靠“下次细心点”。要做的是定期复盘线上故障把漏测原因整理成清单反过来补充到用例库和测试思维里。比如这次漏的是“断网重发请求”下次设计用例时就多留意场景交互。另一个有效的办法是引入变更影响分析开发有改动时不要只看自己负责的功能还要找出所有可能受影响的上下游模块。还有一点测试用例不是越多越好而是每条用例都有它对应的风险点没有风险分析做基础的用例数量再大也只是自我安慰。5.3 自动化测试的踩坑提醒虽然这篇文章以手工功能测试为主但新手经常会被“自动化代替手工”这种话带偏所以我在这里提前提个醒。自动化测试写起来容易维护起来要命。最典型的问题是 UI 自动化脚本里到处是固定等待时间今天跑得通明天网络一慢就挂还有页面元素稍微改个 class脚本全挂维护成本比手动执行还高。真正适合自动化的场景是短期内不会大变的核心回归用例、大数据量的数据校验、以及需要跨环境重复执行的场景。如果需求还在频繁变动、界面都没稳定下来就急着上自动化大概率是给自己找活干。建议先把手工测试的思路理清楚有稳定的用例结构之后再循序渐进引入自动化。6. 我的几点个人体会6.1 测试思维是受益很久的一种能力做测试久了我发现最有价值的不是掌握了多少工具而是形成了一种测试思维。这种思维就是拿到任何东西先关心它“应该什么样”再想尽办法找出“它实际是什么样”和“应该什么样”之间的差距。延伸出去你会习惯性地考虑异常场景、边界情况、数据一致性、操作时序。这种思维不光用于测软件写文档、做方案、甚至日常做决定都会不自觉地去想“如果这里出了问题会怎样”。这是一个不会被某个技术框架淘汰的核心能力。6.2 给新手的第一份实操建议如果你刚开始学测试别急着去学各种自动化框架和花哨工具先把手工测试的基本功打扎实。具体怎么做我的建议是第一找自己最常用的软件试着把它拆成功能模块给每个模块设计一份正经的测试用例字段写完整预期结果落到可观察的细节第二每次测试完逼迫自己总结这次哪些地方容易出问题哪些场景第一次没想到总结几轮之后你会有明显进步第三多跟开发、产品聊需求不要等着别人把文档送到你手里业务理解得越深测试方案越有说服力。我踩过的坑、走过的弯路也不算少但现在回头看最值钱的还是早期老老实实写用例、做回归、查环境的那段经历。希望这一篇《软件测试教程总结一》能帮你把地基打牢后面聊自动化测试、性能测试、测试平台建设的时候你也能清楚知道那些工具和技术到底是来解决什么问题的。
返回列表