ARTICLE DETAIL

资讯详情

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

接口测试实战:基于慕慕生鲜项目的业务链路与自动化测试全攻略

接口测试实战:基于慕慕生鲜项目的业务链路与自动化测试全攻略 很多测试新人问过我同一个问题“接口测试我看了好多教程Postman、Apifox都会点点但一到面试聊项目就卡壳感觉自己练的东西都是散的怎么办”这个问题太普遍了。看教程学的是工具按钮不是业务链路。真正的接口测试不是对着一个公开接口发几次请求、看返回200就完事而是要理解接口背后的业务关系、数据流转、权限控制和异常场景。我带人练手时最常推荐的一个项目就是慕慕生鲜。这套前后端分离的生鲜电商系统几乎把真实业务里接口测试要遇到的所有典型场景都覆盖到了注册登录、商品浏览、购物车、下单、支付、地址管理、订单查询接口之间还有真实的数据依赖和状态流转。花一两周时间把它跑通、测透你对接口测试的理解会从“会调接口”上升到“会测业务”。这篇文章我就把整个练手过程拆开讲项目怎么跑起来、接口有哪些、用例怎么设计、工具怎么选、关联接口和登录态怎么处理、自动化怎么落地、以及我实际踩过的坑。内容不算短但每一步都是可以直接照着做的。1. 慕慕生鲜为什么是“测试新人友好型”项目1.1 业务闭环完整接口之间有真实的数据流转公开的免费接口比如天气查询、快递查询你测来测去就那么一两个请求参数翻来覆去也就是那几个字段。这类接口最大的问题是没有业务上下文。你测不出接口跟接口之间是怎么配合的也感受不到“数据从哪里来、到哪里去”。慕慕生鲜不一样。它的接口是一整条业务链路的切片用户先注册登录拿到身份凭证然后浏览首页、查看商品分类、进入商品详情选好商品加入购物车填写收货地址提交订单订单生成后做支付支付完可以在订单列表里看到订单状态的变化。这在真实业务里就是一条完整的“人货场”链路。放在接口测试里价值在于接口之间是有依赖关系的不登录就下不了单购物车里没商品就提交不了订单订单状态会随着支付动作从“待支付”变成“已支付”。这种依赖关系才是接口测试真正要练的核心能力。我见过很多人测接口喜欢“单打独斗”测登录就只测登录测订单就只测订单。遇到慕慕生鲜这种有关联的项目一下就露馅了——因为你会发现不先处理好登录态、不先从商品接口拿到数据订单接口根本没法测。1.2 技术栈主流练手的同时就在积累面试素材这套项目常见的形态是前端用Vue后端用Spring Boot数据库用MySQL接口风格是RESTful数据格式是JSON身份认证靠token。这套组合在当下的企业级项目里太常见了尤其是前后端分离的互联网业务系统。你在练这个项目的过程中接触到的每个环节都是面试里高频出现的话题接口返回的状态码代表什么含义GET、POST、PUT、DELETE 分别用在什么场景登录后的token是怎么产生、怎么传递、怎么校验的数据库表结构和接口返回字段的对应关系是什么样的。比如你去面接口测试岗面试官问“你在项目中怎么处理接口依赖”你不能只说“我用Postman定义了一个环境变量”。你得讲清楚哪个接口的哪个返回字段被提取出来了存到了什么变量里后续哪个接口又把变量拼到了请求参数里如果拿不到这个变量会发生什么。这些如果只靠想象很难讲出细节但如果你真的拿慕慕生鲜实操过一遍这就是你亲身做过的事情怎么问都有话说。1.3 数据完全可控能造出任何你想测的边界数据练手项目最大的优势不是它能跑而是你拥有完全的控制权。真实业务里的数据你不能乱改但这个项目从数据库到后端代码都是你的你可以随意折腾。举个我常用的例子你把商品库存改成0然后去调用提交订单接口看看后端会不会正确拦截“库存不足”你把商品价格改成0.01下单看看金额计算有没有问题你把用户余额改成负数看支付接口会不会报错。这些边界数据在真实项目里你可能要申请半天权限都不一定能改但在自己本地环境里一条SQL就搞定。这种能力对测试思维的训练特别重要。很多人测接口永远只测“正常情况”因为脑子里没有“异常数据”的意识。而用自己可控的项目练手你会慢慢养成一个习惯每个接口都先问一句如果我往里面塞一个不正常的数据系统会怎么反应这个习惯一旦养成比学会一百个工具技巧都值钱。2. 把项目本地跑起来环境搭建与首次连通2.1 从零开始的前后端启动步骤先说环境要求。这套项目常见的运行环境是JDK 8或更高版本、Maven 3.x、MySQL 5.7或8.0、Node.js 10以上。不需要都是最新版稳定能用就行。我见过有人为了跑项目去装最新的JDK 21结果项目本身用的是JDK 8的写法反而编译不过纯属给自己挖坑。整体启动流程分四步初始化数据库项目里一般会附带一个.sql文件里面是建库、建表的语句还有一些基础数据。用Navicat或者命令行把它导入到MySQL里就行。这一步最常见的问题是导错了库比如SQL脚本里写的是CREATE DATABASE xxxx但你手动建了一个别的名字的库导致后端连不上。配置后端数据库连接打开后端项目里的application.yml有的版本叫application.properties把数据库地址、用户名、密码改成你自己的。这里有个容易忽略的点检查MySQL的时区配置很多版本后端启动时报错就是因为时区不对比如serverTimezoneAsia/Shanghai。启动后端服务在IDEA里打开后端项目等Maven把依赖下载完运行启动类。后端默认端口常见的是8080如果被占用会启动失败换一个端口或者关掉占用进程都可以。启动前端项目在VSCode或命令行里打开前端项目目录执行npm install安装依赖然后npm run serve启动开发服务器。前端开发服务器的端口一般跟后端不一样常见的是8081、3000之类。npm install如果慢得离谱把镜像切到国内的npm镜像源速度能快好几倍。2.2 首次连通性验证绕过页面直接用接口确认服务活着很多初学者喜欢依赖前端页面来判断后端是否启动成功。页面能打开不代表后端接口就是通的更不代表数据库连接没问题。我的习惯是跑起来之后先用接口工具直接调一次最基础的请求。以我手头这个版本的慕慕生鲜为例第一步我会去调一个不需要登录的公开接口比如获取首页轮播图或者获取商品分类列表。这类接口路径通常一眼能看出来比如/api/index或者/api/goods/list之类具体以你拿到代码里的Controller注解为准。验证步骤可以按照下面这个表来做验证项方式预期结果后端进程存活浏览器直接访问后端根路径或静态资源路径页面有返回或接口返回JSON数据库连接正常调用一个真的会查表的接口如商品列表返回正常的业务数据而不是500错误前端能访问后端在前端页面操作一下看网络请求是否返回正常浏览器Network面板中接口响应正常这一步花不了十分钟但特别值。因为后面所有的测试都建立在一个前提之上环境本身是健康的。如果你一上来就闷头写用例写到一半发现接口全部超时到头来还要回头排查环境浪费的时间更多。3. 接口全貌与测试用例设计先有地图再动手3.1 先盘清楚项目到底有哪些接口拿到项目之后先别急着打开Postman乱调。第一件事是把这个项目的接口清单梳理出来。怎么梳理打开后端的Controller层代码一个Controller对应一个模块里面的每一个方法对应一个接口。慕慕生鲜常见的接口模块大概是下面这个结构不同版本会有差异但整体思路一致模块核心接口主要方法是否需要登录典型职责用户发送验证码、注册、登录、获取用户信息POST/GET部分需要管理用户身份首页轮播图、分类列表、热门商品GET否展示运营内容商品商品列表、商品详情、搜索GET否商品浏览购物车加入购物车、购物车列表、修改数量、删除POST/GET/PUT/DELETE是管理预购商品收货地址地址列表、新增地址、设为默认GET/POST/PUT是收货信息维护订单提交订单、订单列表、订单详情、取消订单POST/GET是交易核心支付发起支付、查询支付状态POST/GET是支付流转梳理出来的表格就是你的测试地图。哪块做了、哪块没做、哪些接口有依赖关系一目了然。3.2 从接口设计反推测试点方法、参数、鉴权、状态接口清单有了接下来要做的就是设计测试点。很多人卡在这一步不知道一个接口到底要测什么。我常用的方法是按下面这个顺序过一遍每个维度都能拆出一批用例。第一请求方法对不对。接口定义的是POST你用GET去调系统会不会正确拒绝返回的是405还是其他提示反过来如果接口定义的是GET你用POST去调能不能调通这一类用例是很多人会漏掉的但面试官很爱问。第二参数校验全不全。必填参数不传、传空字符串、传超长字符串、传非数字类型、传负数、传不存在的ID每种情况系统的响应是否符合预期注意这里不是看“报不报错”而是看报错信息是否友好、HTTP状态码是否合理、有没有返回堆栈信息把后端代码细节暴露出来。第三鉴权逻辑严不严。慕慕生鲜里购物车、订单这些模块是要登录的。你直接不带token去调系统返回什么带一个伪造的token去调又返回什么把token放到Query参数里而不是Header里系统认不认这些都是安全维度的重要测试点也是真实项目中接口测试必不可少的一部分。第四业务状态流转对不对。这个是慕慕生鲜这类业务项目特有的价值。比如一个已经支付的订单能不能再次支付一个已经取消的订单能不能再取消一次把商品下架之后购物车里还能不能正常结算这类用例测的已经不只是接口本身而是整个系统的业务逻辑。第五异常场景突不突。网络层面我们不容易模拟但数据层面的异常很容易构造。比如让两个用户同时买同一个商品、库存只有1件但两个人都下单成功后端有没有超卖问题。这类场景在慕慕生鲜上完全能造出来测的时候也特别能练功力。3.3 用例整理成文档别只写在脑子里我强烈建议哪怕你是个人练习也要把设计好的测试用例整理到表格里。一个简单的用例模板就够用用例编号所属模块接口名称前置条件请求方法请求参数预期结果为什么要这么麻烦两个原因。第一写文档的过程本身就是在逼你想清楚每个细节很多人在脑子里“觉得”自己会了一落笔才发现连“前置条件”都说不清楚。第二这份文档后面可以直接转化为自动化用例每一行就是一个测试数据到时候不用重新返工。我自己带新人时有个规定没有用例文档不允许碰接口测试工具。因为工具是执行者文档才是设计者。顺序不能反。4. 工具选型Apifox 还是 Postman4.1 两个工具的核心差异对比Postman 是接口测试工具里当之无愧的老大哥资料多、社区大、功能全。Apifox 是近年国内团队做的“一体化工具体”把接口文档、接口调试、Mock、自动化测试都塞到了一个工具里对中文用户极其友好。两个工具的核心差异我整理了一张表对比维度PostmanApifox中文支持一般原生中文接口文档独立功能配合API平台使用调试时自动生成文档Mock数据需要配置内置支持自动化测试Runner 脚本场景测试更直观团队协作需要登录账号同步到云端国内服务器协同体验更好学习资料极多比较多官方文档也很全存量案例很多公司还在用新团队和国内项目用得越来越多4.2 学习阶段我的建议如果是从零开始学我建议你主力用 Apifox但也要把 Postman 装一个至少熟悉它的操作逻辑。原因是两者都有可能在面试或工作中遇到。有一点你需要明确工具切换带来的学习成本并不高你真正要掌握的是那些“通用能力”——环境变量怎么用、集合怎么组织、断言脚本怎么写、批量数据怎么跑。这些概念在两个工具里完全相通只是菜单位置不同。我见过有人因为公司用Postman就不学Apifox或者因为自己喜欢Apifox就看不上Postman这种工具崇拜没有任何意义。面试官问的是你会不会测接口不是问你站哪个工具阵营。5. 最容易翻车的环节登录态、验证码与参数关联5.1 登录态管理token 自动传递的三种姿势慕慕生鲜这类前后端分离项目登录后后端会返回一个token后续需要权限的接口都靠这个token来识别身份。练手阶段最容易犯的错就是从登录接口响应里把token复制出来然后粘到下一个接口的Header里。这招能用但不能只会这招。因为真实项目里token是有过期时间的每次手动复制粘贴根本来不及而且如果用例里还有“登录用户A操作订单再登录用户B查看订单”这种多用户场景来回切换会让你崩溃到怀疑人生。正确的做法是让工具自动管理token。以Apifox为例流程是这样的定义一个环境变量比如叫token在登录接口的后置操作里编写一个脚本从响应数据中提取token写入环境变量在需要鉴权的接口里Header设置成Authorization: {{token}}或者项目要求的键名。脚本大概长这样// 假设登录接口返回结构是 { code: 0, data: { token: xxxx } } const json pm.response.json(); if (json.code 0) { pm.environment.set(token, json.data.token); console.log(token提取成功 json.data.token); } else { console.log(登录失败 JSON.stringify(json)); }Postman的写法类似只是菜单路径和函数名稍有区别。核心逻辑完全一样先取响应内容再提取字段再存环境变量。这一招练会了你才算是迈入接口自动化的门槛。5.2 验证码从哪来先搞清楚项目的实现方式验证码是很多初学者练习时第一个卡住的地方。真实项目里短信验证码是接运营商服务的这种教学项目不会真花这个钱所以通常用的是以下几种方式之一验证码固定项目配置里写死了一个万能验证码验证码直接打印在后端控制台项目里有开关可以在配置中关闭验证码校验。拿到项目第一步先看后端代码和配置找到验证码的处理方式。如果是打印在控制台那你就注册之前先调一次“发送验证码”接口然后去后端控制台把这个人的验证码抄过来填进用例。如果是固定验证码那就省事了所有用例统一用它就行。自动化的时候要更聪明一点。如果项目支持可以把验证码也做成自动提取发送验证码接口的响应里如果直接返回了验证码字段有的教学项目为了方便确实这么干那就在脚本里把验证码也存入环境变量注册接口直接引用。这样整条链路就能做到“一键跑通”。5.3 接口参数关联让数据在接口之间流动起来慕慕生鲜最有练习价值的地方就在于它的接口参数是强关联的。你不做参数关联用例就跑不通。典型链路是这样的先调用商品列表接口从返回里提取第一个商品的id把商品id拼到“加入购物车”的请求参数里调用购物车列表拿到购物车记录id提交订单时使用这个购物车id订单提交成功后提取订单号查询订单详情验证数据跟前面下的一致。每一步都可能出问题。比如提取的商品id是空、购物车里没加进去导致下单失败、订单号和预期对不上。但恰恰是这些问题逼着你去搞懂接口间数据传递的每个细节。把这条链路跑通之后你对接口测试的认知会上一个台阶——因为你已经不只是“测单个接口”而是在测接口间的集成质量了。6. 从手动用例到自动化回归数据驱动与常见坑6.1 用数据驱动把一条用例变成几十条手动测试做到一半你自然会想这些用例能不能让它自己跑这时候就要引入数据驱动。数据驱动的核心思路是同一个接口用不同的参数组合去调用用一套逻辑去断言。最常见的做法是准备一份CSV或JSON文件里面放多组测试数据让Apifox或Postman逐行执行。比如登录接口你可以准备这样几组数据用例标题手机号验证码预期结果正常登录13800138000123456登录成功返回token验证码错误13800138000000000登录失败提示验证码错误未注册手机号13900139000123456登录失败提示用户不存在手机号为空123456参数校验失败验证码为空13800138000参数校验失败在Apifox的自动化测试里用“数据源”功能导入这个文件再把断言写成对“预期结果”字段的比对一组数据就会变成一条用例。这部分你手动点五个接口要五分钟数据驱动跑一遍只要几秒钟而且每次回归都用得上。6.2 我实际跑这套项目时踩过的几个坑有一说一再好的练手项目跑起来也会有各种小毛病。这里说几个我在慕慕生鲜项目上真实遇到过的坑你提前知道了能少走弯路。坑一重新导入SQL后接口报“表不存在”。一次我把数据库表结构改乱了想重新导一遍SQL结果后端日志一直报某张表不存在。后来发现是SQL脚本里建表的顺序有问题导到一半报错中断后面的表全没建进去。解决方法是先删掉整个库再一次性重新导入不要在报错后继续。坑二前端页面能登录接口直接调却一直401。这个坑特别有代表性。前端能调通说明后端是好的问题出在你对请求的理解上。用浏览器的开发者工具看一下前端实际发出的请求你会发现有的项目token不是放在Authorization头里而是放在一个自定义的键里或者叫token或者叫satoken之类的。你按网上的通用教程放了Authorization后端当然不认。这种问题一定要学会用浏览器抓包看真实请求这是接口测试的基本功。坑三订单提交成功了订单列表却查不到。这个通常是用户身份串了。你提交订单用的是用户A的token查询订单列表的时候却用了用户B的token那当然查不到。这也是为什么我前面强调要做token自动管理——在手动操作下这种情况很难发现你复制token时很容易搞混让人误以为接口有bug。坑四并发提交订单系统生成了两笔订单。这个严格来说不算坑而是很重要的测试发现。用JMeter或者Apifox的并发功能让同一用户同时提交两次订单有的版本没有做接口幂等处理就会创建两笔一模一样的订单。在真实业务里用户手抖连点了两次“提交订单”就会遇到这个问题。这恰恰是这个练手项目最有价值的地方——它不是假项目是真的能测出业务缺陷的。我把这些问题的排查思路整理成一张表你遇到类似情况可以照着定位现象可能原因定位思路接口全部超时后端没启动/端口不对/防火墙拦截看后端日志端口占用浏览器直接访问后端地址接口返回500数据库连接问题/代码报错查后端日志堆栈确认数据库密码库里有没有数据登录返回账号密码错误验证码没配对/数据库里的用户状态异常去库里查用户表确认这条用户数据存在能登录但下单失败token字段传递错误/购物车为空/商品库存不足抓包看前端真实请求头和参数逐段复核链路订单状态一直不变化支付回调没有触发/后端没处理支付通知确认支付接口是否真正被调用成功订单状态流转逻辑对应哪个接口6.3 练完之后这份经验如何迁移到真实项目慕慕生鲜练完之后千万别觉得这就完事了。你在这个项目里学到的方法论是完全可以平移到公司项目里的。比如你练会了环境变量管理token那到了真实项目里不管对方用的是JWT还是Sa-Token思路都一样只是解析响应的字段名变了。你练会了数据驱动到了真实项目里就能跟开发说“我把这个接口的20组边界数据都跑了一遍”而不是说“我用工具调通了”。你练过并发下单发现重复数据以后在真实项目里就会主动想到幂等性测试。这些才是练手项目真正带给你的东西。我在实际带人的过程中最明显的体会是认认真真把一个业务闭环项目测透的人跟只翻教程不动手的人聊起接口测试完全是两种状态。前者能讲出具体的接口路径、参数格式、异常现象后者只能说出一堆名词。如果你已经买好了Postman或者Apifox但一直不知道拿什么项目练手我建议你直接下载一套慕慕生鲜按这篇文章的路线走一遍。最后再分享一个小技巧每条用例跑通之后试着把同样的请求原样重放两遍看看系统对重复操作的容忍度。很多测试新人忽略的幂等测试就是从这样一个不起眼的小动作开始的。
返回列表