ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

八年测试老鸟总结:从功能测试到接口测试与质量保障实战

八年测试老鸟总结:从功能测试到接口测试与质量保障实战 1. 八年测试老鸟眼中软件测试这行到底在测什么1.1 别把测试当成“点鼠标”的活每年都有不少人问我软件测试是不是就是点点点是不是门槛低、没啥技术含量说实话刚入行那会儿我也觉得测试很简单直到我在这行摸爬滚打了八年才真正明白——软件测试不是“随便点点”而是一种系统性的质量保障工程。软件测试的核心职责不是“找几个bug交差”而是通过一系列有组织、有计划、有数据支撑的手段尽可能早地暴露软件中的缺陷评估软件质量是否达到上线标准同时为后续的版本迭代提供风险依据。换句话说测试是产品上线前的最后一道闸门也是研发过程中最便宜的那个“纠错机会”。我在很多场合都跟新人讲过这样一个类比软件测试就像买房前的验房。你不可能只看客厅漂不漂亮就付全款你得检查水电线路、墙体结构、防水层、门窗密封性甚至要挑下雨天去看会不会漏水。软件也是一样功能正常只是表象数据一致性、异常处理、性能边界、兼容性、安全漏洞这些都要靠测试一层层扒开来看。这个岗位适合谁适合那些既喜欢“拆解问题”又愿意“耐得住性子”的人。你不一定要会写很复杂的代码但你得会分析、会提问、会质疑需求本身是否符合常理。很多测试做得好的人反而有一种“反骨”——他们不轻易相信开发说“没问题”而是总想着“再挖一挖”。1.2 从功能测试到质量保障这八年我经历了什么我自己的成长路径大概是这样的前两年做纯手工功能测试主要跟着测试用例点点点每天写bug单第三年开始接触接口测试和数据库校验发现原来很多bug是藏在数据层而不是界面层的第四五年开始做自动化测试和性能测试从Python、Requests、Selenium到JMeter、Locust到了第六七年我开始做测试架构设计和质量流程优化参与需求评审、技术方案评审甚至测试计划要提前在研发动工前就介入。这八年下来我最深的体会是测试不只是“找bug”而是“理解业务理解技术理解风险”。你越是往上走越需要站在整个项目的角度思考问题——这个版本的发布风险是什么哪些功能绝不能出问题测试资源有限应该优先覆盖哪些场景这里面涉及到的就是测试策略、测试范围、优先级界定而这些能力都不是单纯“点鼠标”能练出来的。我也见过很多做了多年测试的朋友一直停留在“执行用例”的层面上每天都在忙着“完成任务”但其实没有多少成长。区别在哪里在于你有没有把测试当成一门“学科”去研究。比如同样的登录功能你是只测手机号密码能登进去还是会去测网络切换、服务端异常、Token过期、多次输错锁定、并发登录互踢前者是“执行”后者才是“测试”。2. 软件测试流程拆解从提测到上线的每个关键节点2.1 需求评审阶段最容易忽略的三个问题很多新人以为软件测试流程是从“拿到版本”开始的其实测试老手都知道真正拉开差距的时刻是需求评审阶段。在需求评审会上测试工程师最容易踩的坑是光听不想光看不问。我见过太多测试同事在评审会上全程沉默需求说啥就是啥等到测试时才发现需求本身有歧义、有漏洞甚至根本没法实现。这个锅其实不应该完全由产品背测试如果把关到位很多问题可以在需求阶段就被拦截下来。需求评审阶段我一般会重点问三件事第一业务规则是否有边界条件。比如“优惠券每人只能领一张”这算不算“同一账号被删除后又注册新账号”算不算“同一手机号换了账号”如果没有明确边界测试用例根本无法设计上线后必然出现争议。第二异常场景是否有预期结果。比如支付失败、网络超时、服务端返回异常界面应该怎么表现用户是否可以重试数据会不会不一致很多需求文档只写了“成功路径”压根没有写“失败路径”这种需求如果不追问测试阶段就要靠猜。第三埋点和监控需求是否与功能开发同步。很多项目上线后才发现日志没打、监控没配、数据没埋点出了问题根本无从查起。测试如果在评审时提醒一句“这个版本有没有埋点需求”往往能避免上线后早期的“抓瞎”。需求评审是测试最早介入项目的机会也是投入产出比最高的环节。在需求阶段发现一个逻辑漏洞可能只要5分钟等代码写完了再发现可能需要开发加班改一天。2.2 测试计划、用例设计与执行需求评审通过后就进入了测试设计阶段。这里我特别想聊一下测试计划。很多团队的测试计划就是走个过场写个时间表、列个资源分配就完了。我建议测试计划至少要包含四个内容测试范围与风险等级、测试策略功能/接口/性能/兼容性分别怎么测、缺陷处理约定Bug等级、解决时限、回归方式、上线标准什么样的指标才能放行。没有这些内容所谓测试计划就是一纸空文。测试用例设计是测试流程的“重头戏”。这里要说一个非常关键的概念——用例设计不等于用例数量堆砌。有些人为了“显得很努力”把一个登录功能写了50条用例其实大量是重复的、无效的。真正好的用例设计讲究的是“用最少的用例覆盖最多的分支”。我常用的用例设计方法有这么几种等价类划分把输入数据划分为若干等价类同一类的数据对测试结果的影响相同因此只需测一个代表值。比如年龄输入框可以划分为“有效年龄”“小于下限”“大于上限”“非数字输入”几个等价类。边界值分析大量缺陷集中在边界附近。比如密码长度要求6到18位那5位、6位、18位、19位就是必须测试的边界。场景法从用户实际操作流程出发把多个功能串联起来测试特别适合覆盖业务流程类测试比如“下单-支付-取消订单-退款”。错误推测法基于经验猜测系统哪里容易出现缺陷。比如列表为空时的刷新、连续快速点击、数据重复提交、文件名为空上传等。用例执行阶段新人最容易犯的毛病是“干执行不思考”。一条用例失败看都不看就提bug单结果发现是测试数据被前面的人改了或者是环境问题白白浪费开发时间。我给自己定过一个规矩用例执行失败后先自查三步——数据有没有被污染环境是不是当前版本操作步骤是否跟用例完全一致这三步都没问题再提bug。2.3 缺陷生命周期与Bug等级判断缺陷管理是测试流程中最需要“拿捏分寸”的环节。一个测试如果bug单写得含糊开发看了半天不知道问题在哪一个测试如果动不动就提“严重bug”时间长了大家就不会当真了。一份合格的bug单至少要有这些要素标题问题概述、所属模块、操作步骤、实际结果、预期结果、环境信息版本号、系统、浏览器或设备型号、日志或截图凭证。很多测试新手上传了截图就算完但资深测试还会附上日志片段、抓包记录、甚至数据库里的异常字段这些信息对定位问题来说价值远高于一张截图。Bug等级怎么定我一般按以下标准来分等级定义处理策略P0阻断性缺陷系统无法启动、核心流程崩溃、数据丢失、线上资金错误等必须立即修复版本不得上线P1严重缺陷主要功能不可用、无替代方案、影响范围大最迟下一个版本前修复必要时紧急发版P2普通缺陷功能可用但结果错误、边界场景异常、体验明显受损当前迭代内修复可排期P3轻微缺陷文字错误、样式瑕疵、交互不够友好可积攒后统一修复很多刚入行的测试会问什么样的bug才算P0我的判断标准很简单出了问题用户的钱包、数据、隐私有没有受影响业务链路有没有完全断掉如果都没有那就算功能再怎么不好用也很难上升到P0。分级太严会拖垮研发节奏分级太松又会让严重问题被低估这个平衡只能靠经验积攒。另外一个常见问题是“这个bug到底算不算bug”。这种情况我见过太多测试说“菜单栏少了个图标”开发说“设计稿本来就没画”。遇到这种争议唯一的裁判是需求文档和原型。需求里写了就做没写就不是bug最多算“建议”。所以我一再强调测试人手里必须有一份最新版的需求文档没有这份东西你的所有判断都缺乏依据。3. 测试项目实战简历里的“测试项目”到底怎么来的3.1 没有大厂经历如何做出漂亮的测试项目刚入行或者准备转行的人最大的困惑往往是简历上要写“测试项目”但我没有真实项目经验怎么办这个问题的本质不是“没有项目”而是“没有意识到日常可练手的项目也是项目”。我当年的做法是自己从零搭一个小型的个人博客系统然后针对它做完整的测试。这个小项目虽然“简陋”但它包含了完整的测试流程需求分析、测试计划、用例设计、执行记录、缺陷报告、测试总结。面试官要看的恰恰是你有没有跑过这套完整流程而不是你的项目有多大规模。现在做测试项目选择比当年更多了。你可以选择市面上开源的小型Web应用或App比如一个待办事项管理工具、一个简易记账本、一个电商后台管理系统克隆版只要能在本地跑起来就会成为你练手的好素材。最重要的是你要真的“测给它看”而不是只写一份“我做过这些测试”的空话。我建议每个想入行的人都准备一个可以现场演示的测试作品集。这个作品集可以包含以下材料被测系统的描述与测试范围界定一份完整的测试计划书含风险分析和资源预估一份有代表性的测试用例表至少覆盖核心功能链路一份缺陷记录表展示你从发现到回归关闭的完整过程一份测试总结报告最好包含缺陷密度、用例通过率等数据这个作品集比任何简历上的“精通XX”都有说服力。面试的时候你直接打开它跟面试官讲一遍你的测试思路比空口说自己会测有用得多。3.2 接口测试项目用PythonRequests从零搭建测试脚本现在纯界面测试已经很难体现技术深度了接口测试可以说是测试项目中性价比最高、最容易上手、也最能体现“技术含量”的一块。我以一个电商系统的“用户登录接口”为例讲讲怎么做一个像模像样的接口测试项目。第一步了解接口文档。假设登录接口定义如下POST /api/user/login 请求参数 - phone手机号必填11位 - password密码必填MD5加密后传参 - source来源端只能是ios / android / web 响应格式 - code200表示成功400表示业务异常500表示系统错误 - data包含token、userId、nickname等信息 - message错误提示信息第二步用PythonRequests写一个最基础的测试脚本import requests import hashlib def md5_encrypt(text): return hashlib.md5(text.encode(utf-8)).hexdigest() def login(phone, password, source): url http://测试环境地址/api/user/login payload { phone: phone, password: md5_encrypt(password), source: source } resp requests.post(url, jsonpayload, timeout10) return resp.json() # 示例正常登录 result login(13800138000, 123456, android) print(result)第三步设计测试用例并代码化。登录接口至少需要覆盖这些场景正确手机号正确密码登录成功正确手机号错误密码返回400未注册手机号返回400手机号格式错误少于11位返回400密码为空返回400source传ios以外的非法值返回400连续多次失败是否触发锁定重复提交是否幂等。第四步把测试结果断言化让脚本自动输出“通过/失败”def test_login_success(): result login(13800138000, 123456, android) assert result.get(code) 200, f登录成功场景失败: {result} def test_login_wrong_password(): result login(13800138000, wrongpass, android) assert result.get(code) 400, f错误密码场景失败: {result} if __name__ __main__: test_login_success() test_login_wrong_password() print(接口测试执行完成)就这么简单你已经完成了一个可自动执行的接口测试项目。把它放进你的作品集里面试官一眼就能看出你有编码能力、有接口测试意识、会写断言、会设计用例。3.3 测试数据与测试环境管理测试项目里还有一块特别容易被忽视的就是测试数据与测试环境管理。我见过不少测试项目用例写得好好的执行的时候却栽在数据上——想测一个“已发货订单”后台没有对应状态的订单想测“余额不足”却找不到一个余额可控的账户。做非功能测试包括接口、性能、异常场景之前先用SQL造一批可控的测试数据是一项基本技能。以电商订单为例要覆盖订单状态流转待支付、待发货、已发货、已完成、已取消你必须在测试库里造出对应状态的记录。造数据有两种思路一种是直接通过SQL插入但需要了解表结构风险是漏了必填字段另一种是调用后台接口“制造”数据虽然慢一点但符合真实业务逻辑。测试环境管理这块更是一个资深测试的基本功。环境怎么区分一般建议是开发环境dev、测试环境test、预发布环境staging、生产环境prod四套。测试人员最常犯的错就是“在哪个环境测的都分不清”拿着一个接口地址就去测结果测了个寂寞。我的习惯是每个测试项目开始前先确认三件事——当前测试环境的版本号是多少、数据库是哪个库、依赖了哪些第三方服务。这三个信息不确认清楚后面所有的bug都会产生争议。4. 车机display测试与软件测试规范一个被低估的方向4.1 车机display软件测试到底测什么最近几年“车机display软件测试”这个词越来越热。什么是车机display通俗说就是汽车中控屏、仪表盘、抬头显示HUD这些车载显示系统的软件。车机测试和传统App测试最大的区别是它涉及“安全考量”和“多屏联动”不是简单的界面功能测试。车机display测试主要包括几个维度一是功能测试。比如中控屏上的音乐播放、导航、蓝牙电话、车辆设置、空调控制这些功能是否按照需求正常工作。但你又不能像测试手机App一样把车机当手机去测——你得考虑用车场景比如驾驶过程中操作是否方便、界面是否容易分散注意力。二是多屏交互测试。现在很多车是仪表盘中控双联屏甚至还有副驾屏、后排屏、HUD。这些屏幕之间的信息是否能及时同步比如导航信息从中控屏流转到仪表盘会不会出现不同步或者显示错位这块测试与传统软件测试差异很大很多测试人员第一次接触时都会觉得“没有头绪”。三是显示效果与一致性测试。不同分辨率、不同亮度环境下文字是否清晰夜间模式切换是否流畅车机屏幕的UI适配、字体大小、配色在不同光线条件下是否依然可读这些都是display测试的专属关注点。四是稳定性与异常场景测试。车机系统不能随便黑屏重启尤其是在导航过程中一旦黑屏会直接影响行车安全。所以车机display测试特别关注长时间运行稳定性、高温低温环境下的表现、系统资源耗尽时的行为、正在导航时突然来电的处理等等。车机display测试适合谁适合已经有一定软件测试基础又想切入智能汽车赛道的朋友。这个方向人才缺口比普通App测试大得多但门槛也高需要你了解车辆总线协议、AUTOSAR、车载系统QNX、Android Auto、HarmonyOS车机版这些相关概念。从普通软件测试切入车机测试最可行的路径是先接触车机App测试或车联网平台测试再慢慢往display测试方向延伸。4.2 软件测试规范与流程的标准化前面聊了这么多实战这里想跟大家聊聊“软件测试规范”这个话题。很多人觉得规范是形式主义我恰恰认为规范是测试路上保护自己、保障质量最重要的工具。什么是软件测试规范简单说就是团队内部统一约定的测试工作标准。比如用例编写的格式规范、bug单字段规范、测试报告模板、提测准入条件、上线回归范围界定。有了这套规范测试工作不依赖个人英雄主义新人来了也能快速上手。我自己在团队里一直在推一套“提测准入条件”核心就四条冒烟测试通过率100%杜绝“一上来就阻塞”开发自测报告已提交且覆盖了核心业务链路需求文档和接口文档已同步更新到当前版本已知未解决的高危缺陷必须有明确的规避方案很多项目延期根本不是测试效率不够而是研发提测质量太差。如果测试每个版本都收到一个连登录都进不去的包那这个测试周期注定要崩。建立提测准入条件不是为了卡研发而是为了大家都不浪费彼此的时间。这里也给新人一个建议刚进公司的时候先找全三份文档——测试规范文档、Bug规范文档、发布流程文档。如果团队没有这些文档你可以自己先根据实践摸索然后把踩过的坑整理成一份“团队补充规范”发给leader这个动作会非常有价值因为它体现了你的流程思维和主人翁意识。5. 软件测试面试题与求职准备别死记硬背要讲逻辑5.1 高频面试题速查表面试软件测试岗位翻来覆去就那么几类题目。我整理了这些年面试别人和被别人面试时出现频率最高的题目每道题的背后都有考察点。面试题考察点回答思路请说下你最近负责的一个测试项目项目真实性与测试思维用STAR法则讲清楚项目背景、任务、行动、结果突出测试策略如何理解软件测试的目的岗位认知强调“不是找茬而是评估质量、控制风险、提供决策依据”测试用例设计方法有哪些理论功底等价类、边界值、场景法、错误推测法各举一个应用例子如何测一个登录页面用例设计能力从功能、界面、安全、性能、兼容性、异常场景多维度展开发现一个bug但开发说不是bug你怎么办沟通协作能力先自查需求文档再拉产品评审有理有据地沟通如何保证测试覆盖率风险控制意识结合需求追踪矩阵、代码覆盖率工具、评审机制综合回答你如何安排测试优先级测试思维成熟度按核心功能、用户高频场景、风险等级来排接口测试和功能测试的区别技术理解功能测用户可见行为接口测服务端逻辑、数据流转、异常处理特别提醒一点面试官问“如何测登录页面”不是让你真的一条条列完所有用例而是看你能不能有条理地分层展开。我建议从“功能层—安全层—性能层—兼容层—异常层”五个维度来回答。比如功能层测正确账号密码登录、错误密码提示安全层测SQL注入、密码加密传输、验证码时效性性能层测并发登录、弱网下的响应时间兼容层测不同浏览器、不同分辨率异常层测网络中断、服务端500、Token过期时的表现。5.2 项目介绍的STAR法则很多测试简历最大的问题就是项目经历写得像工作清单“负责XX系统的测试工作执行测试用例提交Bug跟踪缺陷。”这种写法有和没有一个样。项目介绍一定要用STAR法则来写SSituation项目背景是什么什么类型的系统用户是谁业务价值是什么TTask你在项目中的具体任务是什么是负责全部测试还是特定模块AAction你具体做了什么用了什么工具、什么方法解决了什么难题RResult结果如何最好量化比如“上线后未出现P0/P1级缺陷”“接口测试覆盖率达到85%”“通过自动化每天节省2小时回归时间”。举个例子同样是写电商项目普通写法是“负责订单模块的功能测试”。STAR写法是“在XX电商平台V2.3版本中负责订单模块测试覆盖下单、支付、取消、退款等核心链路及异常场景共120条用例发现12个缺陷其中2个为支付金额计算错误类P1缺陷上线后该模块未再出现严重缺陷。”这两种描述面试官一眼就能看出差距。很多人在简历上写的“项目经历”之所以没分量不是因为没有水平而是因为不会把做过的事“翻译”成有结果、有数据、有逻辑的表达。5.3 软件测试简历的写作要点按我筛简历的经验一份好的测试简历应该在这几个位置有明显亮点第一栏个人信息之外一定要有一个“技术栈概览”区用关键词列出你会的工具和技术Python、Requests、Selenium、Appium、JMeter、Postman、Charles、MySQL、Linux基础命令、Docker、Jenkins、Git等。注意一个原则写上去的必须能聊面试官大概率会挑一个问到底。第二栏项目经历至少要写2到3个按“最近到更早”排列。每个项目不要超过6行重点落在“遇到的问题和如何解决”上。举个例子“该版本兼容性测试发现部分安卓机型日期选择器崩溃通过抓取crash日志定位到系统WebView版本差异推动开发统一内核问题得以解决。”这种描述特别加分。第三栏自我评价不要写“认真负责”“吃苦耐劳”这种没有任何信息量的话要写“能够独立负责中小型项目的质量保障工作具备接口自动化测试落地经验较强的缺陷定位能力和跨团队沟通能力。”每句话都要有实际内容背书不要喊口号。第四个很容易被忽略的点测试报告和测试总结一定要写进简历的“项目成果”中。你出过什么版本的质量报告、有没有推进过流程优化、有没有建立过测试规范这些才是资深测试区别于新人的核心差异。6. 这些年踩过的坑与几个走心建议6.1 这四个坑我替你先踩了第一个坑不确认环境和数据闷头就测。有次我测一个退款功能怎么测怎么报错跟开发反馈了半天最后发现测试环境的数据库是三天前的备份压根没有这笔订单。从那以后我给自己立了规矩拿到测试任务后第一件事不是测是确认“测的对象对不对”。第二个坑迷信自动化以为自动化能替代手工。自动化测试适合做回归但做不了探索性测试更发现不了那些“设计之外”的体验问题。如果你还没做过手工测试就一头扎进自动化框架里写出来的脚本多半是自嗨根本不符合真实业务逻辑。第三个坑提bug不讲究方法。很多新人提bug是“甩一堆截图”开发看了半天不知道操作路径。我现在的习惯是bug标题一句话能概括内容里一定写清楚前置条件和关键操作步骤如果能附上接口返回、日志片段就更好了。第四个坑只测功能不测“非功能”。性能、兼容性、安全、稳定性这些非功能维度往往才是上线后翻车的重灾区。很多人开发环境跑得好好的一上线就崩就是因为没有做并发测试和边界压力测试。6.2 关于成长路径和职业规划的建议最后说说职业规划。软件测试的成长路径通常分两条一条是往“测试管理”方向走从测试工程师到测试组长到测试经理核心能力是资源协调、流程优化、风险决策另一条是往“技术专家”方向走从功能测试到自动化测试到性能测试到测试开发核心能力是代码能力、平台建设、工具开发。两条路没有好坏只有适不适合但前提是你得先把手上的测试工作做好。给新人还有一句掏心窝的话测试这个职业前两年拼的是执行力和细心后三年拼的是思考力和技术深度再往上拼的是对业务的理解和对整体质量体系的认知。如果你只是想在测试岗位上混日子那你很快会被替代但如果你愿意把“找bug”这件事做深做透做成一套方法论那你的价值会越来越稀缺。关于面试再补充一个小技巧无论面试官问什么问题回答时尽量用“场景行动结果”的结构先说你当时遇到了什么场景再说你采取了什么行动最后说结果如何。这个思维模式也是做测试的核心逻辑。毕竟好的测试人不只是能发现问题更重要的是能够用逻辑清晰地表达问题、推动问题解决。测试这条路说难不难说简单也不简单但如果你愿意把它当成一门手艺去打磨总能走出一条属于自己的路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进