小型Web项目接口测试全流程复盘:以图书借阅系统为例
先说个我的感受接口测试在一个小型Web项目里的性价比往往被很多人低估了。UI自动化要等前端页面能点手工回归又慢又不稳定而接口测试不一样只要后端接口开发完一个就可以立刻测一个等前后端联调的时候主要接口其实已经被扫过好几轮了。这篇文章我就拿最近做的一个“图书借阅管理系统”来完整复盘——从前端Vue、后端Spring Boot、数据库MySQL这种典型的前后端分离项目出发从需求分析、用例设计、环境准备到测试执行、问题排查、报告输出把整个流程走一遍。这个项目规模不算大核心业务接口大概十几个但“麻雀虽小五脏俱全”注册登录、权限控制、库存校验、条件分页查询这些该有的难点一个不少。所以这篇东西不只适用于这个图书项目你手头任何一个小型Web项目都可以照着这条线重新理一遍。适合谁看有基础但刚入门的测试、被“会点点点”卡住想往深走的功能测试、以及后端开发想自己补接口验证的人。1. 拿到需求之后先别急着打开Postman1.1 需求文档里到底要抽出什么信息很多人做接口测试拿到需求文档就直接开始写用例甚至直接打开工具对着接口路径一顿乱填。这在小项目上看着效率高实际上后面踩坑会踩到怀疑人生。我自己的习惯是不管项目多小先拿一个空文档回答四个问题系统里有哪些角色每个角色能做什么这些操作落到后端是什么动作也就是说要定义清楚系统有哪些接口每个接口需要哪些参数这些参数的业务规则是什么整条链路上最容易出问题的环节在哪。拿这个图书借阅管理系统来说。系统里有两种角色普通读者和管理员。普通读者能注册、登录、查书、借书、还书管理员在此基础上还能上架图书、下架图书、处理逾期。这些操作落到后端就是一个一个的REST接口。我通常在需求分析阶段会先产出一张接口清单它就像项目的测试地图后面所有用例都是围绕这张表展开的。接口功能方法路径主要参数业务说明用户注册POST/api/auth/registerusername、password、email用户名唯一密码需加密存储用户登录POST/api/auth/loginusername、password登录成功返回token后续接口都要带分页查询图书GET/api/bookspage、size、keyword支持按书名模糊搜索和状态过滤借阅图书POST/api/borrow/recordsbookId、userId库存要大于0同一本书同时只能一个人借归还图书PUT/api/borrow/records/{id}/returnrecordId只允许借阅人本人归还上架图书POST/api/admin/bookstitle、author、stock管理员权限下架图书PUT/api/admin/books/{id}/offlinebookId、reason下架后读者端不可见这张表里最难的定义不是URL而是“业务说明”这一列。因为接口测试的核心是从业务规则出发推导验证点你连规则都说不清楚用例自然无从谈起。1.2 一句话需求怎么拆成可验证的检查点我之前看过太多人把需求文档里的原话原封不动抄到测试用例里这等于没写。比如需求文档里写“借书时校验书籍库存”这句话单独拿出来没法测因为它没有边界。我的做法是把它翻译成一组具体的验证点。就这一句话拆开之后至少是五个用例库存大于0时借书成功数据库里的可借库存减一库存等于0时借书失败返回明确的业务错误码读者同时借剩余库存只有1本的书最终数据不能出现负数未登录用户直接调用借书接口返回401普通读者调用管理员专用的下架接口返回403。这个过程叫“把自然语言翻译成用例语言”是整个需求分析阶段最核心的产出。同样的方法用到其他需求上。比如“用户名唯一”拆出来就是注册一个已存在的用户名提示冲突注册成功后数据库里只有一条该用户名的记录紧接着查接口列表新注册用户出现在列表里。再比如“下架后读者不可见”拆出来是管理员下架某书后普通读者查询接口里不再出现这本书但管理员的接口里仍然能看到这本书状态变为下架下架的图书在借阅记录里仍然可查。“不可见”在不同角色眼里是完全不同的表现。从需求文档里拆出来的这些验证点才是真正能指导测试执行的输入。我建议每个团队在项目初期就固定这个动作哪怕只花半天时间后面省下的是远远超过半天的排查时间。1.3 先摸清接口间的依赖关系不然执行时连环报错小项目的需求分析还有一个特别容易被忽略的环节理接口依赖。很多测试新手是一上来拿着接口清单从第一个测到最后一个结果测到一半发现创建借阅记录时总是报“用户不存在”其实是因为用户是另一个用例组里的还没有被创建出来。这个图书项目里接口依赖关系大致是这样的注册接口不依赖任何前置登录接口依赖注册查询图书不依赖登录属于公开接口但“借阅图书”依赖登录状态和图书存在“归还图书”依赖借阅记录存在“上架图书”和“下架图书”依赖管理员账号登录。我通常会在文档里给这套依赖关系画一个执行顺序大原则是先基础数据接口再业务操作接口最后是依赖指定记录ID的接口。拿这个项目举例我就按这么个顺序跑造基础数据——注册几个普通用户、登录一个管理员先跑数据准备接口再跑查询类接口确认基础数据可见跑创建类接口比如上架图书、创建借阅记录最后跑依赖前一步返回ID的接口比如归还刚才创建的借阅记录。这个顺序看起来是常识但真到了执行现场很多人会因为嫌麻烦直接乱序跑然后被各种“看似Bug实则环境顺序问题”折磨。还有一个依赖容易被忽略就是数据传递依赖。比如借阅接口创建成功后会返回一个recordId归还接口需要这个ID才能调。这种动态数据在小项目里经常靠人工复制粘贴一旦环境通知一次ID全变了测试数据也跟着全乱。所以从需求分析阶段开始我就明确哪些动态数据需要存变量、哪些通过查询接口动态获取这个习惯能帮你省掉大量重复劳动。2. 接口测试用例设计从单接口到全链路2.1 单接口用例设计模板30%和100%覆盖差别很大需求分析做完接口清单、验证点、执行顺序都有了接下来就是正经的用例设计。接口测试用例设计我最常用的一套结构是功能用例、业务规则用例、边界与异常用例、安全用例再加一个性能初查。以注册接口为例至少设计这些用例正常注册一个不存在的用户验证返回200提示注册成功用完全相同的信息再次注册业务规则拦截返回用户名已存在密码长度为5位、16位、17位验证边界username为null、空字符串、空格字符串验证参数校验邮箱格式非法验证字段格式请求头不带Content-Type application/json看服务端如何解析失败注册成功后用错误密码登录确认密码确实经过加密并和明文不同。这张用例表在写的时候就可以落地为表格格式建议团队直接沉淀成模板用例编号用例标题前置条件测试数据操作步骤预期结果优先级REG-001正常注册新用户无none