一、接口测试到底在做什么
接口测试不是发请求看200,是测试系统组件之间契约的实现程度。包括四层:
协议层:请求方法、Content-Type、状态码、响应 JSON 是不是合法。
业务层:登录成功是不是返回有效 token,下单后库存是不是扣减,删除接口是不是真的删除数据,修改接口字段是不是真的更新。
数据层:接口返回成功不等于数据落库。注册成功后用户表是不是有新增记录,支付成功后订单状态是不是从待支付变为已支付,写操作字段是不是准确写入。
异常层:参数缺失、类型错误、重复请求、权限不足、依赖服务超时。
二、用例设计包括加输入域方法
包括法:
通过性:输入正确参数,证实状态码和返回数据完整性,作为冒烟基础。
参数组合:针对必填、非必填、默认值做组合。多个选填参数时,可用决定表法包括组合场景。
安全:绕过前端修改金额或 ID,A 用户 token 调用 B 用户订单接口,敏感字段是不是加密传输。
异常:必填缺失、要求 Int 传 String、长度超出数据库字段定义、特殊字符、空值或 null。
业务思路:登录失败 5 次锁定账号,库存不足不能下单,已支付订单不能重复支付,已冻结用户不能登录。
输入域方法:
等价类加边界值:对有范围要求的参数,测上点、离点,同时包括有效和无效等价类。
类型和格式:数字字段传字符串,手机号传非法格式,日期传错误格式,枚举传不存在值。
排重和幂等:字段要求不可重复时,重复发送相同参数证实服务端处理;涉及资金、订单的接口必须单独设计幂等用例。
三、工具选型跟场景一致
Postman和Apifox适合手工调试、接口联调、团队协作管理用例,但大规模自动化和复杂思路能力较弱,深度 CI 集成一般仍需代码化方案配合。
Python加Requests加Pytest适合复杂业务流程、数据驱动和CI/CD不断回归,初期搭建有成本,需要编程基础。
Java 加 RestAssured适合Java技术栈团队,和JUnit、TestNG集成方便,非Java团队学习曲线较陡。
JMeter 适合接口性能测试、并发和负载证实,做纯功能测试时维护成本偏高,脚本编写较复杂。
小团队或快速证实从Postman、Apifox起步;中大型项目、需要长期回归和CI门禁的,代码型框架的可维护性优势会逐渐显现;需要同时证实接口功能和性能的,JMeter可包括性能侧,但功能回归仍建议交给代码型框架。
四、自动化和CI/CD
接口测试执行快、稳定性高,天然适合放进CI流水线做质量门禁。抓住几个点:
分层设计:配置层管理多环境 base_url 和 timeout,接口层一个接口一个封装方法,用例层只写业务思路和断言,数据层用 YAML 或 Excel 做数据驱动。数据驱动让脚本和数据分离,业务规则变化时只改数据文件,不动脚本。
断言不能只看 200:要证实响应体中的业务code、重点字段值、数据结构,涉及写操作的再补数据库断言。
触发和门禁:代码提交或合并请求时自动触发接口回归,失败则阻断合并;也可以定时跑重要链路。Apifox CLI、Newman、pytest命令都可以嵌入GitLab CI或Jenkins流水线步骤。
数据独立性:每个用例执行不应依赖上一个用例残留数据。通过setup和teardown钩子做数据预置和清理,避免测试数据污染导致单独跑通过、一起跑失败。
五、进阶
幂等性:同一请求执行一次和执行多次,副作用应当一致。重要场景是重复支付、重复提交订单、网络重试导致请求重发。测试时对同一参数多次发送,证实只有第一次产生实际业务效果,后续被正确识别并拒绝重复副作用。并发同时打进来的重复请求也要包括,顺序重试和并发重复是两种不同风险。
数据库检查要有三层意识:以订单为例,响应层看状态码、order_id、金额;DB 层看订单表、订单明细表、库存表字段是不是正确;一致性层看订单金额是不是等于明细之和、库存减少量是不是等于购买数量。
契约测试:微服务架构下,接口测试只靠集成测试成本高且反馈慢。契约测试证实 provider 和 consumer 对请求格式、响应 schema、状态码的约定是不是一致,不需要双方同时部署。Pact 是消费者驱动契约的主流工具,Spring Cloud Contract 更适合 Java 和 Spring 生态下的生产者驱动场景。
鉴权测试:JWT 要证实篡改 payload 后是不是被拒绝、签名是不是检查、是不是可伪造、过期 token 是不是失效;OAuth2 要重视授权码流程是不是防 CSRF、redirect_uri 是不是白名单检查、token scope 和刷新思路是不是正常。
性能不同视 P95 和 P99,而不是只看平均值:常用标准包括响应时间、吞吐量、错误率、并发用户数。平均值容易被长尾请求掩盖,P99 才能暴露极端情况下的用户体验。
Mock和依赖治理:接口依赖第三方服务或不稳定下游时,用 Mock 返回设定义的正常、超时、错误码、格式异常响应,证实本接口的容错思路;同时保持每个用例的数据隔离,避免依赖状态污染导致并行执行冲突。