ARTICLE DETAIL

资讯详情

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

软件测试核心概念:定义、调试、需求与生命周期全解析

软件测试核心概念:定义、调试、需求与生命周期全解析 做软件测试这些年带过不少新人也面试过很多人发现一个特别有意思的现象很多入行半年甚至一年的测试工程师能把用例写得工工整整能熟练提交缺陷报告但你要是突然问他“软件测试的定义是什么测试和调试到底啥区别需求是从哪来的软件生命周期是怎么回事”他反而支支吾吾答不完整。这不是业务能力不行而是基础概念没有形成体系。今天这篇文章我就围绕软件测试里最容易含糊的几个核心词——定义、目的、调试、需求概念、软件生命周期、测试流程——掰开揉碎讲一遍。不管是刚入门的测试小白还是需要带新人的测试组长都值得花二十分钟把这条线捋顺。搞清楚这些你的测试动作才不会像无头苍蝇而是有章法地侦察和验证。1. 软件测试到底在测什么定义与核心目的1.1 软件测试的定义它不是“找bug”那么肤浅软件测试最常用的定义来自IEEE标准在规定的条件下运行或操作软件来观察和记录实际结果并评估软件系统的某些方面是否满足规定需求的过程。这句话听起来拗口但拆开看有三层一是“规定的条件”指的是测试环境、测试数据、操作步骤都要可控二是“观察和记录实际结果”强调的是结果要如实记录下来而不是大概觉得好像没报错三是“评估是否满足规定需求”也就是说你要有明确的期望结果去做比对否则不叫测试只能叫“瞎点一通”。而很多入门书还会强调另外两个词验证Verification与确认Validation。我习惯用一个做菜的比喻来说明区别验证是问“我照着菜谱做步骤对了吗用量对了吗”确认是问“这道菜端上去客人爱吃吗”。放到软件里验证是检查“软件有没有正确地做事”比如登录功能要求的加密逻辑你实现了没有确认是检查“做的是不是用户真正想要的”比如用户其实希望登录后记住上次浏览的页面但你的产品压根没设计这个行为。一个软件测试工程师天天干的事情其实就是这两件事验证需求被正确实现确认软件符合真实使用场景。还有一个常见的认知误区需要纠正软件测试的目的不是“证明软件没有bug”。恰恰相反测试是为了尽可能多地发现缺陷同时对这个软件的质量水平给出客观评估。这就像体检不是为了证明你身体没毛病而是要把潜在的异常项目都排查一遍并且告诉你哪些指标偏了、偏了多少。所以被测试员说“你的模块有bug”的时候别急着上头这是一份有价值的质量报告。1.2 软件测试的核心目的质量、风险与成本为什么要做测试落到实际项目里无非四个目的。第一是发现缺陷在交付之前把问题暴露出来别让用户当你的测试员。第二是评估质量通过缺陷密度、用例通过率、严重缺陷数量等指标给项目经理造成一个“现在能不能发布”的决策依据。第三是预防缺陷比如通过评审需求、评审设计在编码之前就消灭掉一部分问题这比事后修补划算得多。第四是降低风险特别是金融、医疗、航空这类行业一个低级bug带来的可能是真金白银的损失甚至安全事故测试是在为风险兜底。关于成本我见过太多开发吐槽“测试怎么这么烦总是挑刺”但很少有人认真算过一笔账。缺陷越早被发现修复成本越低。需求阶段引入的一个逻辑错误可能只需要花一顿饭的时间改文档如果到了上线后被用户发现可能牵扯到停机回滚、紧急补丁、客服解释成本可能是早期的几十倍。这就是软件测试存在的底层逻辑在错误还便宜的时候抓住它。这也是为什么我一直强调软件测试不是“点鼠标”的体力活而是一项需要策略的侦察工作。测得好不好不看用例数量而看能不能在有限的资源里找到真正要命的问题。2. 调试与测试一对容易混淆的“孪生兄弟”2.1 测试和调试的区别一个是找茬一个是破案很多新手会把“测试”和“调试”混为一谈甚至觉得测试就是帮开发调bug。这个误解必须澄清测试是发现缺陷的过程调试是定位并修复缺陷的过程。测试的核心动作是执行、观察、对比确认“程序行为不符合预期”调试的核心动作是分析、定位、修改找到“为什么不符合预期”以及“怎么改才符合预期”。通常测试人员发现问题后会把复现步骤和日志丢给开发开发进入调试模式去抓元凶。举个实战例子。你测一个登录功能输入正确用户名密码点登录后一直转圈弹不出首页。你记录下现象提交一个缺陷登录接口响应超时期望2秒内跳转实际等待10秒无响应。到这里测试工作暂时告一段落。接下来开发拿过环境打开抓包工具发现后端返回500再看服务端日志发现数据库连接池耗尽——这就是调试。所以测试和调试是接力关系不是包含关系。好的测试人员不抢开发的活但必须具备初步的调试意识因为你能从日志里定位到大概模块开发修复的速度会快很多。2.2 常用调试工具盘点串口助手、网络助手、gdb、adb测试人员就算不做调试也一定要懂点调试工具不然很多诡异的问题根本复现不了。我在物联网和嵌入式项目里摸爬滚打多年最常用到的几类工具每一个测试都应该至少知道它们是干嘛的。串口调试助手比如sscom是嵌入式测试的标配。设备跑起来之后系统日志、AT指令交互、PID控制参数都靠串口输出。测试时你大概率需要通过串口去发指令、改参数、抓日志。比如一块开发板连接了传感器你想验证传感器上报频率是否符合协议最靠谱的办法就是用串口助手发一条查询指令看返回的数据帧是不是预期格式。这里有个小技巧串口通信的波特率、数据位、停止位必须和固件代码里配置一致否则收到的全是乱码别傻乎乎地以为是设备烧了。网络调试助手则派在上位机和设备交互的场景。设备支持TCP或UDP你可以用一个网络调试助手在PC上模拟服务端或客户端发包验证协议。比如一个温湿度传感器定时向服务器上报数据测试时你把助手当成服务器监听一个端口接收设备发来的报文对照协议文档逐字节校验字段。如果设备该上报时报不上来还能通过助手主动下行业务数据来验证设备在弱网或断网下能不能正确处理。gdb调试工具在Linux环境下非常有用。测试人员如果会一点基础gdb命令比如bt、info locals、run、break当场就能帮开发确认崩溃点是空指针还是数组越界。我见过一个特别的案例一个进程跑着跑着就消失开发说复现不了我用gdb挂起来跑了几分钟崩溃时直接打出核心转储文件通过bt看到是某个第三方库的递归调用栈溢出。这种问题如果靠黑盒测试去捅捅破天也定位不了。adb调试桥就是安卓测试的命根子。抓日志用adb logcat、查应用列表用adb shell pm list packages、录屏用adb screenrecord甚至可以模拟点击坐标。很多UI上的“偶现闪退”都是靠adb抓取到的崩溃栈才把问题描述清楚的。我的习惯是接到一个兼容性bug先看一眼adb日志里的Fatal字段基本就知道这锅该甩给谁了。另外像IDE自带的调试器比如Visual Studio在调试时按F10/F11逐过程、逐语句Qt环境下在合适的位置打断点看变量变化同样值得测试人员熟悉一下。你不需要像开发那么精通但至少能看懂调试界面上的“调用堆栈”和“局部变量”这能让你提交的缺陷描述从“点了没反应”升级成“在xx函数内发生空指针引用”专业感直接拉满。2.3 高效定位问题的几个土办法调试的思路比工具更重要。我总结了四个特别土但特别有效的方法。第一个是二分排除法。一个流程涉及10个步骤不要从头到尾反复看先断在第5步看前面5步有没有问题如果前面5步正常问题就锁定在后5步再往后5步里二分。这个我在做接口链路测试时经常用能快速把问题从一个链路里抠出来。第二个是保留现场法。很多bug最怕的就是问题出现之后环境没了、日志清空了、状态重置了。所以一旦出现问题马上冻结现场保留内存转储文件、保存全部日志快照、记录设备当时的状态值甚至拍下界面截图。设备断电重启很简单但证据消失后一切都回到原点。第三个是最小复现法。用户报了一个“偶发”的问题不要急着按原样反复点十次而是尝试减少前置条件、缩小数据范围、简化操作路径找出一个稳定的最小复现步骤。比如一个问题需要操作十步才出现试着跳到第7步或者把某个参数从A改成B很快就能发现是不是和某个前缀条件强相关。第四个是对比参照法。找一台已知正常的旧版本设备或环境跑同样的操作序列对比两者输出差异。差异点往往就是问题根源所在。这个方法在做回归测试和兼容性测试时特别好用因为软件更新后出现的诡异bug八成是新旧版本之间的行为变化引起的。3. 需求概念测试的“源头活水”3.1 需求到底怎么分类别只盯着“能登录”这种话软件测试的有效性七成取决于你对需求的理解深度。需求不是产品经理甩给你一句话“做一个登录页面”就完事。可执行的需求至少应该拆成这四个层面。用户需求描述的是用户的目标和痛点比如“我想安全快捷地访问我的个人账户”。业务需求描述的是这项功能给业务带来什么价值比如“在线登录后才能开展订单查询和支付服务”。功能需求描述的是系统具体要做什么比如“用户输入手机号和密码点击登录系统校验后跳转首页”。非功能需求描述的是系统做得有多好比如登录响应时间小于2秒、系统支持10000人同时登录、支持指纹和验证码等扩展方式。初学者最容易漏掉的就是非功能需求性能、安全、稳定性、易用性这些往往要在测试策略里额外设计用例。真正优质的需求条目应该具备“可测试性”。拿登录来说“密码长度合理”这句话测试人员根本没法执行——什么叫合理改成“密码长度在8到16位之间且必须包含大小写字母和数字”用例才能写得出来。所以做测试的人在评审需求时要养成一个习惯看着一条需求心里默默问一句“这条件怎么验证我能不能设计出明确的期望结果”如果答案是否定的那这条需求就得打回去细化。3.2 从需求到测试用例需求跟踪矩阵是关键落点当需求明确之后测试设计的起点就诞生了。我们需要把一条条需求映射到测试用例上这就用到需求跟踪矩阵RTM。它的作用简单说就是每一层需求都能追踪到对应的测试用例每一条测试用例也都能反查它验证了哪条需求。没有RTM的项目经常出现测了一大堆功能、漏了一个核心流程的情况因为大家测着测着就凭感觉跑了。举个例子。登录功能可能拆分出以下需求点每个需求点至少对应一组用例需求ID需求描述测试用例编号用例结果REQ-LOGIN-01正确手机号正确密码登录成功TC-LOGIN-001PassREQ-LOGIN-02密码错误时提示“密码错误”且不跳转TC-LOGIN-002PassREQ-LOGIN-03连续3次密码错误锁定账号30分钟TC-LOGIN-003FailREQ-LOGIN-04登录页面响应时间小于2秒TC-LOGIN-004Pending把这位矩阵搭起来之后你就能在测试报告里很有底气地说本次测试覆盖率100%覆盖了登录模块的全部需求点。而需求一旦变更你也能快速分析出哪些用例要新增、哪些要修改这个能力在敏捷项目里非常吃香。需求不明确的坑我也踩过很多次。严格来说测试人员绝对不该默默接受一条模糊需求就开干。正确做法是三个动作第一找产品经理用文字把场景补充完整第二找开发确认技术可行性第三如果实在无法明确把你的理解和假设写明在用例中用“假设条件”标注出来让全组都知道这条用例是在什么前提下设计的。4. 软件生命周期测试贯穿全程而不是最后才上场4.1 常见的生命周期模型与测试的介入点软件的成长过程就是软件生命周期从概念提出到开发上线再到维护退市。不同的开发模式决定了测试在什么时候介入、怎么介入。这里重点讲三个最常见的模型。瀑布模型是最经典的线性模型需求分析→概要设计→详细设计→编码→测试→运维。它的特点是每个阶段都有明确的交付物阶段之间像瀑布一样往下流。对应的测试策略就是V模型把开发活动和测试活动对应起来需求分析阶段准备验收测试概要设计阶段准备系统测试详细设计阶段准备集成测试编码阶段准备单元测试。V模型的好处是测试计划可以早早开始坏处是开发代码完成后才能真正执行测试发现问题往往已经来不及了。敏捷模型现在用得最多Scrum是主力。每个迭代2到4周开发、测试、产品在一个迭代内协同作战。测试不再是最后一个环节需求评审有测试每日站会有测试用例编写要和开发同步进行甚至测试驱动开发TDD要求先写测试用例再实现代码。这也就是常说的“测试左移”——把测试活动尽量向前推移。而强调上线后监控线上告警、收集用户反馈让测试也参与线上保障就是“测试右移”。DevOps模式进一步把开发和运维融合。测试已经不只是关注功能还要关注容器、持续构建、监控告警等CI/CD链路。测试人员可能要做自动化冒烟测试让每次代码提交都能自动跑一遍核心用例快速反馈问题。在这些模型里测试的角色越来越不是“挑刺的人”而是质量保障的推动者。4.2 生命周期各阶段测试都在干什么具体到每个阶段测试的活是完全不同的。我列了一张我在带新人时常发的表比较粗糙但很实用。生命周期阶段测试活动产出物需求分析评审需求可行性、补充可测试性建议需求测试要点、RTM初稿设计阶段评审技术方案、评估可测试性、梳理测试环境测试计划草案、测试环境需求编码阶段编写测试用例、准备测试数据、执行单元级自动化冒烟测试用例库、冒烟测试脚本测试阶段执行功能/接口/性能/兼容性测试提交缺陷回归验证缺陷报告、测试报告上线阶段新增冒烟验证、数据校验、线上环境部署检查上线通过记录运维阶段线上重大问题跟踪、用户反馈收集、定期回归线上问题跟踪表有一个很关键的理念测试活动不应该从“测试阶段”才开始。如果等项目编码完了测试才进场那只能算“亡羊补牢”。我见过太多紧急项目测试时间只有两三天然后加班熬夜测出了几十个bug开发改都没时间改最后带病上线。归根结底是测试没有在需求阶段就发声。所以你在任何项目里做测试都要勇敢地往早期走。在需求评审会上哪怕你只是提一句“这条需求描述里‘其他方式’太宽泛建议列出具体支持的登录方式”都会让后续测试省不少事。5. 测试流程从测试计划到测试报告的完整路径5.1 标准测试流程的六个阶段软件测试体系的完整流程有点像一场有准备的战役。你不会上来就点开软件乱点而是有计划地排兵布阵。标准流程通常分成六个阶段测试计划、测试设计、测试执行、缺陷管理、回归测试、测试总结。第一阶段测试计划。这是整个测试的战略地图。明确测试范围、测试目标、资源投入、进度安排、风险应对、入口标准和出口标准。写计划不能拍脑袋要回答清楚“测什么、不测什么、用什么方法测、什么时候测完、达到什么标准就能发版”。入口标准通常是被测版本提交通过冒烟测试出口标准则是用例执行率100%、严重级别缺陷清零、遗留缺陷全部有评审结论。第二阶段测试设计。把计划落到可执行的层面。这里包括测试用例编写、测试数据准备、测试环境搭建。用例设计最重要的不是数量而是覆盖率。一个登录功能如果只写“输入正确密码登录成功”和“输入错误密码登录失败”两条用例那等于没写。至少要加上密码边界、大小写混淆、特殊字符、空格、超长输入、网络超时、反复点击提交等场景。第三阶段测试执行。按照用例执行记录实际结果发现实际结果与预期结果不一致时提交缺陷。这里有个纪律要遵守不要因为一个bug打断了当前的测试节奏就临时去探索别的功能除非你怀疑是系统性缺陷。执行过程中还要注意记录版本号、测试环境、测试数据这些信息在缺陷定位时至关重要。第四阶段缺陷管理。缺陷不是提交出去就完事。每一个bug都要有生命周期。我常用的缺陷流程是新建→指派→修复→验证→关闭。如果开发认为不是问题或者延期修就退回给测试写明理由和期望的版本测试再和项目组评议。在这个环节最重要的能力是写清楚“缺陷三要素”复现步骤、期望结果、实际结果。再加上环境信息和日志开发一看就明白。第五阶段回归测试。开发修复bug之后你不仅要验证这个bug修好了还要确认它没有把别的功能带崩。这就是回归测试。回归范围怎么定我一般从三个维度抓直接关联的功能比如你修了登录bug那登录和注册都要回归数据依赖的功能比如修改了用户表就得看用户信息相关模块以及改动代码涉及到的框架层能力网络请求、数据库连接这些底层的改动几乎全项目都要冒烟一遍。第六阶段测试总结。最后发布一个测试报告。里面要有总体的用例执行统计、缺陷分析按严重级别、按模块、按原因分类、风险评估结论是否建议发布、遗留问题说明。测试报告不是写出来给人看的它是项目决策的依据。如果测试报告只说“本次测试用例全部通过”那等于什么也没说要说“共执行用例200条发现严重缺陷5个已修复4个剩余1个因第三方接口未就绪建议灰度发布”这才是有效信息。5.2 用例设计中的核心方法等价类与边界值提到测试设计不能不提两个老掉牙但极其好用的方法等价类划分和边界值分析。等价类的思路是把输入域分成若干个“代表组”每个组里随便取一个值来测就行了因为同一个组里的值程序处理逻辑几乎一样。比如一个输入框规定手机号11位数字那有效等价类就是“11位纯数字”无效等价类包括“空”“小于11位”“大于11位”“非纯数字”。你不需要用10亿个数字去测那个有效类抽一个“13812345678”就够了。边界值分析则是抓住软件最容易出错的地方——边界的左右附近。因为很多程序员的判断逻辑是“小于等于/大于等于”写错一两个等号太常见了。所以对“11位手机号”这个规则边界值用例如下10位、11位、12位再加一个0位和一位非法字符。这一招在表单校验、分页、金额区间、时间范围里效果拔群。我面试的时候最常考的一个问题就是“如果输入条件是1到100你写几个边界值用例”只要回答1、2、99、100、0、101我就会认为这个人基础合格。5.3 缺陷报告的黄金格式缺陷报告描述得清不清楚直接决定开发能不能在五分钟内复现。我建议每个团队都统一一个模板至少要包含以下几项缺陷编号、缺陷标题、发现版本、发现环境、优先级、严重级别、复现步骤、期望结果、实际结果、附件日志/截图/录屏。标题的写法很关键不要写“登录功能有问题”这种废标题要写“在登录页输入已注册用户密码点击登录按钮后无响应页面卡死超过30秒”。看到这个标题开发和测试经理在列表中一眼就能判断这是不是严重问题。而正文的复现步骤一定要具体到你操作前的初始状态数据准备、前置条件、步骤一、步骤二、步骤三。很多人漏了“初始状态”开发照着步骤怎么都点不出bug最后一问原来是登录前需要先清缓存。这种沟通成本完全可以靠一个规范的模板消灭掉。6. 常见问题与面试高频考点新手最容易踩的坑6.1 初学软件测试的三个典型误区误区一以为测试就是点点点。这是最伤害行业认知的说法。如果软件只是点点点那产品为什么还要花高薪请测试工程师真正有经验的测试会从需求评审、用例设计、风险评估、自动化测试、性能分析、专项测试里找到自己的价值。点鼠标只是最表层的动作背后的思考才是报酬的落点。误区二不参与需求评审等到测试阶段才发力。很多新人怕被产品经理和开发笑话开会时一声不吭。但需求评审恰恰是测试最该发言的场合。你不需要装得很懂业务只要拿着“用户视角”去问几个为什么比如“这里的导入按钮支持哪些文件格式”“失败的记录会展示在哪里可不可以重新触发导入”“如果文件里有上万条数据会有性能要求吗”这一连串问题下来不仅需求被澄清了团队成员也会觉得这个测试靠谱。误区三收到开发“无法复现”就束手无策。这恐怕是测试新人最崩溃的一句回复。我的应对思路是这样的先去检查自己提交的缺陷里环境信息全不全看看是不是遗漏了特殊前置条件然后尝试在多个环境上复现比如换网络、换数据量、换设备型号如果实在复现不了就回退到旧版本看是否有同样行为或者把问题挂起留待观察。态度上不要和开发对立“那我就继续跟踪一有发现立刻同步你”永远比“你怎么就复现不了呢”管用。6.2 面试中关于这些概念的高频问题和回答思路在软件测试面试的现场这些基础概念被问到的概率是百分之百而且大部分都不需要你背概念而是看你怎么理解、怎么表达。问“什么是软件测试测试的目的是什么”不要只背定义要结合你的实际项目说。你可以回答软件测试是使用人工或自动手段来验证软件是否满足需求并在过程中发现缺陷、评估质量的过程。它的目的不只是为了找bug还为项目组提供质量评估信息帮助团队决定能否上线以及通过早期介入来降低修复成本。问“测试和调试有什么区别”这是个送分题但很多人答不准确。你得说测试是发现缺陷的验证活动目标是证明软件存在不符合预期的地方调试是在缺陷被确认后分析原因、定位错误、修改代码的研发活动。测试工作通常由测试工程师完成调试工作主要由开发工程师完成但两者会协作测试会提供日志、复现步骤辅助调试。问“你所在项目的测试流程是怎样的”面试官通常是想确认你有没有完整参与过项目。你要按照“需求评审→测试计划→用例设计→用例评审→测试执行→缺陷管理→回归测试→测试报告”这条主线描述在中间穿插一些具体数据和场景比如你负责模块的用例数、发现缺陷数、回归策略等。问“如果需求不明确你会怎么处理”建议回答先通过沟通澄清找产品经理确认业务规则再和开发讨论技术可行性如果还是无法明确就把假设条件写进测试设计并在评审会上提出。千万不要一个人闷头猜测然后盲目测试。问“请讲一个你发现的印象最深的缺陷。”不一定要讲技术多高深但要体现你的定位能力和沟通能力。比如讲一个偶现崩溃你通过多次复现、抓日志、对比新旧版本最终锁定是某个缓存数据未清理导致的。重点突出你怎么思考、怎么定位、怎么和开发协作。6.3 从基础到进阶我给新人的三条建议最后聊点实在的。如果你刚踏入软件测试这行我给你三条建议都是我踩过坑后才明白的。第一先把基础知识学到“能讲出来”的程度。定义、目的、生命周期、测试流程这些概念不要满足于“眼熟”试着对着屏幕自己讲一遍。能流利讲给别人听才叫真正掌握。这也是面试准备最扎实的方式。第二尽早接触至少一种自动化工具。手工测试是基本功但如果你想在这个行业扎根至少要会一种接口自动化工具或者UI自动化框架。不需要从很深的代码开始先从录制回放、接口断言做起慢慢理解脚本化的威力。自动化不能解决所有问题但它能把你从重复劳动里解放出来让你有精力去做更深度的探索性测试。第三养成日志思维。无论是web端还是嵌入式设备日志都是定位问题最重要的宝藏。提交bug时带上日志看完一条报错日志尝试理解它说的是什么了解你们项目里日志文件的存放位置和常用查看方式。我记得有一次带领团队测试一个物联网网关几十台设备同时接入时总有个别设备掉线。全组人百思不得其解最后就是靠串口日志里的时间戳发现设备在接入后第30秒有一个内存分配操作高负载时分配失败导致看门狗复位。日志不会骗人只看你愿不愿意花时间读懂它。我给新人的最后一句话很简单测试不是工序的末端而是质量思维的起点。你理解了定义和目的就不会把测试当任务你理解了需求和生命周期就不会把自己当执行者你理解了调试和流程就不会在问题面前手足无措。把这条线捋顺了你的测试之路会走得比大多数人稳。
返回列表