视频教学参考:接口自动化测试
一、Apifox入门
1.理解接口基础概念
1)接口概念
接口:全称是Application Programming Interface,中文翻译为应用程序编程接口。
作用:给前端与后端提供交互数据的通道。在Web开发中,承担前后端数据传输的桥梁作用。
2)实战-查看请求记录
1)打开浏览器,按 F12/fn+F12(打开浏览器的开发者工具)
2)切换到 "Network" (网络)面板
3)勾选 "Preserve log" (保留日志)

2.HTTP协议核心要素
1)HTTP协议

2)URL的组成
完整URL由协议类型、主机地址、端口号、资源路径和查询参数五部分组成。以"https://api.example.com:443/v1/users?id=1 "为例:
●协议(https):通信协议
●主机名(api.example.com):服务器地址
●端口(443):服务器入口(通常省略)
●路径(/v1/users):资源位置
●查询参数(id=1):过滤条件
3)请求方法(request methods)
HTTP协议定义了八种请求方法,其中GET(获取资源)和POST(提交数据)最为常用。

4)请求头与请求体
请求头包含Content-Type、Authorization等重要元信息,请求体则承载实际传输数据。

5)状态码(staus code)------服务器的回应
状态码分为五大类,200表示成功,400系客户端错误,500系服务端错误。

6)响应头与响应体

3.接口测试
1)特点
Apifox整合了接口调试、文档管理、Mock服务和性能测试等功能.
Apifox = Postman + Swagger + Mock +JMeter

2)测试流程

3)软件安装
官网下载https://apifox.com/ 对应系统版本安装包(Windows用户执行exe安装程序)
4.创建项目
1)点击"新建项目",输入项目名称"Itheima001",点击创建。
2)在项目内,点击"新建接口"。
3)在中间工作区,请求方法选择GET,输入URL:http://hmshop-test.itheima.net/
4)点击蓝色的"发送"按钮

二、Apifox请求参数详解
1.Query参数
附在URL末尾上,适合GET请求传递简单数据。格式为" q=小米 ",在Apifox的Params选项卡配置。例如商品搜索接口:
位置 :位于URL问号?之后。(例:q=小米)
格式 :键=值pairs,多个参数用&连接。(例:name=张三&age=18)
作用 :用于GET请求,向服务器传递过滤、分页、排序等轻量级参数
特点 :拼接在URL后,速度快,长度受限,适合简单数据
Apifox位置:"Params"选项卡

2.Body参数
请求的"主体内容",登录接口典型配置:
{
"username": "admin",
"password": "123456"
}
位置 :在请求内部,不会显示在URL中。
格式 :最常用的是JSON(复杂数据结构),也可以是form-data(适合文件上传)、xml等。
作用 :用于POST、PUT等请求,提交大量数据,如创建用户、登录、下单。
类型:
- Json:结构化数据格式,支持复杂嵌套,常用于API交互,放在请求体
- form-data:可传文件和键值对,数据分隔传输,无严格长度限制。
- x-www-form-urlencoded:键值对用&连接,URL编码格式,适合简单表单数
Apifox位置:"Body"选项卡。

3. Header参数
内容:包含请求的元信息,常见配置项:
- Content-Type: application/json(告诉服务器Body的格式)
- Authorization: Bearer xxxx(身份认证令牌)
- User-Agent: Mozilla/5.0
位置 :在请求的头部,描述请求本身的信息。
作用 :定义如何处理请求和响应,如内容类型、认证信息、客户端类型等。
特点:与业务数据无关,是关于数据的数据(元数据)。

4.三者比较与案例实现
Query:用于GET请求,在URL中传递轻量参数。
Body:用于POST/PUT请求,在请求体内提交主要数据。
Header:在请求头部传递元数据,如认证和内容类型。
| | Query | body | header |
| 位置 | URL中 | 请求体内 | 请求头部 |
| 常用方法 | GET | POST,PUT | ALL |
| 作用 | 过滤、查询 | 提交数据 | 元数据、认证 |
可见性 | 高 | 低 | 中 |
---|
三、自动判断响应结果
1.断言概念
是判断实际测试结果与预期结果是否一致的检查点,不一致则标记为失败。
2.验证
状态码断言是基础验证,如:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
JSONPath响应体断言是主力,如:
pm.test("Verify username", function() {
var jsonData = pm.response.json();
pm.expect(jsonData.user.name).to.eql("John");
});
常用JSONPath表达式:
$.data.items[0].id
获取首个物品ID$..price
递归查找所有价格字段$.orders[*].status
获取所有订单状态

3.符号含义
① $表示根节点
② .用于访问子节点(如 $.data.name)
③ []用于访问数组元素(如.list\[o\]取第一个元素,.id递归匹配所有id)
④ *匹配所有元素(如$.data.*匹配data下所有子节点)

四、接口关联与提取自动处理
环境变量管理不同测试环境的配置数据,接口关联通过变量提取和引用实现。典型测试流程:
- 获取验证码接口提取uid
- 登录接口调用uid并返回token (其他接口获取token检查是否已登录)
- 查询接口携带token获取业务数据
- 操作接口使用获取的数据id执行操作
实战2:查询课程列表

