资讯详情

资讯详情

软件测试入门:从测试思维到用例设计与缺陷管理

很多人一提到软件测试脑子里蹦出来的词就是“点点点”“门槛低”“随便点点就能上班”。说实话这种印象至少在五年前就已经过时了。我这些年面试过不少转行过来的新人也带过一批刚毕业的实习生发现一个很普遍的现象很多人看了几篇教程、背了一堆八股文就来投简历结果一上项目就露馅——需求文档看不懂、用例设计没逻辑、提个bug都说不清楚复现步骤。测试这行入门确实不难但“会测”和“测明白”之间隔着一条很大的沟。这篇是软件测试入门系列的第一篇主要面向零基础、或者已经入行但还在“野路子”阶段的朋友。我会尽量把理论和实践串在一起讲先弄清楚测试到底在解决什么问题再把测试的核心概念、用例设计、缺陷管理这些基础脉络理清楚最后聊一聊AI测试、嵌入式测试这些新方向对入门者意味着什么以及零基础怎么准备项目经验和面试。内容不会让你背一堆名词就完事重点是帮你建立一套可以真正用到工作中的测试思维。1. 别急着学工具先搞懂测试到底在解决什么问题1.1 一个登录功能就能看出你会不会测试我给你出一道我面试新人时必问的题有一个登录功能用户名要求4-16位字母或数字密码要求6-12位字符密码连续输错5次锁定账号。你会怎么测很多新人的回答是输入正确的用户名和密码点登录能登录成功就行。有的会补充一句账号不存在的时候要有提示。然后就没了。这种回答基本暴露了一个问题——还在用开发思维看测试以为测试就是“证明软件能用”。真正会测试的人脑子里第一时间冒出来的是用户名3位会怎样、17位会怎样、带下划线会怎样、全是数字会怎样、密码输错4次和5次的边界在哪、锁定了是锁多久、锁定之后第一次输对还能不能登录、复制粘贴能不能触发校验、浏览器自动填充的内容算不算用户输入……你看同一个功能不同的人看到的是完全不同的世界。测试的根本目的不是“验证它能用”而是“找出它在什么情况下不能用”。这个思维一旦建立起来后面学的所有方法和技术才有意义。1.2 测试的目标尽早、尽可能经济地发现缺陷软件测试领域有一个比较通行的定义来自IEEE在规定的条件下对程序进行操作以发现程序错误衡量软件质量并对其是否能满足设计要求进行评估的过程。注意关键词——发现程序错误。测试不是为了证明软件没有问题而是为了尽可能多地把问题找出来。这里有一个现实约束测试不可能穷尽。一个简单的登录功能输入组合就可能有几百万种更别说一个完整系统里的所有模块、所有流程、所有分支。所以在有限的资源和时间下我们要做的是通过设计用例、排优先级用尽可能少的成本发现尽可能多的缺陷。还有一个行业常识值得新人记住缺陷发现得越晚修复成本越高。在需求阶段发现一个逻辑问题改一页文档可能就完了到了编码阶段要改代码到了测试阶段要回归、要验证要是上线以后才被用户发现那就是事故级别的成本了。所以我一直跟新人强调测试不是开发完之后的“收尾工作”而是应该全程介入的。这也是为什么现在很多团队强调测试左移把测试活动提前到需求评审和设计评审阶段。1.3 为什么测试往往比开发更需要“较真儿”开发者的任务是让代码跑起来实现预期功能测试者的任务是千方百计让代码跑不起来把隐藏的问题暴露出来。这两种思维方式天然就是对抗的。我见过很多转行的新人刚开始写用例的时候特别“善良”总是不自觉地假设“用户会正常操作”不敢设计那些刁钻的输入。这种心态要尽早纠正。真实用户从来不会按你的预期操作他们会输入空格、输入emoji、狂点按钮、断网再恢复、开两个窗口同时提交……你不是在跟软件过不去你是在替用户“踩坑”在没有造成损失之前把坑找出来。提示千万不要一上来就学自动化测试工具。工欲善其事必先利其器这句话没错但前提是你得先知道“事”是什么。工具是放大器如果你本身的测试思维是空的放大之后还是空。先建立思维再学工具这个顺序不能乱。2. 测试的核心概念验证与确认、测试级别、测试类型的正确理解顺序2.1 验证与确认两个你迟早会遇到的词做测试时间久了你会经常听到两个英文词Verification和Validation。中文通常翻译成“验证”和“确认”。看起来差不多其实是两个维度。验证Verification回答的问题是我们有没有把产品做对也就是对照需求文档、设计文档检查实现结果是否与规格说明书一致。确认Validation回答的问题则是我们有没有做对的产品也就是站在用户角度检验软件是否真正满足了业务需求。举个例子。业务方提出要做一个“用户连续签到7天送100积分”的功能开发按照设计文档做出来了功能完全符合设计文档的描述——这是验证通过。但业务方真实的需求其实是“提高用户日活”连续签到7天只是运营想出来的一个手段实际上线后发现用户根本不买账日活没有提升——这就是确认失败了。很多测试新手在项目中容易忽略确认这个层次只管对照文档做验证不质疑需求本身。但一个成熟的测试人员或者说一个合格的质量保障人员需要在需求评审阶段就提出“这个功能真的能解决用户的问题吗”这类问题。这不是越权而是质量保障的一部分。2.2 测试级别单元、集成、系统、验收从软件的构建过程来看测试分为四个级别每个级别的测试对象、执行者和关注点都不一样。很多新人把“单元测试”理解成开发的事觉得跟自己没关系这是个误区。测试级别测试对象主要执行者核心关注点常用手段单元测试函数、方法、类开发人员为主代码逻辑、分支、边界条件JUnit、pytest、CppUnit集成测试模块之间的接口与交互测试与开发协作数据传递是否正确、模块间是否兼容接口测试工具、自研脚本系统测试整个系统测试团队整体功能、性能、安全、兼容性等手工测试、自动化测试、性能工具验收测试交付物用户、产品经理、测试是否满足业务需求和用户预期Alpha/Beta测试、UAT很多人只把“系统测试”当成测试人员的活其实真正成熟的团队里测试人员会参与代码评审会用代码层面的逻辑来反推测试用例的设计。比如你在单元测试阶段发现开发对空指针的处理有隐患你就可以在系统测试阶段专门设计对应的用例来验证。测试级别不是互相割裂的而是层层递进的关系。2.3 测试类型功能、性能、安全、兼容性、易用性、可靠性测试类型回答的是另一个问题测哪个方面。如果把软件比作一辆车功能测试是检查方向盘、刹车、油门能不能正常工作性能测试是看这辆车满载、爬坡、高速行驶时表现如何安全测试是检验车门锁、防盗系统靠不靠谱兼容性测试是看看这辆车在不同的路况、天气下能不能开易用性测试是让一个新手司机上车看他要多久才能搞明白怎么启动。具体到实际工作中最常见的分类大概是这样的功能测试验证业务流程是否正确比如登录、下单、支付、退款。性能测试验证系统在并发压力下的响应时间和稳定性通常会关注P95响应时间、吞吐量、资源占用率。安全测试验证是否存在SQL注入、越权访问、XSS攻击等漏洞Web系统尤其需要关注。兼容性测试验证软件在不同浏览器、不同操作系统、不同设备上的表现。易用性测试站在用户角度评估操作路径是否顺畅、提示是否清晰。可靠性测试让系统长时间运行观察是否出现内存泄漏、进程崩溃、数据错乱等问题。这里要特别提醒一点测试类型和测试级别是两个维度不要混在一起。很多人写简历喜欢写“负责系统测试”但其实系统测试这个级别下几乎覆盖了所有类型。你在实际项目中应该是先确定测试级别再在对应级别里设计不同类型的用例。2.4 静态测试和动态测试程序没跑起来也能发现问题再补充一对概念静态测试和动态测试。动态测试很好理解就是运行程序、输入数据、观察输出。静态测试则是在程序不运行的情况下通过代码走查、代码审查、静态分析工具来发现缺陷。新手经常忽略静态测试觉得“代码没跑怎么知道有问题”。但实际上很多缺陷在静态阶段就能发现比如未初始化的变量、潜在的空指针引用、死代码、安全漏洞模式等等。行业里有一组长期统计的数据静态测试发现缺陷的成本远低于动态测试。尤其是在嵌入式、军工、医疗、金融这类对安全性和可靠性要求极高的领域静态测试的占比非常高。3. 测试用例设计等价类、边界值与场景法的组合拳3.1 为什么不能“想到哪测到哪”很多刚入行的测试人员拿到一个功能就坐在电脑前开始点想到什么点什么。这种“探索式”的做法不是不行但它有一个致命问题不可复现、不可衡量、不可追溯。你今天点了这十个地方明天新来一个人可能点的是另外十个地方覆盖率完全取决于个人心情。测试用例的本质是把“测什么、怎么测、预期是什么”变成一份可执行、可跟踪、可评估的文档。一条完整的用例至少包含输入数据、操作步骤、预期结果、实际结果。写好用例你就完成了测试工作的一半。3.2 等价类划分把海量输入变成少量代表回到登录那个例子。用户名要求4-16位字母或数字理论上合法输入就有无数个组合你不可能都测一遍。等价类划分的思想是把输入域划分成若干个集合每个集合里的数据对测试来说是“等价”的我们只需要从每个集合里取一个有代表性的数据来测。对于这个需求可以划分出两类有效等价类和无效等价类。有效等价类长度在4-16位之间、只包含字母和数字的输入。无效等价类长度小于4位的、长度大于16位的、包含字母和数字以外字符的、为空的。我见过很多新手写用例有效等价类写得特别全无效等价类只写一两条。这是本末倒置。无效等价类才是发现缺陷的重点区域因为开发对所有可能的“非法输入”都要做处理而处理逻辑恰恰是最容易写漏、写错的地方。3.3 边界值分析绝大多数bug都藏在边界上边界值分析是等价类划分最好的搭档。为什么边界容易出bug因为开发写判断条件时用的是、、、差一个等号、差一个数字代码逻辑就完全不一样。这是程序员写代码时最容易翻车的地方。还是那个登录例子。用户名4-16位你需要测的典型长度是3位、4位、15位、16位、17位。密码输错5次锁定你要测的是输错4次、输错5次、输错6次、以及输错4次之后第5次输对。数值类型的输入也一样取最小值、比最小值小一点、比最小值大一点、标准值、最大值、比最大值大一点、最大值减一。这七个值基本能把边界问题覆盖住。提示边界值分析不是只测边界就行边界附近的正常值也要测否则你无法判断“这个bug是边界特有的还是所有输入都有的”。另外有些边界不是肉眼可见的比如列表加载的第999条和第1000条、分页的最后一页只有一条数据、上传文件的大小限制在临界值附近这些都需要结合业务场景去挖掘。3.4 场景法从用户的真实操作路径出发等价类和边界值是在解决“单个输入”的测试问题但真实用户是走流程的。用户不会只输入一个用户名就结束他们会登录、搜索、加购物车、下单、支付、查物流。场景法的核心就是从用户的实际业务操作路径出发设计端到端的测试场景。以电商下单为例一个完整场景可能是登录 → 搜索商品 → 加入购物车 → 结算 → 填写收货地址 → 提交订单 → 支付 → 收到支付成功通知。在测试时你需要在流程的每一步考虑异常分支搜索时库存显示有货但点击下单时提示库存不足、优惠券正好过期、支付超时、重复提交订单、物流信息不同步等等。这些不是靠等价类划分能覆盖到的必须站在用户视角走完整流程。场景法特别适合系统测试和验收测试阶段。我建议新人每测一个模块先别急着设计用例而是花半天时间把这个模块的用户操作路径画出来纸上画就行把主流程、备选流程、异常流程都列出来再按流程去设计用例。这样测出来的东西逻辑完整覆盖也全面。最后再补充一个被低估的方法错误推断法。说白了就是凭经验和直觉猜哪里容易出错。比如除数为0、查无数据、网络超时、连点两次提交、断网重连。这种“测试直觉”看起来很玄其实是经验积累出来的。刚开始没有感觉没关系多测、多踩坑、多复盘慢慢就有了。4. 缺陷管理从发现bug到关闭bug中间隔着一整套流程4.1 bug的完整生命周期很多新人以为提bug就是把问题往工具里一填就完事了其实一个bug从提交到关闭中间的状态流转本身就很有门道。一个典型的bug生命周期是这样的新建New→ 开发确认并打开Open→ 修复Fixed→ 测试验证通过Verified→ 关闭Closed。中间还可能遇到几个分叉开发看完说“这不是问题”拒绝处理Rejected测试验证不通过重新打开Reopen确定是问题但当前版本不修、推迟到下个版本Deferred跟已有缺陷重复Duplicate。状态含义当前处理人New测试提交缺陷报告测试负责人/开发负责人Open开发确认是有效缺陷开始处理开发人员Fixed开发已完成修复待验证测试人员Verified测试验证修复有效待关闭测试负责人Closed缺陷处理完毕测试人员Rejected开发拒绝理由需要说明测试人员Reopen验证不通过或缺陷复发开发人员Deferred确认为缺陷但延期处理产品/项目负责人值得多提一句的是Rejected。开发说“这不是bug”的时候新手最容易慌要么直接改状态要么跟开发吵起来。正确的做法是先自己对着需求文档把逻辑理一遍如果确实是缺陷就把需求依据、复现步骤、实际表现和预期结果摆出来心平气和地沟通。测试不是跟开发争输赢而是为了让产品更好这个心态摆正了很多分歧都能解决。4.2 严重程度和优先级两套维度别混在一起用缺陷报告里有两个字段最容易被新手混淆严重程度Severity和优先级Priority。严重程度衡量的是缺陷对系统或者用户的影响程度。通常分四档致命系统崩溃、数据丢失、主流程不可用、严重核心功能不可用但可绕过、性能严重劣化、一般功能异常但影响较小、轻微界面错别字、UI样式问题。优先级衡量的是修复的紧迫程度分紧急、高、中、低四档。关键区别在于严重程度高的bug不一定优先级高严重程度低的bug也不一定优先级低。举个例子一个界面上的错别字严重程度是轻微但是品牌方要求上线之前必须改那它就是高优先级一个极端情况下才会触发的崩溃严重程度可能是严重但触发概率极低在版本迭代压力下很可能被延期到下个版本处理。优先级通常是由测试负责人和产品经理一起决定的但测试人员要能够在缺陷报告里给出合理的建议并说明理由。这才是一个专业测试该有的素养。4.3 一份好的bug报告应该怎么写Bug报告是测试人员最重要的“作品”直接决定开发能不能高效理解并修复问题。我见过太多低质量的bug报告标题写“登录有问题”复现步骤写“打开系统输入账号密码点登录就报错了”——这种报告开发看了想打人。一份合格的bug报告应该长这个样标题【登录页面】用户名输入17位字符时页面提示“用户名过长”但点击登录后仍能进入主界面 环境Chrome 12xWindows 11测试环境 前置条件已注册账号用户名为8位合法字符 复现步骤打开登录页面输入用户名admin1234567890123417位输入正确密码点击“登录”按钮 实际结果页面出现红色提示“用户名过长”同时跳转至首页用户处于已登录状态。 预期结果提示“用户名过长”停留在登录页面不允许登录。 附件截图/录屏/日志文件写好bug报告的核心原则只有一条让看到报告的开发不用再问你任何问题照着步骤做就能复现。环境信息要写清楚数据要给完整多条操作步骤要一条一条列出来结果和预期要分开描述能附截图就附截图、能附日志就附日志。遇到那种随机性出现、不好复现的bug更要耐心记录触发场景、操作频率、当时的系统状态尽量把线索留给开发。4.4 开发说“这不是bug”怎么办这里多展开一点。处理“不是bug”的争议本质上是在处理“测试判断”和“开发认知”的信息差。常见的情况包括开发觉得这个行为是刻意设计的需求文档本身写得模糊开发认为测试的数据不合法所以不属于bug还有测试在错误的环境版本上发现了问题实际上已经修复了。我的处理流程是第一步自己先回去查需求文档和设计文档把涉及需求原文找出来第二步如果需求文档没有明确写找产品经理确认预期行为第三步把确认后的结论跟开发沟通沟通时拿依据说话而不是“我觉得”。如果最终确认是测试环境问题或者理解偏差那就在缺陷管理工具里备注清楚关闭或更新状态。测试新手要记住你提的bug被拒不一定是你的问题更不一定是开发的问题很多时候是需求定义本身就不清晰。这也是为什么我前面强调测试要尽早介入需求评审。5. AI测试、嵌入式测试和求职准备入门阶段可以留意的三个新方向5.1 AI软件测试是噱头还是新机会最近两年AI软件测试是很热的话题。很多自动化测试的岗位要求里开始出现“利用AI生成测试用例”“使用智能断言”“搞过AI辅助测试平台”之类的描述。对新人来说需要搞清楚一件事AI到底在测试的哪些环节真正有用哪些只是包装出来的概念。从我实际接触的情况看AI在测试领域比较实在的应用有三个方向。第一是AI辅助生成测试用例从需求文档、接口定义、历史缺陷数据中学习自动生成候选的测试用例和测试数据能够有效提高用例覆盖率降低编写成本。第二是UI自动化的智能维护传统UI自动化最头疼的是页面元素变更导致脚本大批量失效现在有一些工具能够智能识别相似元素、自动修复选择器大大降低了脚本维护成本。第三是缺陷预测通过分析历史代码变更、缺陷密度、模块复杂度预测哪些模块最有可能出问题帮助测试排优先级。这些技术目前还谈不上取代测试人员它们更像是测试人员的杠杆。对入门者来说我的建议很直接先扎扎实实把手工测试、用例设计、缺陷管理这些基本功拿捏好然后在自动化测试实践中接触一些AI辅助工具理解它们的能力边界。别把AI当成万能药面试时如果被问到AI测试能说出“AI在哪些环节提效、哪些环节还有局限”比背一堆新概念要好太多。5.2 嵌入式软件测试门槛更高需求也更大如果觉得通用软件测试竞争激烈嵌入式软件测试是一个值得留意的大方向。这个领域的门槛比纯Web测试高不少但相应的薪资和不可替代性也更高。嵌入式测试的特殊之处在哪里第一软件和硬件强绑定很多bug只在特定硬件条件下复现第二调试手段受限甚至没有完整的日志系统定位问题很困难第三一些嵌入式系统对实时性和稳定性的要求极高需要专门的测试方法。入门嵌入式测试比较靠谱的路径是C语言基础 软件测试基础 对主流嵌入式开发板的基本了解。在技术层面嵌入式领域用的单元测试框架比如Unity、CMock、打桩stub替换硬件依赖、HIL硬件在环测试都是通用测试思维在特定领域的具体呈现。如果有条件自己买一块开发板做一个温湿度采集、LED控制之类的简单项目把测试用例和缺陷记录完整做出来就已经是一份很有竞争力的简历项目了。市面上关于嵌入式测试的实战类资料不算多能找到一些讲方法、讲案例、专门提供模板的参考书系统性读一遍会少走很多弯路。5.3 零基础怎么准备项目经验和面试“没有项目经验”几乎是每个零基础转行者最头疼的问题。这里分享一条我在实际中验证过很多次的路线。第一步选一个开源项目。GitHub上有很多适合拿来做练习的Web项目比如开源电商系统、开源笔记应用。把它们拉下来在本地跑起来先当用户用一遍然后为它设计测试用例、执行测试、提交bug报告。这个流程和真实工作几乎一模一样。重要的是把整个测试过程沉淀成文档包括项目背景、范围、测试计划、用例集、缺陷记录、测试总结这就是你的项目经验。第二步自己搭一个带登录注册功能的小应用哪怕用现成脚手架都行。在这个小项目上你可以做三层测试手工功能测试、接口级测试、UI自动化脚本。这样写简历时呈现的是一个完整的技能闭环而不是“熟悉软件测试流程”这种空话。简历上的项目经验最好具体到数字比如“负责XX模块设计45条测试用例发现12个有效缺陷其中高优先级3个”。面试的常见题目基本就那些软件测试的定义和目的是什么测试流程是什么登录功能怎么测等价类和边界值怎么用bug等级怎么划分测试报告包含哪些内容性能测试关注哪些指标这些题目本身不难难的是你能不能结合自己做过的项目讲出细节。面试官问“登录功能怎么测”他想要的不是一个标准答案而是你的思考路径——你考虑过哪些输入、哪些边界、哪些异常场景、为什么这么考虑。提示我特别不建议背“面试必背100例”之类的题目合集。不是说刷题没用而是如果你没有真实做过练习背来的答案一被追问就露馅。把项目做扎实然后把项目里的细节烂熟于心面试效果会好得多。5.4 给零基础的学习路线建议最后给你一条比较完整的自学路线按顺序推进即可不需要每个阶段都精通但每个阶段都要有产出。测试基础理论定义、原则、流程、级别、类型、用例设计方法。质量体系相关不要只停留在“测试”可以看看质量管理、CMMI、敏捷开发这些概念。测试管理工具禅道、Jira或Tapd至少熟练使用一个能独立创建用例和执行记录。数据库基础SQL的增删改查是必会的因为你查询测试数据、核对数据一致性都得用。Linux基础查看日志、操作文件、部署测试环境都会用到常用命令。接口测试学习HTTP协议掌握Postman或Apifox的使用能独立设计接口测试用例。自动化测试选一条主流技术栈比如JavaSelenium、Pythonpytest先把框架跑通再做封装。性能测试掌握JMeter的基本用法理解并发、吞吐量、响应时间这些概念。每一步完成之后最好记录下来哪怕只是写一篇文章总结心得。我在带新人的时候最常说的一句话是测试不是把软件点坏而是用尽可能少的人力物力把风险暴露在发布之前。入门阶段千万别被自动化、性能测试这些看起来很酷的词汇带跑先把测试设计和缺陷管理这两件事做扎实后面学什么工具都快。这个系列后续我还会继续整理测试流程怎么落地、接口测试怎么做、自动化框架怎么搭以及性能测试的实战经验如果你正处在入门阶段建议先找个开源项目把这篇里的等价类、边界值、场景法、bug报告都实际跑一遍。你一定会发现真正动手做一遍比看十篇教程都有用。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →