ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

功能测试在软件开发周期中的作用:用户视角的质量守护

功能测试在软件开发周期中的作用:用户视角的质量守护 先抛一个很多新入行的测试同学都问过我的问题功能测试在软件开发周期中的作用到底是什么有人觉得它就是“点点点”有人觉得它是软件质量的最后一道防线还有人觉得它是最容易被替代的岗位之一。这些说法都有点道理但都不完整。我在软件测试这一行干了十多年从最基础的“点点点”做到整个质量体系的搭建面试过上百号测试工程师也带过不少新人。每次被问到“功能测试的作用”这种题目我一般不会直接背定义而是会反问一句“如果没有功能测试你这个软件敢不敢直接上线”大概率没人敢拍胸脯保证。原因很简单功能测试是唯一站在用户视角、用真实业务逻辑去验证整个系统的环节它验证的不是代码写得对不对而是这个软件在用户手里能不能正常干活。这篇文章我不会写成教科书式的概念罗列而是用一线工程师的视角把功能测试在软件开发周期各个阶段的具体作用、实际操作方法、以及我踩过的坑都讲清楚。不管你是准备找测试工作的新人还是在做开发想了解测试怎么配合的老兵都能从中得到点可落地的经验。1. 先搞清楚功能测试到底在测什么1.1 “功能测试”的定义和常见误解功能测试字面意思就是验证软件功能是否满足需求。但这里有个很容易被忽略的点满足的是“需求”不是“代码”。什么意思呢代码是程序员按照自己的理解写出来的需求是产品经理按照用户场景提炼出来的这两者之间天然存在信息损耗。功能测试就是用来检测这种损耗的。最常见的误解有两个。第一个误解是“功能测试 全部测试”。很多人把测试工作等同于功能测试其实不是。完整的测试体系里有单元测试、集成测试、接口测试、性能测试、安全测试、兼容性测试、易用性测试等等。功能测试只负责验证业务功能逻辑正确它是整个测试体系里的主干但不是全部。第二个误解是“功能测试就是最简单的谁都能干”。这个说法最容易让新人产生错觉。我见过太多测试工程师用例设计就停留在“我按正常路径点一遍”的水平一旦遇到异常场景、边界场景、组合场景基本靠猜甚至靠研发提醒。真正高水平的功能测试考验的是对业务的理解深度、对用户场景的还原能力、以及对系统上下游关系的判断力。同样的功能资深测试能写出上百条用例新人只能写二十条测出来的风险等级完全不同。1.2 功能测试在测试体系中的位置在软件开发周期里测试活动是分层的。最底层是单元测试由开发自己写验证单个函数或方法的行为往上是集成测试验证模块之间的接口交互再往上是功能测试验证整个系统按业务需求跑通最外层还有性能、安全这一类专项测试。功能测试在这套体系里的位置比较特殊它是唯一以“用户操作视角”而非“代码视角”设计的测试活动。单元测试可能关心一个排序函数能不能正确排序功能测试关心的是用户点“排序”按钮之后页面上的列表有没有按照预期重新排好。用生活化的例子说单元测试就像是检查汽车发动机里的每个零件是否合格功能测试则是把车开到路上看看踩油门能不能跑、踩刹车能不能停、打方向盘能不能转弯。零件合格不等于整车能开这就是为什么功能测试在整个软件开发周期里不可替代。1.3 它和单元测试、集成测试的分工边界我刚带团队的时候经常遇见一种混乱开发说“我单元测试都过了这功能肯定没问题”测试觉得“反正后面有功能测试兜底开发前期的测试做得粗糙点也没事”。这两种心态都很危险。单元测试、集成测试和功能测试不是上下级关系而是互补关系。单元测试在代码层面快速反馈执行成本低发现问题早集成测试保证模块间的衔接不出岔子功能测试站在业务角度做最终验收。理想状态下三层测试的比例应该呈金字塔形底层多、上层少。但在实际项目里我见过太多倒金字塔——单元测试没写几个集成测试全靠联调时靠开发自测最后把全部压力堆到功能测试这一层。结果是什么呢功能测试测出来的bug定位定位半天改一个地方牵出一串问题因为前期的质量债都积压到了最后。这种做法短期看着“省时间”实际上是把风险全部延迟到上线前集中爆发极其不划算。2. 贯穿整个开发周期功能测试在每个阶段的具体作用很多人把功能测试理解成“开发完了才开始测”这是对功能测试作用的最大误读。实际上在管理成熟的项目组里功能测试的动作从需求阶段就开始了而且越早介入效果越好。2.1 需求分析阶段的“测试思维前置”功能测试在需求阶段的核心作用是帮产品经理和研发团队提前发现需求里的“坑”。好的测试工程师会习惯性地从三个角度审视需求文档这个需求能不能测怎么测测完的标准是什么可测性是我最看重的一点。一个需求如果写得含糊不清比如“当网络不佳时需要给用户合理的提示”“不佳”是什么标准是延迟300毫秒还是丢包率超过百分之多少“合理”的提示又长什么样如果需求阶段不把这些定义清楚到了功能测试阶段必然扯皮。测试说“现在这网络状态提示不合理”开发说“我觉得挺合理的”两边吵到最后只能找产品仲裁一来一回周期就拖了。具体做法上我自己习惯在需求评审时拿着测试用例的思路去逐条过需求条目。不是把每条需求都写进正式用例而是先在脑子里过一遍“这功能正常路径是什么、异常路径是什么、边界条件是什么”。凡是发现需求里没定义清楚的地方当场标记出来要求产品答复。这个动作看着简单长期坚持下来对项目质量提升特别明显。2.2 设计与开发阶段从旁观察到深度介入开发阶段功能测试有两件重要的事要做一是继续完善测试用例二是搭建测试数据和测试环境。完善用例这件事很多测试新人做得不够。他们喜欢等开发全部完成后再集中写用例结果就是开发延期了测试时间被压缩用例写不完只能草草执行一遍核心路径就上线。这其实是在帮倒忙因为越到后期bug的修复成本越高。正确的做法是在开发阶段就同步把用例写得七七八八开发一提测就能马上进入执行不浪费一秒钟。搭建测试环境这件事更是被长期低估。功能测试看着是在执行用例实际上隐形工作量都在测试数据和环境准备上。比如测一个订单系统你得准备不同状态的订单数据已下单、已支付、已发货、已取消、退款中。这些数据不提前造好等测试执行时现造一天能浪费好几个小时。测试环境的稳定性也常被忽视。我接过一个项目测试环境三天两头被开发拿来联调导致测试数据被污染功能测试工单是乱的。最后我立了个规矩联调环境单独拉一套测试环境进出都要报备执行测试前必须检查环境状态。规矩立起来之后回归效率提升了将近一倍。2.3 系统测试阶段功能验收的主战场到了系统测试阶段功能测试就进入主战场了。这个阶段的目标非常明确在所有功能达成需求的前提下尽可能多地发现缺陷并且推动修复。在排测试计划时我会先排三件事优先级、依赖关系和风险点。优先级很好理解凡是核心业务流程比如电商的下单支付流程排在最前面边缘功能往后放。依赖关系指的是哪些功能必须等其他功能完成才能测比如支付功能必须先有订单功能这类串行关系要在计划里体现出来。风险点则是指哪些模块改动频繁、哪些模块技术复杂度高、哪些模块历史bug多这些模块要留出足够的测试时间。测试执行的节奏也有讲究。新产品提测的第一轮我会要求团队优先执行冒烟测试也就是把产品最核心的路径快速过一遍比如登录、首页加载、关键流程跑通。冒烟测试都过不了的版本直接打回给开发不值得浪费全部时间去做完整执行。很多团队不重视冒烟测试拿到版本就全员开测结果主流程都走不通所有人都在无效工作。2.4 上线与维护阶段回归测试是“安全网”软件上线只是功能测试工作的一部分甚至可以说真正的挑战从上线那一刻才开始。因为用户环境千奇百怪测试环境永远无法完全模拟实际情况。线上出了问题功能测试要做的是快速排查、确认影响范围、验证修复方案并且每次修复后都要补充对应的回归用例。回归测试的策略也需要思考。传统的回归是全量回归把测试用例全部跑一遍好处是放心坏处是耗时。敏捷模式下全量回归往往不具备现实条件所以我会采用“全量回归 精确回归”的组合策略核心业务流程做全量回归改动相关模块做精确回归两者相加既能保证质量又能控制时间。另外线上问题的复盘我建议测试工程师一定要参加。复盘重点不是追责而是弄清楚三个问题为什么这个bug没被测试发现是测试用例缺失还是测试数据没覆盖还是测试环境不具备条件下次如何改进踩过坑的测试工程师成长速度远比从不复盘的人快。3. 功能测试的落地方法从需求到用例再到执行3.1 测试用例设计把业务逻辑拆成可验证的步骤功能测试的核心资产是测试用例。用例设计得好不好直接决定测试的覆盖程度。我见过一些新人的用例就是把操作说明写一遍“点击添加按钮弹出添加窗口输入信息点击保存保存成功”整个用例就这么完事了。这种用例没有任何问题发现能力因为它没考虑任何异常情况。好的用例至少要包含五个维度正常路径、异常路径、边界条件、数据组合、业务规则。拿一个最常见的登录功能举例正常路径是输入正确用户名密码能登录异常路径包括密码错误、用户不存在、账号被锁定边界条件包括密码长度刚好在最小值、最大值以及超过最大值一位数据组合是不同输入框的组合交叉比如用户名有空格、密码前后有空格等业务规则则包括连续输错几次触发锁定、登录成功后有没有跳转正确页面等。有个小技巧我经常教新人每设计一条用例就问自己一个问题——“如果用户在这里不按我预想的方式操作会发生什么”这个问题一出来用例数量就会成倍增长而且每条都是真实有效的。3.2 经典用例设计方法边界值、等价类、场景法从理论层面讲功能测试用例设计有几个经典方法我在这里用最浅显的方式说明。等价类划分的思路是把无数种输入归成几类从每一类里取一个代表值去测试。比如一个输入框限制输入1到100的整数合法输入是一整个类别小于1和大于100是另外两个类别。理论上测试设计只要覆盖这三个类别的代表值就不需要每个数字都测一遍。这个方法的本质是用最少的用例覆盖最多的可能性。边界值分析和等价类划分通常是搭配使用的。因为大量bug都出在边界附近1到100的限制里1和100容易出现等于判断错误0和101容易出现越界判断缺失。我见过太多系统99能过、100被拦截101反而能通过全是在边界上踩的坑。场景法更贴近用户真实操作。它不局限于单个功能点而是把一连串操作串联起来模拟用户真实的使用路径。比如电商下单是个场景搜索商品、查看详情、加入购物车、进入结算页、选择地址、选择支付方式、确认支付、查看订单。这一整条链路中间任何一个环节出问题都会导致整个场景失败。场景法能发现单点用例发现不了的集成问题是我在核心业务流程测试里最依赖的方法。3.3 从手动到自动化什么时机引入最合适功能测试要不要自动化是很多团队纠结的问题。我的观点始终是先手工跑通再考虑自动化而且不是所有用例都适合自动化。适合自动化的功能测试用例有三个特征执行频率高、结果判定明确、环境比较稳定。比如登录、注册、订单查询、列表翻页这些基础用例每次版本迭代都要回归非常适合做成自动化。不适合自动化的用例如视觉验证、复杂的异常场景、需要大量主观判断的操作做自动化反而会徒增工作量。我在项目中见过不少团队花了一两个月搭自动化框架最后因为用例选择不当维护成本远超收益自动化变成了“自动找事”。初学自动化的人我建议从接口测试入手因为接口测试比UI自动化稳定得多执行速度也快得多回报周期短容易建立信心。UI自动化可以等团队成熟后再逐步引入不要一上来就啃最硬的骨头。4. 实际项目中的功能测试实战过程4.1 从0到1设计一个智能照明控制系统的功能测试方案前面讲了不少方法现在拿一个真实度比较高的项目来串一遍完整流程。我有一个朋友做智能家居硬件他们做了一个基于单片机的智能照明控制系统核心功能包括定时开关灯、亮度调节、远程控制、环境光感应联动。这类系统有一个特点硬件和嵌入式软件高度耦合测试时既要关注单一功能又要关注异常场景的稳定性。拿到这个项目后我建议的功能测试方案是这样拆解的。第一梳理用户场景。智能照明系统的用户不只是“在手机上点一下开关”这么简单还包括用户不在家时通过手机App远程开关灯用户设定每晚10点自动关灯用户希望灯能根据室内光线亮度自动调节。三个场景对应定时、远程控制、光感应三个功能模块。第二针对每个功能模块走一遍功能测试用例设计的常用方法。以定时开关灯为例正常路径是设定时间到后灯按设定状态开启或关闭。边界条件包括设定时间为00:00、23:59、跨天的时间段设置时长为1分钟、最长可设时长反复修改定时时间后原来已生效的定时是否被正确取消。异常场景包括系统断电重启后定时任务是否还能生效系统校时后定时任务是否受影响用户在定时任务生效时手动开关灯定时任务是否还会执行。第三关注硬件和软件交互的稳定性。单片机系统容易出问题的地方在于异常容错。比如断电重启后的状态恢复这在功能测试里很容易被漏测。我的处理方式是专门设计一组“断电重启”用例在不同操作状态下断电重新上电后检查系统行为是否正常。状态包括正常亮灯时断电、定时执行中断电、远程控制过程中断电等。这些用例在其他纯软件系统里不需要但在软硬件一体的项目里至关重要。第四建立测试结果记录体系。每一条用例执行完要记录实际结果、预期结果的差异、影响范围、出现的环境条件。很多测试人员执行bug复现只会写“偶现bug”但从不记录操作时间、网络状态、执行环境。在我给这套智能照明系统写方案时就特别强调嵌入式系统出现问题现场信息越详细研发定位越快。一条带时间和日志的bug描述能节省研发小半天的排查时间。4.2 测试过程还原与用例执行记录实际执行过程中我一般会要求测试人员保留三类记录用例执行记录、缺陷记录、以及环境变更记录。用例执行记录要包含用例编号、执行时间、测试版本号、执行结果。如果用例执行失败尽快把失败步骤和预期结果截图方便复现。很多测试人员漏掉执行时间但在软硬件系统里执行时间往往是定位问题的关键线索。比如系统每天凌晨2点有个定时任务你白天测出异常晚上再复测却发现恢复正常那这个bug大概率跟定时任务或者系统资源释放有关。缺陷记录要遵循“一条缺陷一条记录”的原则。我见过不少新人把多个问题写在一张缺陷单里说你帮忙改一下结果开发改完这个忘了那个最后还要来回追问。典型的功能测试缺陷描述我建议包含前提条件、操作步骤、实际结果、预期结果、发现版本、发现环境。如果附带日志样本、界面截图那就更理想了。环境变更记录是我反复强调的一条却总是被忽视。测试环境里部署了什么版本、数据库做了什么变更、有没有其他团队在同时使用这些信息都要有一个可查的记录。实际项目里数据被污染、环境被占用导致测试结果误判七成都跟环境变更没有记录有关。4.3 功能测试执行中的优先级把握测试执行不是把用例从头到尾跑一遍而是要懂得排优先级优先保证核心业务质量。最高优先级是正常路径主流程这是系统能不能用的底线其次是核心功能的异常处理比如支付失败、连接超时这类用户高频遇到的情况再其次是次要功能的正常和异常测试最后才是UI细节、文案调整这类低风险项。这里有一个容易被新手忽视的点执行每一轮的测试策略要动态调整。第二轮测试不应该机械重复第一轮的内容而应该重点关注第一轮发现的缺陷涉及的功能模块以及缺陷修复代码涉及的关联系统。换句话说测试执行要跟着缺陷走势走不能漫无目的地撒网。5. 功能测试面试题背后企业到底在考察什么因为“功能测试面试题”也是当前的高频搜索词我在这里额外聊聊这个话题。很多准备面试的同学喜欢背面试题答案其实这恰恰是最没用的事因为在资深面试官面前背答案和真实理解三句话就能分辨出来。5.1 常见功能测试面试题与回答思路我面试时必问的一个问题是“请以‘登录功能’为例设计一下测试用例。”很多人听到这个问题就开始列输入正确账号密码能登录、输入错误密码提示错误、不输入直接点登录提示必填。列的倒是挺全面但这种回答只能拿基础分。我会追问几个点连续输错密码5次之后系统怎么表现登录接口被别人恶意调用怎么办用户在两个浏览器同时登录有影响吗验证码过期了怎么处理如果进入后台我的权限验证是谁做的这些问题考察的不是你会不会设计用例而是你有没有真正思考过系统运行时的状态和边界。能答出深度的候选人通常是对真实项目功能测试有完整实践的人。第二个高频面试题是“给你一个新版本你如何安排测试计划”基础的回答是先看需求变更、再评估测试范围、然后写用例评审、执行、回归。但高分回答会包含更多细节如何基于历史缺陷数据判断本次迭代的高风险模块如何安排冒烟测试的通过标准如何和开发、产品对齐提测和验收的时间节点遇到需求变更频繁时如何控制测试范围。回答里的每一句话都可以看出候选人是不是真的有实际项目管理经验。第三个常见的题目是“如果线上发现了一个严重bug但开发时间紧项目经理说不影响发布你怎么处理”这个问题没有标准答案但考察的核心是你作为测试工程师有没有原则能不能清晰表达风险。我的建议是先判断bug的影响面和触达用户的概率然后列出让这个bug存在给项目带来的潜在成本再判断修复成本。如果触及用户核心流程那就坚决守住底线如果只是边缘问题可以评估降级为后续版本迭代处理。这里要的不是你“特别会顶嘴”而是你会不会基于事实和风险做权衡。5.2 从面试题看测试工程师的成长路径从这些面试题里你能看出这个行业真实的用人逻辑初级测试工程师要看得清功能本身的正确性中级测试工程师要看得清功能与功能之间的关系高级测试工程师要看得清测试活动与整个软件开发周期之间的配合关系。这也回应了文章的标题功能测试在软件开发周期中的作用绝不是“最后一步测一测”那么简单。它其实是贯穿整个开发过程的质量守护动作是唯一一直在以用户视角审视产品的人。如果你正在准备功能测试相关工作我给的最朴实的建议是把你做过的一个真实项目从头到尾梳理清楚需求是什么、你设计了多少用例、发现了什么bug、怎么说服开发修改、上线后有没有出过问题、如果再来一次你会怎么改进。能把这套逻辑讲清楚比背一百道面试题都有用。6. 功能测试的核心难点与避坑建议6.1 难点一测试覆盖不足的根源在哪里测试覆盖不足几乎每次线上bug复盘都会被提到。大家下意识觉得是“测试用例写少了”但我在复盘里观察到的真正原因往往更复杂。第一个根源是需求本身不完整。需求文档里没提的异常场景测试人员再细致也想不到覆盖它。这种问题必须在需求评审阶段解决测试工程师在这个阶段就要追问这个功能的异常情况是什么不满足条件的操作会被系统如何处理第二个根源是信息传递损耗。产品经理需求里写的是“在离线状态下用户应能看到缓存的商品数据”开发理解成“只要本地有缓存就显示缓存”测试执行时用的是数据正常的状态结果上线后用户的数据因为缓存过期全看不到。三方对“离线状态”的理解都有差异但只要有一方在需求评审时多问一句“离线到什么程度”这个问题完全可以爆在测试阶段而不是线上。第三个根源是回归范围评估不准确。版本迭代时开发说“这次只改了个查询逻辑影响面很小”测试如果直接信了只测查询功能就很容易漏掉查询结果和详情页、列表页的联动。我的习惯是不管开发怎么说关键流程的回归测试一条都不能少次要功能再根据代码改动范围决定是否覆盖。6.2 难点二需求频繁变更时如何保护测试质量在敏捷开发、需求频繁变更的团队里功能测试面临的挑战比传统瀑布模式更大。需求一变用例要跟着改测试环境要重新准备新功能还要插队进排期时间一压缩优先级只能让位风险随之上升。我的建议是建立一个“需求变更影响面评估”的流程。拿到变更需求先通过一套标准动作快速评估影响范围变更涉及哪个模块、和哪些模块有数据交互、下游有哪些展示页面、有没有定时任务和数据库字段改动。评估完成后再确定测试策略是只测变更点还是要连带回归周边模块。其次要会拒绝不合理的排期挤压。这里说的“拒绝”不是甩锅而是用数据说话原有测试工作量是多少新增需求测试工作量是多少现有排期下只能完成哪些哪些必须压缩可能带来什么风险。把这些事实摆出来项目负责人能做出更合理的决策。最怕的是你不说话最后风险兜不住还是测试来背锅。6.3 难点三功能测试和研发团队的协作摩擦功能测试和研发之间的摩擦在这个行业里是永恒的课题。说得直白点测试发现bug对研发来说相当于被人指出代码写得有问题情绪上多少会有波动。如何既能坚持质量标准又能维护良好的协作关系是每个测试工程师的必修课。我的经验有三条。第一条报bug时措辞要客观。描述事实比评价人有效得多比如“这个页面在iOS系统下点击保存无响应”而不是“你这个功能做得有问题点了没反应”。同样一件事前者是协作后者是挑刺。第二条bug描述要足够清晰能复现的bug研发处理起来很快复现不了的bug研发想接也不好接。能给出复现路径和必要截图、日志的测试工程师在团队里专业度口碑一定不会差。第三条区分bug级别时要有依据。动不动就拿“这个bug非常严重”压人次数多了人家就不信你了。严重级别要和影响面、用户触碰概率、是否涉及数据安全挂钩形成一套客观标准。我在项目里按四个级别来定紧急阻断发布、重要但不阻断发布、普通缺陷、体验改进并且每一级都有清晰的判定标准评审时拿标准说话争议就少了很多。7. 写在最后一点可能对你真正有用的经验文章写到这里功能测试在软件开发周期中的作用、方法、常见坑点基本都讲清楚了。如果让我从十多年的从业经验里再提炼一条最想分享给后来者的建议那就是永远不要把自己定义成一个“只是执行用例的执行者”。功能测试是一个和信息打交道的工作需求信息、代码变更信息、版本状态信息、环境状态信息、用户反馈信息全都汇聚在你这里。你能从这些信息里梳理出规律判断出风险并且用别人能理解的方式把风险讲清楚你就已经超过了大多数只知道按要求执行测试的人。我自己刚入行时也不太懂这个道理总觉得自己就是个找bug的后来慢慢意识到找bug只是起点理解业务逻辑背后的设计意图预判真实用户会遇到的问题才是一个功能测试工程师真正值钱的地方。再说回这篇文章的核心问题功能测试在软件开发周期中的作用是什么我的答案很简单它是软件从“完成了”到“能用了”之间最关键的那道质检工序。没有它代码写得再漂亮也只是一个技术上正确、实际上不可用的半成品。
返回列表