Hearders添加请求头部Authorization-->{{token}}
参数名称 | 参数值 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
Authorization | token | 是 | eLpNm9m_8UCGrTTshmlNgfXpDsc1f2m2UA | 登录接口 |
●将token值保存在环境变量中:"登录接口"-->"后置操作"-->"添加后置操作"-->"提取变量"-->"填写"

●环境变量验证token结果:

●查询课程列表-->"Headers"-->应用输入"token"

实战3:课程管理模块-删除课程
"删除课程接口"依赖于查询课程列表的 "id" 与 登录接口的 "token"

●新建删除接口,删除指定id课程(添加删除课程接口{{c_id}})环境变量自动更新本地值;
关联登录添加请求头部Authorization-->{{token}}

●调用查询课程列表接口,查询对应课程已删除;
{{c_id}}-->每次删除指定id($.rows[0].id)的课程

●环境变量验证c_id结果:

五、数据库操作校验
1.数据库基本配置

2.案例:新增课程并验证数据库
数据库配置--->应用配置编写SQL语句(如下)--->验证结果
1)在MySQL中创建表(这里直插入了一组数据)
sql
-- 删除原表(谨慎操作!先备份数据)
DROP TABLE IF EXISTS `tb_course`;
-- 重新创建表
CREATE TABLE IF NOT EXISTS `tb_course` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '课程ID',
`name` varchar(100) DEFAULT NULL COMMENT '课程名称',
`code` varchar(50) DEFAULT NULL COMMENT '课程代码',
`subject` varchar(50) NOT NULL COMMENT '学科类别',
`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '课程价格',
`applicable_person` varchar(20) NOT NULL DEFAULT '2' COMMENT '适用人群',
`info` text COMMENT '课程介绍',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标记:0-未删除,1-已删除',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_name` (`name`),
KEY `idx_subject` (`subject`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程信息表';
-- USE course_management;
INSERT INTO tb_course (name, subject, price, info)
VALUES ('手动测试课程', '6', 899, '测试数据');
SELECT id FROM tb_course WHERE name="测试开发提升课程-new999001";
2)Apifox中连接数据库-->新建

3)填写本地数据库信息-->测试连接-->保存

4)补充Apifox-05新增课程中的信息
Body:
{
"name": "测试开发提升课程-new999001",
"subject":"6",
"price":899,
"info":"测试开发提升课程01"
}
Headers:
authorization {{token}}

后置操作:控制台打印结果(主包的控制台没有输出idhttps://chat.deepseek.com/share/vrmf0x37r11rex0lkl AI老师暂时未解答出问题所在,个人感觉可能还是数据库的问题)
SELECT id FROM tb_course WHERE name="测试开发提升课程-new999001";

六、Apifox接口文档管理
定义请求和响应--->发布文档
1.添加响应示例


2.分享文档(便于团队协作测试)

七、Mock(不依赖于后端开发进度)
1.Mock(Method Object Collaboration Kit)作用
隔离测试环境
Mock可以替代真实的依赖组件(如数据库、API、第三方服务等),确保测试仅针对当前模块的逻辑,避免因外部依赖的不稳定性或不可控性导致测试失败。
提高测试速度
真实的外部服务或数据库操作可能较慢,Mock通过模拟快速响应,显著提升单元测试的执行效率。
模拟异常场景
Mock可以轻松构造异常情况(如网络超时、服务不可用等),验证代码在极端条件下的容错能力,而无需真实触发这些场景。
避免副作用
某些操作(如发送邮件、修改数据库)可能产生实际影响,Mock可以拦截这些调用,确保测试不会对生产环境造成意外影响。
简化复杂依赖
当被测对象依赖复杂或未完成的模块时,Mock可以快速模拟这些依赖的行为,无需等待依赖开发完成。
2.设置mock

3.使用mock


每次自动生成body中字段具体值
返回自定义值:新建mock期望


八、测试场景搭建
1.自动化测试
1.在项目中,切换到"自动化测试"模块-->点击"新建测试场景"。

2."添加步骤"-->"从接口导入",将之前创建好的"图片验证码""用户登录""查询课程列表"、"新增课程"等接口用例按序添加进来。

4.通过拖拽调整它们的顺序为:1.图片验证码->2.用户登录->3课程列表->4.新增课程->5.删除课程。
5.右侧"功能测试"-->选择通知对象分享

https://app.apifox.com/link/project/7220961/api-test/test-report/15644116?branchId=6947315
2.企业级测试化场景runner
- 在Apifox桌面端,进入"团队资源"->"通用Runner"。

- 点击"部署通用Runner",复制生成的Docker运行命令。
3.(概念演示)在一台Linux服务器的终端中,粘贴并执行该命令(需先运行Docker)

- 命令执行成功后,在Apifox客户端点击刷新,看到Runner状态"已启动"。


九、解读文档和设计测试点
1.测试点发散
基于登录接口API描述,为'登录'接口设计全面的测试点。包括:正常流程、边界值、异常场景。输出:将测试点汇总表格输出

2.单个参数的深度分析
针对接口参数名为 "uuid",描述是 "生成验证码接口" 的参数设计测试点。

3.练习

https://chat.deepseek.com/share/4cu7rvdq1jq7wbnuw4
十、总结
课程内容总体偏向Apifox在接口自动化测试中的应用操作,熟悉工具使用流程,个人感觉不太适合想系统学习测试的小伙伴。加油吧!