ARTICLE DETAIL

资讯详情

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

软件测试实战指南:接口、性能、APP与自动化四线能力全解析

软件测试实战指南:接口、性能、APP与自动化四线能力全解析 如果你刚接触软件测试或者已经在功能测试岗位跑了两年想往更高一层走这篇内容应该能给你搭出一个骨架。我做了几年测试最大的感受是软件测试实战从来不是单点技能而是接口测试、性能测试、APP测试和自动化测试绑在一起织成的一张网。很多人一上来就埋头学工具Postman、JMeter、Appium装了一堆最后发现做项目时还是不知道从哪里下手。这个系列就是想把我的实战经验和踩过的坑一次性梳理出来第一场我先把接口、性能、APP、自动化四条主线讲清楚每块要做什么、怎么做、注意什么适合刚入行的人搭认知框架也适合已经做了一段时间的人拿来查漏补缺。1. 先搭框架软件测试实战的四条主线到底在测什么1.1 为什么是这四块接口、性能、APP、自动化一个软件产品从代码提交到用户手里会经过很多层风险。功能测试确实是最基础的防线但随着系统越来越复杂只靠点点点完全不够。接口测试解决的是服务端数据交换的正确性也就是客户端和服务端之间消息传得对不对。性能测试解决的是系统在压力下还能不能稳定工作高峰期会不会卡死、崩掉。APP测试则是针对移动端特有的场景做专项验证比如弱网、来电、内存、兼容性。自动化测试解决的是重复劳动把回归测试从几小时缩短到几分钟。这四条线之间也不是割裂的。接口测试过了功能测试才不容易被底层问题卡住性能测试发现问题往往要回到接口层去定位APP测试很多操作步骤可以用自动化脚本替代手工操作自动化测试写得好反过来又能支撑接口和APP的持续回归。我自己带项目的顺序是先统接口再做性能摸底接着补APP专项最后把自动化框架固化到日常迭代里。这个顺序比较符合测试介入的先后逻辑也和团队协作节奏吻合。1.2 掌握这些内容需要哪些核心能力与学习路径很多测试新手迷信工具其实工具只是落地层。支撑这四条线的地基是计算机网络基础、Linux基本操作、SQL查询、一门编程语言一般选Python或Java。网络基础不熟看接口文档和抓包容易懵Linux不熟日志和压测环境搭建会卡住SQL不熟测试数据准备和校验都做不顺畅。编程语言是自动化测试的必备技能尤其是Python短平快社区资源多。我推荐的实战顺序是这样先补基础再按接口 → 性能 → APP → 自动化的次序逐步推进。接口测试工具选一个主攻推荐Postman或Apifox能快速验证请求和响应性能测试工具主攻JMeter覆盖大部分压测场景APP自动化主攻Appium接口自动化框架选pytest。每一步都不要只学工具按钮而是要问自己这个工具帮我解决了什么问题如果解决不了我还能用什么方式处理。只有带着问题学实战能力才长得快。2. 接口测试实战从手工点接口到建立校验体系2.1 接口测试的正确打开方式协议、流程与用例设计接口测试本质上是直接对服务端API发送请求然后校验返回结果是否符合预期。它比界面测试更早介入也更能暴露底层问题。平时我们需要关注的是四个层面请求是否正确、响应是否正确、业务逻辑是否满足、异常场景是否兜得住。一条完整的接口请求至少要明确请求方法GET/POST/PUT/DELETE等、URL路径、请求头Content-Type、Authorization等、请求参数和请求体格式。响应部分要看状态码、响应头、响应体里的业务字段。很多人只盯着HTTP状态码这是不够的200只能说明请求被处理了业务上依然可能失败比如返回码是200但body里的code是50001。所以断言要断两层第一层是网络层状态码第二层是业务层返回值。接口测试的用例设计别只想着把正常流程跑通。我的经验是至少包含几类场景正常场景正确参数、正确鉴权、返回预期数据。参数异常缺少必填字段、字段类型错误、边界值、超长字符串、空值。业务异常数据不存在、状态冲突、重复提交、超出业务限制。权限异常未登录、token过期、无访问权限、越权访问。幂等性同一个请求发两次应该只有第一次生效。并发场景多个请求同时操作同一条数据比如库存扣减。写用例时把每条用例的预期结果写得越具体越好。我最早写接口用例经常写“返回成功”后来被打回因为什么叫成功没说清楚。正确写法是“响应状态码为200code为0msg为successdata.username等于预期值数据库user表中该用户的status变为1。”这样才可验证也能让别人接手。2.2 工具落地Postman、Apifox与JMeter在接口测试里的分工接口测试工具很多不用全都学精关键知道怎么分工。日常开发联调、单接口验证我推荐Postman或Apifox。Postman是老牌工具集合管理、环境变量、断言脚本都很成熟。Apifox更贴合国内团队集成了API文档、Mock、调试和自动化测试团队协作很舒服。用Postman调试一个登录接口时我会这样做在Tests标签里写断言比如pm.test(Status code is 200, () pm.response.to.have.status(200));再判断业务返回字段。还有一步非常重要把返回的token保存到环境变量。比如var res pm.response.json(); if (res.code 0) { pm.environment.set(token, res.data.token); }这一步很实用因为后续的接口基本都需要携带token手动去复制粘贴太麻烦而且token通常有时效每次都要换。用环境变量自动更新接口集合就能连续跑起来。JMeter在接口测试里的定位不太一样。它不只是做单接口验证更侧重多接口串联、参数化、并发模拟。比如一个下单接口依赖登录token和商品ID你可以用JSON提取器从登录响应里把token取出来当作后续请求的变量。JMeter里常用的组件有HTTP请求、HTTP头管理器、JSON提取器、正则表达式提取器、断言和聚合报告。在做接口测试时JMeter的插件生态和脚本录制能力也很有优势但按我个人的偏好单接口调试用Postman更快批量回归和场景化压测用JMeter。2.3 接口自动化与Mock的实践经验接口自动化不是简单把单接口请求写成一个脚本而是要考虑数据管理、环境切换、断言策略、执行方式和报告输出几个环节。我后面专门会讲pytest框架这里先说两个很关键的经验第一接口自动化的核心难点是数据准备和清理不是请求发送。第二遇到依赖第三方、或者后端还没开发完的接口用Mock模拟是正常操作不需要等别人。数据准备方面我踩过不少坑。测试账号和测试数据一旦被清理或者被其他用例修改整个用例就跑不通过。后来我养成了一个习惯每个用例尽量自己创建测试数据用例结束之后再做清理如果没法彻底清理至少不能影响其他用例。比如测试用户注册可以随机生成手机号或用户名测试完根据规则标识清理。用Python写的话我会用datetime.now().strftime(%Y%m%d%H%M%S)拼在用户名后面保证唯一。Mock接口的方式常见有几种本地起一个mock服务用Apifox的Mock功能在代码里用Python的mock库直接拦截。前期比较敏捷的做法是先用Apifox根据接口文档直接生成Mock返回数据结构提前约定好。真正的接口自动化用例可以先对着Mock写等后端就绪后切换真实环境跑一遍基本不用改太多。这就是环境变量和配置分离的好处。接口自动化常见的问题其实一直都很固定。我自己排查过很多次token失效导致大范围失败解决思路是每个用例执行前自动刷新token。中文字符串乱码检查请求编码和响应编码统一使用UTF-8。断言太浅只校验状态码漏掉核心字段。建议把关键业务字段都纳入断言。超时没有处理压测或慢接口会出现偶发失败。建议设置合理的连接超时和读超时并对超时进行重试或记录。环境地址写死换环境就要改代码。必须把base_url做成可配置。3. 性能测试实战JMeter压测其实没那么复杂3.1 性能测试到底想验证什么核心指标怎么理解性能测试不是上去就压首先要明确目标。通常分为负载测试、压力测试、稳定性测试、容量测试。负载测试看系统在预期并发下的表现压力测试看什么时候出现拐点系统最多能扛多少并发稳定性测试看长时间运行有没有内存泄漏和缓慢恶化容量测试是为未来扩容提供数据依据。核心指标需要理解透彻。并发用户数不是指线程数而是同时正在执行操作的虚拟用户数。TPS/QPS是每秒钟系统处理的事务数或请求数这是衡量系统吞吐能力的关键。响应时间要关注平均值更要关注TP95、TP99因为平均响应时间会被少量慢请求拉高但真正影响用户体验的是长尾。错误率一般希望低于0.1%甚至0。服务器资源指标比如CPU、内存、磁盘IO和网络带宽决定了瓶颈在上层代码还是在基础设施。拿生活中的例子类比性能测试就像在餐厅评估接待能力。并发用户数是同时到店的人数TPS是每秒钟能上多少道菜响应时间是顾客从下单到拿到菜的时间错误率是上错菜或者没上菜的比例。如果后厨只有两个锅来再多客人TPS也上不去响应时间只会越来越长。这背后的资源瓶颈就是性能测试要找到的东西。3.2 用JMeter完成一次完整压测的七步先说结论压测不要用JMeter的图形界面去跑大量并发图形界面会消耗本机资源容易干扰结果。正确方式是写好脚本后用命令行模式执行。我习惯的完整步骤是在JMeter里创建测试计划先加线程组设置线程数、Ramp-Up时间、循环次数或持续时间。如果目标是持续压测5分钟可以勾选调度器设置Duration为300秒这样更接近真实线上流量模型。线程组下加HTTP请求默认值把协议、服务器地址和端口统一写在默认值里避免每个请求重复配置。添加具体HTTP请求填写路径和参数。如果参数需要每次不同用CSV数据文件做参数化。依赖关联的接口用JSON提取器或正则表达式提取器把变量取出来给后面的请求使用。加HTTP头管理器设置Content-Type、Authorization这样的公共请求头。加响应断言至少校验状态码和关键业务返回判断请求是否真的成功了。加监听器比如聚合报告、响应时间图。只保留必要的监听器监听器太多也会带来额外开销。命令行执行命令大概长这样jmeter -n -t /path/to/test.jmx -l /path/to/result.jtl -e -o /path/to/html_report-n表示非GUI模式-l输出结果文件-e和-o表示生成HTML报告。实测下来这样执行比图形界面稳定很多也方便集成到CI流程里。参数设置不是拍脑袋。先要根据业务预估线上常见并发量再逐步加压。比方说登录接口线上平均100个用户同时操作压测可以按20、50、100、200、500这样的梯度做观察TPS和响应时间的变化。如果50并发时TPS还能上升100并发时TPS开始走平说明系统容量就在这个区间附近继续往上压错误率就会飙升。3.3 性能结果分析和瓶颈定位思路压测之后最怕的是拿到一份结果不知道怎么解读。我看聚合报告关注的顺序是错误率、TPS、平均响应时间、TP99。错误率不是零先看是什么错连接超时通常和并发连接数有关业务报错通常要查日志。TPS如果一直上不去最可能是资源瓶颈数据库、缓存、代码锁、网络、中间件连接池。我之前碰到过一个真实案例某个查询接口并发50时TPS只有80响应时间却到了3秒。一看数据库服务器CPU接近100%慢SQL日志里有一条全表扫描加了个索引之后TPS直接翻了4倍。这就是非常典型的定位思路先看哪个资源消耗高再顺着排查日志和数据库。除了监控服务器资源还要留意压测工具本身。压力机能力不足线程都在休眠TPS根本压不上去。另外压测前一定要预热让JIT和缓存机制生效否则前几分钟的数据会偏低。稳定性测试最好单独跑比如1小时或12小时监控内存曲线重点看Full GC频率、内存泄漏和响应时间缓慢上升。很多性能问题的特征不是一下子崩掉而是越来越慢这种问题如果不长时间跑是发现不了的。避坑清单里我再提醒几句不要用固定随机延迟代替Think Time也不要完全不做思考时间否则不符合真实用户行为不要压测时不加断言否则服务器返回了错误页面你却以为全部成功不要忽略首次请求的冷启动影响不要只测一个接口的峰值数据真实的业务链路往往是跨多个接口的场景化压测更加接近线上真实情况。4. APP测试实战覆盖界面、兼容到崩溃的全场景4.1 APP测试不只有点击功能专项测试才是重头APP测试表面上和Web测试很像但移动端有太多特殊场景。它不仅要验证功能是否正确还要考虑不同机型、不同系统版本、不同分辨率、中断事件、弱网环境、推送消息、升级覆盖等。很多团队只做了功能测试用户一到地铁里就卡死换个老机型就闪退这些问题本质上都是APP专项测试没做到位。APP专项测试大致包括这几块。兼容性测试要在主流机型、系统版本、屏幕尺寸上跑一遍核心流程不必所有功能全跑但要保证主流程不崩、不卡。安装卸载升级测试要覆盖首次安装、覆盖安装、降级安装、卸载后数据保留、应用内更新这些场景。弱网测试要模拟Wi-Fi信号不好、4G变2G、丢包、高延迟等情况最简单的工具是Fiddler或Charles设置限速。中断测试要模拟来电、短信、闹钟、锁屏、横竖屏切换、前后台切换。性能测试关注启动时间、CPU占用、内存占用、流畅度和电量消耗。安全测试包括权限合理申请、敏感数据存储、日志泄漏、反调试等。我举个特别容易被忽略的例子登录页在飞行模式下的表现。如果APP网络断开是直接卡住无响应还是提示网络异常并给出重试按钮用户很快会感知到这一点。很多APP在正常网络下用起来很好弱网下一进入页面就白屏这种问题必须在专项测试里提前暴露。4.2 环境搭建与常用命令Appium和adb必须会APP自动化绕不开Appium做Android测试绕不开adb。搭建Appium环境通常包括安装JDK、Android SDK、Node.js、Appium、Appium Inspector和模拟器或真机。这套环境第一次配最容易卡在SDK路径和系统变量上装完之后用appium-doctor检查环境准确性能省很多事情。adb命令是APP测试的瑞士军刀基础命令必须熟练。常用的包括adb devices # 查看连接的设备 adb install app.apk # 安装应用 adb uninstall 包名 # 卸载应用 adb shell am start -n 包名/Activity名 # 启动某个页面 adb shell am force-stop 包名 # 强制停止应用 adb logcat -v time log.txt # 抓取运行日志 adb shell dumpsys meminfo 包名 # 查看内存占用 adb shell dumpsys battery # 查看电量信息 adb exec-out screencap -p screen.png # 截图Logcat抓崩溃日志是我的日常操作。遇到APP闪退先复现然后adb logcat -v time -b crash crash.txt重点看AndroidRuntime和FATAL EXCEPTION附近的堆栈。很多时候一行堆栈信息就能直接定位到是空指针、数组越界还是资源没找到。测试时把这些日志保留下来连同截图、操作系统版本、机型分辨率一起塞进Bug描述里开发处理问题的效率会高很多。4.3 设计APP测试用例的六个维度设计APP用例时如果只按功能需求拆很容易漏场景。我自己的拆法是这样的功能流程包括正向主流程、分支流程、反向操作、边界值。交叉事件打电话、收短信、锁屏、切后台、横竖屏切换。权限测试相机、定位、通讯录、通知等权限允许和拒绝的场景。弱网与异常断网、弱网、网速波动、请求超时、缓存数据展示。性能专项冷启动时间、热启动时间、内存泄漏、页面卡顿、耗电。升级兼容覆盖安装、版本回退、数据迁移、新老接口兼容。以登录页面为例正常的用例是输入正确账号密码点击登录。但专项测试会继续想手机号输入框是否限制11位密码框是否隐藏软键盘会不会遮挡登录按钮是否有点击防抖连点十次会不会重复提交切到后台再回来登录态是否保持断网状态下验证码是否一直转圈这些每一项都可能成为线上问题。APP测试的价值就在这些边角细节里。还有一个很实用的手段Monkey测试。在Android上跑Monkey可以随机生成大量用户事件用来做稳定性测试能发现很多手工测不到的崩溃。我常用的命令是adb shell monkey -p 你的包名 -v 10000 --throttle 300跑完后在日志里搜关键字crash、ANR有异常就去分析堆栈。Monkey跑出的问题可能不好复现所以Android 9以上可以配合adb shell monkey -c和日志一起分析。iOS平台则主要靠XCTest、TestFlight和系统自带日志来收集崩溃。5. 自动化测试框架用Pytest从零搭建一套能落地的接口自动化框架5.1 为什么选Pytest而不是 unittest 或其他框架自动化测试的语言和框架五花八门但在Python生态里Pytest是越来越多人首选。它的优势不只是断言简洁更在于fixture机制、参数化、插件生态和可扩展性。unittest也能写自动化但代码更啰嗦fixture不如Pytest灵活报告也要自己拼。Pytest配合allure-pytest能生成很漂亮的测试报告配合pytest-xdist还能分布式并发执行。Pytest的fixture值得单独说一下。fixture可以用来准备数据、初始化环境、清理现场也可以作用在函数级、类级、会话级。比如接口自动化的token获取非常适合放到session级别的fixture里整个测试会话只取一次比每条用例都重新登录节省大量时间。参数化也很强大一组数据就是一条用例数据驱动自然就做起来了。5.2 实战搭建一个可维护的接口自动化项目结构我自己习惯的项目目录是这样test_project/ ├── config/ # 配置文件不同环境地址、账号信息 │ └── dev.yaml ├── api/ # 封装接口请求方法 │ ├── base_api.py │ └── user_api.py ├── cases/ # 测试用例 │ ├── conftest.py │ └── test_login.py ├── data/ # 测试数据 │ └── login_data.yaml ├── utils/ # 公共工具 │ ├── requests_util.py │ └── logger.py ├── pytest.ini └── requirements.txtbase_api里封装requests请求统一处理GET、POST请求统一加token统一对响应做预处理。举个例子import requests from utils.logger import logger class BaseAPI: def __init__(self, base_url, tokenNone): self.base_url base_url self.token token self.session requests.Session() def request(self, method, path, **kwargs): url self.base_url path headers kwargs.pop(headers, {}) if self.token: headers[Authorization] fBearer {self.token} kwargs[headers] headers response self.session.request(method, url, timeout10, **kwargs) logger.info(f{method} {url} - {response.status_code} {response.text}) return response登录接口的用例可以这样写import pytest import requests pytest.mark.parametrize(username,password,expect_code, [ (admin, 123456, 0), (admin, wrong, 10001), (, 123456, 10002), ]) def test_login(username, password, expect_code): response requests.post( http://127.0.0.1:8080/api/login, json{username: username, password: password} ) assert response.status_code 200 assert response.json()[code] expect_code如果每个用例都这样直接写后期改地址会疯掉。所以实际上我会把base_url和token都从配置文件里取conftest.py里做初始化import pytest import yaml from api.base_api import BaseAPI pytest.fixture(scopesession, autouseTrue) def env_config(): with open(config/dev.yaml, encodingutf-8) as f: config yaml.safe_load(f) return config pytest.fixture(scopesession) def api_client(env_config): base_api BaseAPI(env_config[base_url]) login_response base_api.request(POST, /api/login, jsonenv_config[login_user]) base_api.token login_response.json()[data][token] return base_api这样一条用例拿到的api_client已经带上了token不用每条用例重复登录。测试数据也可以放到yaml里用参数化读取。整体上我建议自己搭过一次框架而不是直接复制别人的模板。只有亲手处理过token、session、数据驱动、报告集成遇到问题才知道怎么调。5.3 自动化测试的落地心法不是写的多就有用自动化最怕变成“全是脚本一跑就挂”。我见过不少团队写了几百条用例最后没人看、没人维护慢慢就废弃了。自动化不是越多越好而是在合适的地方用合适的成本解决回归问题。我的落地顺序是优先做接口自动化后做UI自动化。接口自动化执行成本低、稳定性高、发现问题的位置更接近底层UI自动化适合覆盖核心主流程但不适合把每个版本的边界情况都录成脚本否则维护成本会拖垮团队。用例选择上我给一个优先级参考高频回归的用例优先自动化。核心主流程和用户价值链路优先自动化。涉及多环境多账号重复执行的场景优先自动化。界面样式、布局和纯粹视觉类检查不建议自动化。一次性的探索性测试不用自动化。脚本要能重复执行最关键的是用例之间不能互相依赖。每一条用例要有独立的测试数据执行完要么清理数据要么不影响其他用例。配置切换用pytest.ini指定环境变量不要在代码里写死环境地址。硬编码等待比如睡五秒要尽量替换为显式等待和轮询断言UI自动化尤其重要。报告不能生成了没人看至少把失败截图和堆栈信息展示出来再推送到群里或邮件才能形成闭环。CI集成是最后一步但我认为必须做。用Jenkins或者GitLab CI把测试命令和定时器配好每次代码提交或每晚固定时间跑一次自动化失败自动通知。只有把自动化绑进研发流程里它才真正发挥出守门员的价值而不是一个展示用的花瓶。6. 常见问题与排查技巧实录给新手的几条避坑经验6.1 测试环境问题和数据问题怎么排查测试过程中几乎有三分之一的时间在处理环境问题和数据问题。接口突然大量失败先别急着改代码逐个排查步骤是这样先确认环境变量有没有指错再看服务是否全部启动然后看依赖的第三方服务是否可用最后看数据库中的测试数据是不是被清理了。很多时候不是代码变了是数据被其他用例删掉了。我实际遇到过接口自动化跑得好好的突然有一天全部登录失败。查了很久发现是另一个团队的定时任务重置了测试账号密码。从那以后我把账号密码改成了从环境配置读取并且加了告警一旦登录失败先把错误信息完整抛出来再决定要不要重试。这件事给我最大的教训是测试过程中的每一个异常都不要只猜要拿到第一手日志和响应原文再去判断。Postman调试有问题时响应原文就是最直接的线索。6.2 接口、性能、APP、自动化之间的联动协作这四条线放到一个真实项目里经常是互相联动的。接口测试发现一个接口在并发场景下延迟很高性能测试就能用数据放大这个问题定位到数据库慢查询APP测试发现弱网时请求超时没有重试接口自动化可以补充一个超时和重试的用例来守住这个逻辑。举个我自己做过的流程某次版本上线APP用户反馈首页加载很慢。我第一步用Charles看接口耗时发现接口返回需要6秒接着用JMeter压这个接口发现并发到10个人时TPS就掉到5开发查日志发现是首页聚合查询在MySQL里做了多次水平拆表查询每一条都很慢。最后优化成缓存和并行查询接口耗时降到了300毫秒APP端再配合弱网测试整个体验就正常了。这个过程里接口测试给的是请求和响应是否正确的判断性能测试给的是压力下的容量数据APP测试给的是用户真实场景体验自动化测试则负责把这套回归场景固化下来防止下次再出同样问题。6.3 后续学习主线与建议这一篇更像是打地基。后面这个系列我打算继续往下拆比如接口自动化框架的完整源码级讲解、JMeter压测的脚本参数设计、Appium在真机上的详细配置和复杂手势操作、pytest结合Allure的报告优化还会穿插一些面试真实场景里的问题。新人在学的时候一定要按自己的项目去练不要光看别人的截图和模板。可以拿公司一个内部系统从接口测试开始搭一套最小可用的自动化框架再慢慢扩展到性能场景。只有动手做过一遍那些“原来如此”的感觉才会真正成为你的本事。我个人在实际操作中的体会是测试工程师的核心竞争力不是会多少个工具而是面对一个陌生的系统知道从哪里去分析、怎么设计验证方案、如何把问题快速定位到最小范围。整理这篇内容就是希望把这种思路传递给你。学工具只是起点用工具解决真实问题才是终点。后面有任何一个模块想深入都可以顺着这个系列继续往下挖我也会把自己踩过的坑和总结出的方法一条条写出来。
返回列表