ARTICLE DETAIL

资讯详情

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

软件测试实战指南:接口、性能、APP与自动化四大技能详解

软件测试实战指南:接口、性能、APP与自动化四大技能详解 干测试这一行的人应该都有体会招聘要求翻来覆去就是那几样接口测试、性能测试、APP测试、自动化测试。我在这个行业里泡了十年从外包到自研、从金融领域到电商项目都接触过踩坑无数今天把那些真正能落地的测试实战经验整理成系列一篇一篇发出来。这一篇是第一部分重点讲接口、性能、APP、自动化这四块怎么从零开始下手怎么选工具、怎么写用例、怎么避坑最终帮你建立一套自己的软件测试实战思路。无论你是刚转行的小白、准备跳槽的初级测试工程师还是想系统梳理知识体系的初中级从业者这篇内容都会对你有用。我不会讲太多理论尽量把精力放在“真实项目里这四块怎么配合、怎么落地、遇到问题怎么排查”上这也是很多培训班不教、面试官却很看重的东西。1. 测试实战的整体设计四大板块怎么串起来1.1 测试知识体系不是四门孤立的课很多人学软件测试是把“接口测试”“性能测试”“APP测试”“自动化测试”当成四门独立课程去学学完接口就忘了性能学完自动化就忘了功能。但真实项目里这四件事是拧成一股绳的。我的理解是功能测试打底接口测试保质量性能测试看瓶颈APP测试补场景自动化测试提效率。缺了任何一块测试报告都写不完整项目上线的风险就藏在那里。举个例子一个电商APP如果只做功能测试你只能验证“点下单按钮能下单”“点支付能支付”但当用户量一大下单接口响应开始变慢弱网环境下支付回调丢失iOS 17新版系统上页面白屏——这些问题没有一个属于纯功能测试范畴。所以成熟的测试团队在版本提测后是这样跑的先功能冒烟再接口自动化全量回归然后挑核心链路压测最后拿真机做兼容性和专项测试。这套流程就是四块技能的组合拳。1.2 一个真实项目的测试场景怎么拆假设你接手的是一个电商APP加后台管理系统的项目核心业务链路是“用户登录、浏览商品、加购物车、下单、支付、查订单”。拿到需求后我不会直接写用例而是先把测试场景拆成三层。第一层是业务链路层把核心流程走通确保登录后能下单、支付后订单状态能更新这是主心骨第二层是接口层把登录接口、商品列表接口、下单接口、支付回调接口拿出来单独验证重点看参数异常、鉴权失效、数据一致性问题第三层是非功能场景层包括支付高峰期的并发能力、弱网下单的容错表现、低端安卓机上的流畅度和内存占用。三层齐了才算对一个版本有了完整的测试方案。你面试的时候如果能把“三层拆解”讲清楚面试官一般都会眼睛一亮因为这说明你有全局测试设计能力而不只是会执行用例。1.3 测试环境准备是最大的隐形坑测试环境的问题几乎每一次项目返工里都有它的影子。接口测试环境最大的坑是数据污染测试数据不清理、账号不隔离用例跑第二次就出现脏数据性能压测环境的坑是资源隔离压测不能和生产环境或者共享预发布环境混着用我曾经见过有同事直接在预发布环境放开并发结果整个集群被打到触发熔断闹出了不小的乱子自动化执行环境的坑则是依赖版本不一致Python版本、浏览器驱动版本、第三方库版本任何一个不匹配脚本就全部阵亡。这些环境问题如果不在项目启动时提前解决后面每个环节都会反复冒出“环境原因导致失败”非常消耗团队信心和排查时间。所以我的建议是接到任何测试任务第一天先花两小时把环境清单列出来数据库地址、接口域名、测试账号、依赖版本、日志查看方式逐项确认后面能省一大半力气。2. 接口测试实战从理清流程到工具落地2.1 接口测试到底在测什么很多人一提接口测试就以为“用Postman发一个请求看返回码是不是200”就是全部这个理解太浅了。接口测试的本质是验证服务端在处理特定输入时的业务逻辑是否正确它不仅测“接口通不通”更测“业务对不对”。比如用户下单接口传入负数价格服务端应该直接拒绝而不是把这个非法数据写进数据库商品列表接口手机端和PC端返回的字段应该一致否则某个端的页面就会出现NPE或者字段空白支付回调接口上游重复通知三次服务端不能重复扣款这就是幂等性。这些场景在页面上很难复现但在接口层几秒钟就能暴露问题。这也是为什么现在很多公司把接口自动化当成CI流水线的门禁核心链路接口挂了代码根本不允许合并。从另一个角度说接口测试是投入产出比最高的测试类型。它不需要UI自动化那种脆弱的环境依赖也不用像性能压测那样消耗大量服务器资源只要参数化做好了几百个用例一分钟就能跑完非常适合做回归。2.2 接口用例设计四板斧接口用例设计没有想象中玄我常年用的就是“正常路径异常路径边界值安全校验”这四板斧。正常路径就是输入合法参数验证返回的业务结果和关键字段异常路径包括缺少必填参数、参数类型错误、无效的枚举值、超长字符串、非法的JSON结构边界值包括金额为0、分页大小为0、时间戳刚好是临界点、字符串长度刚好等于数据库字段上限安全校验包括未登录访问、越权访问其他用户的数据、Token过期、SQL注入、恶意脚本。每多测一类接口的健壮性就上一个台阶。还有一个极其容易被忽略的点接口关联参数的串联。比如先登录拿Token再创建订单拿订单号最后用订单号查询支付状态。这种跨接口的流程级测试是最有价值的因为它是“用户行为级别的接口验证”。我在项目里会专门建一个“业务链路接口集”把这些关联用例放在一起跑它们对核心业务回归的作用比几百个单接口用例都大。2.3 Postman和Apifox的实操差别工具选型上Postman是老牌工具社区资料多跨平台能力强Apifox这几年在国内团队里更流行因为它把接口文档、调试、Mock、自动化测试集成在了一个工具里团队协作时不用在多个工具之间来回导数据。我个人的建议是自己学习用Postman公司项目协作优先Apifox。无论用哪个工具接口测试用例的执行思路是一样的。我习惯按这个步骤来先建集合Collection按模块拆分子文件夹把BaseURL、Token、公共Headers配到环境变量或者集合变量里每个接口维护多个用例比如正常用例、异常用例、边界用例写断言脚本不仅断言HTTP状态码还要断言业务code和关键字段用Runner或者测试集把整个集合跑起来配合数据文件CSV/JSON做参数化。给一个实用的断言模板Postman和Apifox都支持类似写法// 判断HTTP状态码 pm.test(状态码为200, function () { pm.response.to.have.status(200); }); // 判断业务code pm.test(业务code为0, function () { var jsonData pm.response.json(); pm.expect(jsonData.code).to.eql(0); }); // 判断关键字段不为空 pm.test(token字段不为空, function () { var jsonData pm.response.json(); pm.expect(jsonData.data.token).not.to.be.empty; });2.4 接口Mock的几种落地姿势接口Mock是前后端联调阶段的救星但很多人没用好。最典型的两类场景一类是后端接口还没写好前端需要先拿数据渲染页面这种情况用Apifox内置的Mock或者自建Mock服务都能解决关键是返回数据的字段结构要提前约定好另一类是第三方接口在测试环境没有真实回调比如微信支付回调、短信平台发送验证码只能通过Mock去模拟成功、失败、超时、重复通知等场景来验证我们系统能不能正确处理这些回调。自建一个简单的Mock服务用Python的FastAPI几十行代码就够了from fastapi import FastAPI from pydantic import BaseModel import json app FastAPI() class PayCallback(BaseModel): order_id: str status: str app.post(/mock/pay/callback) def pay_callback(data: PayCallback): # 模拟第三方支付平台的回调 # 可以返回成功、失败、重复通知等场景 return {code: 0000, msg: 成功} app.post(/mock/sms/send) def sms_send(phone: str, content: str): return {code: 0000, msg: 验证码已发送code123456}Mock的价值在于它让我们不用依赖外部环境就能完整地测试我们自己的异常处理逻辑这一点在联调和测试阶段能节省无数等待时间。2.5 接口测试最容易踩的坑接口测试踩坑我列几个经典的接口文档更新慢脚本里还写着老字段一执行全红所以脚本必须和接口文档强绑定文档变更要通知到位依赖数据没做配置化比如下单接口依赖一个商品ID环境一重建商品ID就变了脚本跑一次就挂所以依赖数据要能动态获取或者统一管理动态字段硬编码比如时间戳、订单号写死在用例里第二次就校验失败正确做法是从上一个接口的响应里提取或者用函数动态生成断言写得太宽只断言200不断言业务字段结果业务返回的code是失败接口测试一样“通过”等于白跑。这些坑基本人人都会遇到提前有意识就能少浪费很多排查时间。3. 性能测试实战JMeter从脚本到报告3.1 性能指标怎么看才不虚性能测试不是“压一压看卡不卡”核心指标就那么几个每个都有明确含义。响应时间RT从发出请求到收到完整响应的耗时。别只看平均值重点看P90、P95、P99平均值会被少量长尾请求拉高P99才是那1%最差体验的真实写照。TPS每秒事务数服务端每秒能处理的事务量直接反映容量和吞吐能力。并发用户数不是在线用户数而是在同一时刻真正发起请求的用户数。错误率压测请求的失败比例一般要求低于0.1%。资源指标CPU、内存、磁盘IO、网络带宽的使用曲线。打个比方响应时间是你去餐厅从点菜到上菜的等待时长TPS是厨房一秒钟能出几道菜并发用户是同一时间在餐厅里吃饭的客人。任何一个环节饱和客人都要等体验就崩了。3.2 JMeter压测的完整步骤JMeter是目前最主流的开源压测工具免费、插件多、入门快。压测场景一般分三类单接口基准测试、混合场景测试、稳定性测试。单接口基准测试先用低并发跑一段时间拿到基线数据混合场景测试按真实业务比例分配线程数比如登录占20%、商品浏览占50%、下单占30%稳定性测试在恒定压力下持续跑几小时甚至几天重点看内存有没有泄漏、资源能不能正常回收。完整步骤大概是启动JMeter新建测试计划添加线程组配置线程数、Ramp-Up时间、循环次数或持续时间添加HTTP请求取样器填写协议、域名、路径、请求参数添加HTTP信息头管理器配置Content-Type、Token等公共头添加响应断言或JSON断言校验业务状态添加聚合报告、响应时间图和TPS监听器收集结果调试用“查看结果树”正式压测时一定要关掉。这里我特别想强调一个操作禁忌大并发压测千万别用GUI模式跑GUI本身就要消耗系统资源压出来的结果就像带着沙袋跑步完全不准。正确姿势是用命令行jmeter -n -t test.jmx -l result.jtl -e -o report_dir-n是Non-GUI模式-l指定原始结果文件-e -o生成HTML可视化报告。3.3 参数化和断言一个都不能少压测时最怕所有用户请求同一个参数因为有了缓存命中响应时间会好看得离谱但这不是真实结果。参数化是必须的JMeter常用的方法有四种CSV Data Set Config从文件逐行读数据适合账号、商品ID这类真实存在的值函数助手比如随机数函数__Random适合生成随机订单号用户定义变量适合URL、端口这类全局常量JDBC参数直接从数据库查询获取数据适合数据量大的场景。数据文件是这样组织的比如CSV文件里每行代表一个用户的账号密码username,password,product_id user001,pass123,p1001 user002,pass456,p1002 user003,pass789,p1003参数化之后断言也不能省。我见过不少人只断言HTTP 200结果接口返回的JSON里code是9999库存不足脚本照样给你标绿。下单压测一定要用JSON断言去检查业务状态比如响应里的status字段是否为11表示下单成功返回的orderId是否不为空错误码是否在可接受范围内。3.4 瓶颈分析的正确排查顺序压测结果跑出来不分析等于白压。我的排查流程是先看TPS和响应时间的趋势判断是容量瓶颈还是服务退化再看服务器CPU、内存、磁盘IO。CPU接近100%重点看应用代码和线程池磁盘IO高重点看日志写入、数据库落盘和慢查询如果TPS不再上升而响应时间直线飙升九成是排队了要么是线程池耗尽要么是数据库连接池打满。我记得之前压一个订单服务并发到200的时候TPS就不再涨响应时间却一路狂飙到10秒。排查监控发现数据库连接池的最大连接数只有50大量请求在等连接释放。把连接池上限调到200之后TPS直接翻了将近三倍响应时间也回到1秒以内。这种瓶颈光看脚本是永远看不出来的必须结合监控数据定位。还要提醒一句不要迷信网上那些“压测必看十大指标”之类的文章。每个项目的瓶颈都不一样关键是掌握这套排查方法论先流量、再资源、最后代码链路逐层缩小范围。4. APP测试实战从功能到专项4.1 APP测试比Web测试多了哪些变量APP测试和Web测试最本质的差异是环境变量从“浏览器”变成了“设备矩阵”。Web测的主要是浏览器兼容性APP要面对机型、系统版本、ROM定制、分辨率、刘海屏、折叠屏组合起来是个庞大的笛卡尔积。另一个差异是APP是客户端和服务端分离的版本升级、接口适配、缓存清理、数据同步这些都是APP特有的测试点。举个例子用户手机从WiFi切到4G网络栈完全变了接口超时后的重试逻辑是不是还正确APP被用户杀掉再重启本地缓存的数据和服务器数据一致吗这些问题如果只在浏览器上做过测试是绝对发现不了的。4.2 兼容性测试的设备矩阵怎么做兼容性测试是APP里最耗时又不讨好的部分预算充足的公司直接用云真机平台批量跑脚本但大多数团队还是得靠手工选真机。我建议做一张“设备矩阵表”按这几个维度选型操作系统版本Android 8、10、12、13、14iOS 15、16、17品牌华为、小米、OPPO、vivo、荣耀、三星、iPhone屏幕尺寸小屏5寸以内、主流6-7寸、折叠屏内存档位2GB、4GB、8GB以上。每轮必测的功能就是登录、核心链路、支付、推送。我用这套矩阵最高记录是连续三天在十几个机型上跑同一套用例跑出了六十多个问题大部分是不同ROM上的弹窗权限差异、快捷键冲突、字体渲染溢出这些不真机测根本发现不了。4.3 弱网和异常场景别头铁硬测弱网测试在项目里总被排到最后但用户在外面用移动网络的情况占了极大比例。弱网最容易暴露三类问题接口超时没有重试或提示用户体验直接卡死加载失败后不渲染任何兜底状态白屏或无限转圈网络恢复后页面数据不刷新还是旧数据。弱网模拟工具常用的有Android平台的WeakNet Manager、Charles限速iOS的Network Link Conditioner或者直接在真机上切2G/3G模拟信号。如果只是想模拟随机丢包的不稳定网络在Charles的Throttle配置里把带宽调小、丢包率调高就行了。除了弱网APP还有一批“断网场景”必须测断网状态下操作再恢复网络、操作到一半杀进程再回来、按Home键切后台再切回来、存储空间已满、SD卡被弹出、低电量弹窗打断当前操作。每一条都能挖出意想不到的bug我在项目里靠这个模块找到了不少崩溃问题。4.4 Appium自动化环境搭建要点APP自动化绕不开Appium它是目前跨平台、跨语言支持最成熟的方案底层是WebDriver协议延伸到移动端。环境搭建步骤一般是安装Node.jsAppium服务端依赖安装Java JDK和Android SDK配置ANDROID_HOME环境变量安装Appium服务端npm install -g appium安装Python客户端库pip install Appium-Python-Client安装UiAutomator2驱动appium driver install uiautomator2用Appium Inspector定位页面元素。环境变量这块坑最多。很多人卡在“adb devices能看到设备Appium却连不上”九成是ANDROID_HOME或者PATH没配置好platform-tools和build-tools都要加进PATH。还有一个坑是版本不匹配Android SDK版本、Appium版本、UiAutomator2版本之间互相不兼容建议直接装最新稳定版并且用官方驱动安装命令。4.5 内存、耗电、流畅度三件专项APP专项测试是体现测试工程师深度的加分项。内存方面最粗糙但有效的办法是反复进入退出同一个页面20次观察内存是否持续上涨且不回落如果涨了就抓一份Heap快照丢给开发分析。更专业的可以用Android Studio的Profiler来看内存曲线或者用Profile GPU Rendering检查渲染帧率。耗电测试常连Power Monitor或手机自带的耗电统计跑30分钟典型使用场景对比前后耗电差异。流畅度核心看两个指标FPS帧率和掉帧。FPS稳定在50以上算流畅低于30就能明显感知卡顿掉帧超过16.6ms就会在视觉上卡一下。注意这些测试一定要在低端机或者弱网环境下做用旗舰机测流畅度基本是测了个寂寞。5. 自动化测试框架pytest与项目落地5.1 框架选型先看团队再看热点自动化测试框架怎么选不能只看哪个火要看团队的技术栈和项目阶段。这里有几个主流选项的参考pytestPython技术栈的首选插件生态丰富fixture机制灵活Robot Framework关键字驱动测试人员上手快但深层逻辑封装受限TestNGJava老牌框架依赖管理好并行执行成熟UnittestPython内置框架入门的同学用得很多但扩展性不如pytestPlaywrightUI自动化的后起之秀自动等待和API设计都比Selenium现代。我个人的推荐组合是“pytestrequestsallure”pytest组织用例requests发HTTP请求allure出报告。这套组合学习成本低见效快适合绝大多数中小型项目的接口自动化需求。5.2 pytest核心功能实战pytest最核心的价值是fixture和hook。很多人只把它当能跑用例的工具实在太可惜了。conftest.py文件放公共fixture和钩子函数比如登录获取Token、数据库连接、日志配置。fixture的作用域要理解清楚session级别是整个测试会话只执行一次模块级别是一个模块执行一次函数级别才是每条用例执行一次。看一个登录Token复用的fixtureimport pytest import requests pytest.fixture(scopesession) def auth_token(): # 整个测试会话只登录一次 resp requests.post( http://api.example.com/login, json{username: testuser, password: 123456} ) assert resp.status_code 200 return resp.json()[data][token] def test_get_user_info(auth_token): headers {Authorization: fBearer {auth_token}} resp requests.get(http://api.example.com/user/info, headersheaders) assert resp.json()[code] 0这样比每个用例都调一遍登录接口清晰多了还能减少无效的登录请求避免测试账号被风控。参数化也是pytest的强项用pytest.mark.parametrize传多组数据一组一个用例。配合标记比如pytest.mark.smoke标记冒烟用例运行的时候用-m smoke就能只跑冒烟集。5.3 接口自动化框架的三层封装接口自动化的框架我觉得最重要的就是分层封装。我这里用的是接口测试领域的分层方案最上层是测试用例层只写业务场景和测试数据中间是业务操作层把接口调用封装成方法比如order.create()、order.pay()返回值是响应对象最底层是基础方法层封装requests库统一处理公共Header、Token注入、日志和重试。这种分层跟UI自动化里的PageObject思想一样目的都是隔离变化。接口字段变了只改业务操作层对应的方法新增用例只加测试用例代码底层不动。如果所有用例都直接强依赖requests库接口改一个字段就要全项目搜索调用点改到崩溃。5.4 Selenium UI自动化的关键点虽然Selenium年代久远但它依然是面试高频、存量项目主流。核心问题集中在“等待”和“定位”。我总结几个实操要点不要用time.sleep()做等待用显式等待WebDriverWait配合expected_conditions条件定位优先级id大于data-testid大于CSS大于XPathXPath最后用而且不要写带绝对索引进去的路径处理弹窗和iframe时要切换上下文很多新手定位不到元素其实是找错了frame页面有加载动画时点击前要判断可点击状态用element_to_be_clickable。一个显式等待的示例from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait WebDriverWait(driver, 10) login_btn wait.until(EC.element_to_be_clickable((By.ID, login-btn))) login_btn.click()5.5 自动化真正落地的标志是CI集成自动化用例如果只在本地跑那它只能叫脚本不能叫框架。真正落地需要两步测试代码进Git仓库CI服务器定时或指定时拉代码、部署环境、跑pytest、生成报告、推到指定链接或发送通知。最简单的组合是GitLab CI或者Jenkins配合Allure报告。这里也要泼一盆冷水自动化测试不是越多越好它的核心价值是回归和冒烟是对重复劳动的解救而不是替代手工探索性测试。复杂的业务逻辑、UI的视觉细节、用户真实使用场景还是需要人用手去测。目标是把覆盖率控制在“核心链路快速回归”这个水平上剩下的精力留给更有价值的测试设计。我在实际项目里的体会是软件测试这个岗位拼的不是谁背的八股文多而是谁能在测试设计、用例执行、结果分析里真正把各个环节串起来。接口、性能、APP、自动化这四块每一块单独学都不难难的是把它们组合进同一个项目里看清它们之间怎么互相影响、互相配合。很多同学面试时被问“你怎么做测试分析”一下就懵不是因为不会用工具而是缺少这种全局视角。这篇是第一部分后面我还会继续整理第二部分的实战内容比如完整接口自动化项目拆解、性能测试报告的写法、APP专项测试的更多细节也欢迎大家在评论里聊聊你踩过的最离谱的bug一起涨经验。
返回列表