ARTICLE DETAIL

资讯详情

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

Apifox接口测试从入门到自动化:替代Postman的工程实践指南

Apifox接口测试从入门到自动化:替代Postman的工程实践指南 后端联调群里又双叒有人发来一个“通了没”的消息然后甩过一份 Swagger 文档链接。我已经数不清这是今年第几次在 Postman 里对着十几个接口来回切环境、手动填 token、复制响应里的值再贴到下一个请求的 Header 里了。直到换用 Apifox 做接口测试我才发现原来一个工具可以把接口调试、文档、Mock 和自动化测试全部串起来不用在所有环节之间来回搬运数据。这篇文章就是我最近用 Apifox 从零做接口测试的完整记录整理了从安装下载、发起第一个请求到用测试用例集做自动化验证的全过程特别适合刚接触服务端接口测试、正在 Postman 和 Apifox 之间犹豫不决的人参考。1. 为什么我这几年从 Postman 换到 Apifox1.1 不是 Postman 不好用是团队协作太碎了我在第一家公司做测试时接口调试用的就是 Postman。单论“发一个请求看看返回什么”Postman 至今依然是标杆。但项目一旦变大问题就暴露了后端更新了接口文档在 Swagger 里测试用例在 Postman 的集合里Mock 数据又是另一套东西。前端联调需要先等后端起服务测试同学想提前写用例又看不到最新的接口参数。一个简单的字段类型改动可能上午后端改完代码下午文档还没同步测试这边已经按旧参数写好断言了。我当时的解决方式是不断手动同步信息从 Swagger 看参数再到 Postman 里改请求体最后在文档站点上更新说明。听起来很低效但很多团队到现在仍然这么干。Apifox 打动我的第一点就是它把接口文档、调试、Mock、测试这几个环节放在同一个平台上。后端把接口定义写进 Apifox 之后请求参数和响应结构是结构化的前端可以立刻拿到 Mock 数据开始联调测试也能直接基于同一份接口定义去写用例信息源头统一了。1.2 和 Postman、JMeter 对比Apifox 的差异化在哪很多刚接触接口测试的人会问Postman、JMeter、Apifox 到底该学哪个我的判断是如果只做简单的“发请求看响应”三者都够用如果要做系统性的接口测试并保持团队协作Apifox 的学习曲线更友好。能力PostmanJMeterApifox接口调试很强一般很强接口文档管理弱依赖外部工具无内置结构化管理Mock 数据需第三方服务无内置按数据结构自动生成自动化测试需搭配 Newman 和 CI专业但门槛高内置测试用例集一键运行团队协作免费版受限较弱支持项目成员共享中文化体验一般一般原生中文有人说 Apifox 是“Postman Swagger Mock JMeter”四合一体这个说法不算夸张。尤其对国内团队来说原生中文界面带来的沟通成本降低是实打实的。比如后端写接口定义时可以直接写中文描述测试写断言时看中文提示新人上手速度快很多。当然它也有缺点最明显的是界面功能密度高刚打开容易懵不知道先点哪里。插件生态也不如 Postman 那么丰富。但这些在一个目标明确的接口测试场景里影响并不大。2. 动手前先理清一次接口测试到底在测什么2.1 HTTP 接口测试的最小闭环请求、响应、断言很多人第一次用 Apifox 时只做了“发请求、看响应”然后觉得自己会接口测试了。这只是调试不是测试。真正的接口测试必然包含“判断结果是否符合预期”这一步也就是断言。我用点外卖来打比方你点一份宫保鸡丁发起请求商家收到订单后开始做菜服务端处理骑手把外卖送到你手上响应你打开盒子检查有没有送错、分量够不够断言。如果只点单不检查那永远不知道商家有没有做错菜。接口测试里的“检查”就是断言。一次完整的 HTTP 接口测试至少包含三个要素请求请求方法GET、POST、PUT、DELETE 等、URL、请求头Headers、请求体Body。响应状态码、响应头、响应体、响应时间。断言把响应里的实际值和我们的预期值比对得出通过或失败。举个例子。用户登录接口定义如下请求POST /api/v1/login请求体为 JSON包含username和password。预期响应状态码200响应体{code: 0, data: {token: abc123}}。我们要断言的内容状态码是 200code等于 0data.token不为空响应时间小于 1000ms。这四条断言覆盖了状态、业务码、关键数据、性能四个维度。可能在真正项目里还不够全但作为一次最小闭环测试已经算合格了。2.2 接口测试的常规流程在 Apifox 里的落地路径老测试都熟悉一套传统流程需求分析 → 接口文档评审 → 用例设计 → 环境准备 → 执行测试 → 缺陷跟踪 → 回归测试 → 测试报告。这套流程放到 Apifox 里每一步都有对应的落点。接口文档评审在 Apifox 里看后端维护的接口定义直接对请求参数、响应字段提评审意见。用例设计在接口详情下新建多个测试用例比如正常参数、缺少必填参数、字段类型错误、超过长度限制等。环境准备在“环境管理”里配置开发环境、测试环境、生产环境的 Base URL 和全局变量。执行测试运行测试用例集Apifox 会按顺序请求并汇总通过率。缺陷跟踪接口报错时复制出错信息给开发或导出测试报告。回归测试接口代码变更后重新运行之前建好的测试用例集验证有没有破坏旧功能。这个流程的关键不在于工具本身而在于你脑子里得有一套“先想清楚测什么再选工具执行”的思维。很多人只用一个 Apifox 的调试功能本质上是拿大炮打蚊子。3. 第一次用 Apifox 做接口测试按这个顺序来3.1 下载安装与进入项目前的准备从 Apifox 官网下载对应系统的安装包Windows 是 exemacOS 是 dmg下载后一路下一步就能装上。安装完用手机号或邮箱登录登录后创建一个团队和项目项目按业务模块起名就可以比如“商城后台”或“用户中心”。进入项目后我建议先做两件事否则后面会返工。第一建好目录结构。左侧能看到接口管理的树状目录先按业务模块建好文件夹用户模块、订单模块、支付模块。以后每个接口都能放到对应目录里测试用例多了之后找起来不费劲。第二配置环境变量。点击右上角或左侧的“环境管理”入口新建一个“测试环境”添加一个变量BASE_URL值填测试环境的域名比如https://api-test.example.com。为什么要这么干因为如果你直接把完整 URL 写死在请求里以后测试环境地址一换所有请求都要手改那不是测试是消耗生命。用{{BASE_URL}}这个占位符引用变量后切换环境只需要在环境下拉框里换一个选项。3.2 新建接口并发出第一个 GET 请求打开你的项目在左侧选中要放置的目录点击“新建接口”。Apifox 的“接口”是有结构的不像 Postman 那样就是一个请求它会让你维护请求路径、请求参数、响应定义等元数据。对于初次使用的人我建议先把“接口路径”和“请求方法”填好再点“发送”进入调试模式。以“获取用户信息”为例路径/api/v1/users/1方法GETURL 完整拼接后是{{BASE_URL}}/api/v1/users/1在调试面板里选择方法为 GETURL 里填入拼接后的地址点击“发送”。右侧会显示响应区包括状态码、响应时间、响应体。如果你看到一个 JSON 结构返回说明接口已经通了。这里有个小经验如果你的后段给了你 Swagger / OpenAPI 文档完全不用手动建接口直接在 Apifox 里“导入数据”支持 OpenAPI/Swagger、Postman 集等格式导完接口定义全部自动生成省下大量重复劳动。3.3 带参数的 POST 请求Header、Query 和 Body 怎么填GET 请求一般只带查询参数但真实业务里更多是 POST。拿用户登录来说我们需要发送账号密码到服务端换取 token。在刚才的新建接口界面把方法改成 POST路径填/api/v1/login。然后在请求头里加一项Content-Type: application/json。注意如果请求体是 JSON 字符串这里必须是application/json否则后端可能解析不出来。Body请求体选择“raw”里的 JSON 格式填入{ username: admin, password: 123456 }点击发送如果账号密码正确响应体里通常可以看到token字段。这是整个接口测试里最常用的一个动作登录拿 token然后把 token 放到后续请求的 Header 里。Apifox 支持多种 Body 类型我刚用的时候经常分不清这里列个表Body 类型说明典型场景none无请求体GET / DELETE 请求form-data表单数据可上传文件文件上传接口x-www-form-urlencoded表单 URL 编码传统网页表单提交raw原始文本常配合 JSON/XML绝大多数 JSON 接口binary二进制数据上传图片、文件等刚接触接口测试时90% 的 POST 请求都是 raw JSON先把这一个组合用熟其他类型等遇到了再看也来得及。3.4 用断言和环境变量让测试结果可判定请求通了不代表测试通过这一步很关键。在 Apifox 里断言写在“后置操作”中因为它的执行时机是在响应返回之后。以登录接口为例添加以下几个断言脚本// 断言状态码为 200 pm.test(状态码为200, function () { pm.response.to.have.status(200); }); // 断言响应时间小于 1000ms pm.test(响应时间小于1000ms, function () { pm.expect(pm.response.responseTime).to.be.below(1000); }); // 断言业务码 code 为 0 pm.test(业务码code为0, function () { var jsonData pm.response.json(); pm.expect(jsonData.code).to.eql(0); }); // 断言 token 不为空 pm.test(token不为空, function () { var jsonData pm.response.json(); pm.expect(jsonData.data.token).to.not.be.empty; });如果你之前用过 Postman会觉得很熟悉因为 Apifox 兼容 Postman 的pm.*语法从 Postman 迁移过来的人几乎零成本。写完脚本后点击发送Apifox 会在“测试结果”区域展示每条断言通过与否。同时我们还需要把响应里的 token 存起来给后续接口用。在“后置操作”里添加一个“提取变量”的步骤脚本如下var jsonData pm.response.json(); pm.environment.set(token, jsonData.data.token);这样token就被写进了环境变量。下一个需要登录态保护的接口请求头里填Authorization: Bearer {{token}}就能自动带入。这里要注意环境变量在 Apifox 里有环境级别和全局级别的区别如果你在“测试环境”下设置的变量请求发的是“生产环境”变量就取不到。这是新手最容易踩的坑后面会单独说。4. 从单个请求走向接口自动化4.1 用测试用例集把多个接口串成一条场景单接口测试再熟练也只是接口测试的起点。真实业务里几乎不存在“调一个接口就完成任务”的场景更常见的是一个完整的用户操作链条比如登录 → 获取个人信息 → 创建订单 → 查询订单。这时我们需要把多个接口按业务顺序组织起来一次执行完这就是“测试用例集”。在 Apifox 的项目里创建“测试用例集”把刚才做的登录接口加进去作为第一步再把用户信息、创建订单、查询订单等接口按顺序加进去。每个接口在测试用例集里相当于一个“测试步骤”Apifox 会按照顺序依次发送请求。点击“运行”就能看到整条业务链路的测试结果包括每一步通过的断言数和失败的断言数。这样做的好处是以后每次版本迭代只需要重新运行这条用例集就能快速判断核心业务链是否被破坏。比起打开 Postman 一个个手动点发送再肉眼看响应效率完全不是一个级别。4.2 接口间数据依赖用 sendRequest 同步取参在串联接口时接口与接口之间往往存在数据依赖。最典型的就是登录之后拿 tokentoken 再用于后续接口的鉴权。前面已经讲了怎么把 token 存进环境变量但还有一种更灵活的方式pm.sendRequest同步调用其他接口获取数据。我经常遇到的一个场景是测试环境 token 有效期很短刷新一次就要重新登录。如果每次都先发登录请求复制 token再回到目标请求里粘贴效率太低。在 Apifox 的“前置操作”里用脚本动态获取 token 就舒服多了const loginRequest { url: pm.environment.get(BASE_URL) /api/v1/login, method: POST, header: { Content-Type: application/json }, body: { mode: raw, raw: JSON.stringify({ username: admin, password: 123456 }) } }; pm.sendRequest(loginRequest, function (err, res) { if (err) { console.log(登录请求失败, err); return; } var json res.json(); pm.environment.set(token, json.data.token); });这段脚本放在“前置操作”里意思是在目标请求真正发出之前先偷偷发一个登录请求拿到 token 后写入环境变量。此时目标请求的请求头里写Authorization: Bearer {{token}}Apifox 发送时会替换成刚刚写进去的值。这个模式适用于所有需要动态取参的场景比如从列表接口里取出第一个 ID 传给详情接口。有一点必须提醒pm.sendRequest是异步的你在后面写pm.environment.set记得放在回调函数里不要写在pm.sendRequest后面直接执行否则可能变量还没写入就已经开始发下一个请求了。这个顺序问题我见过太多人踩坑。4.3 循环调用接口批量构造测试数据做性能测试前置准备或数据准备时经常需要批量创建数据。比如测试分页功能需要造几百个订单数据测试并发场景需要同时创建多个用户。在 Apifox 里循环调用可以靠脚本来实现。一个常见的场景是循环创建用户for (let i 0; i 100; i) { const createUserReq { url: pm.environment.get(BASE_URL) /api/v1/users, method: POST, header: { Content-Type: application/json }, body: { mode: raw, raw: JSON.stringify({ username: test_user_ i, password: 123456 }) } }; pm.sendRequest(createUserReq, function (err, res) { if (err) { console.log(第 i 条数据创建失败); } }); }这段脚本会在当前环境变量对应的服务上创建 100 个测试用户。使用这个办法时建议设一个小的延时比如每次创建后setTimeout停顿几十毫秒避免瞬间打满服务端连接数影响测试环境稳定性。实测中因为循环太快导致服务端拒连的情况我遇到过不止一次。如果不想写循环脚本也可以考虑用数据文件驱动的方式把测试数据维护到一个 CSV 或 JSON 文件中然后让测试用例集逐行读取执行。这种方式适合“同样的接口、不同的数据”的参数化测试比在脚本里写几十条pm.sendRequest好维护得多。4.4 定时任务与导出 Excel 测试结果接口自动化不只是自己手动点“运行”还可以挂定时任务定期执行。Apifox 内置了定时任务的功能可以指定测试用例集每天或每周固定时间自动运行运行完展示通过率和失败详情。对回归测试来说这个功能非常有价值每天早晨 8 点跑一遍核心业务用例集失败了看失败的是哪一步再去找对应开发处理问题暴露的时间能提前很多。另外测试结果的汇总和汇报也是接口测试工作的一部分。运行完测试用例集后Apifox 支持把测试结果导出Excel 导出是很常见的方式。导出的文件里包含接口名称、请求方法、状态码、断言结果、响应时间等字段拿到这个表格直接可以整理成测试报告给项目组看。对于需要写测试报告的人来说这个功能省了不少手工整理时间。5. 实测下来最容易踩的坑5.1 环境变量不生效翻车现场最典型的两种我见过最多的问题就是明明设置了环境变量接口请求里也写了{{BASE_URL}}但发送时它没有被替换或者替换成了错误的地址。原因基本逃不出两种环境没切换或者变量名拼错。Apifox 右上角或发送按钮附近有当前环境的选择下拉框很多人设置完环境变量后环境还是停留在“无环境”或“生产环境”发出的请求自然得不到预期值。只要切换成你刚才设置变量的那个环境即可。另一个坑是变量名拼写不一致。比如在环境管理里写的是BASE_URL请求里写的是{{baseUrl}}虽然人眼看差不多但 Apifox 的变量替换是区分大小写的。排查时先看控制台日志里的实际请求 URL一眼就能看出有没有替换成功。还有一层隐藏坑在脚本里用pm.environment.set(token, ...)设置的变量如果你的脚本在“测试环境”下执行但请求发送时切到了“生产环境”那 token 就会被写到测试环境里生产环境读不到。所以写脚本前一定要确认当前准备运行的环境是哪一个。5.2 JSON 响应中文乱码和编码问题接口返回的数据里经常带中文尤其是返回提示信息时。Apifox 默认对 UTF-8 编码支持良好但我确实遇到过响应体中文乱码的情况排查后发现是后端返回的 Content-Type 头没写charsetutf-8或者服务端返回的是 GBK 编码。遇到乱码优先看响应头里的Content-Type是不是application/json; charsetutf-8。如果是那就是 Apifox 解析问题通常把响应区格式切一下或重发一次就好。如果服务端确实是 GBK就需要在脚本里手动解码或者找后端统一一下编码规范。接口测试场景里编码问题不常遇到但遇到一次就够你折腾半天先看响应头是最快的定位方式。5.3 断言写得太“虚”导致用例一直绿灯比报错更可怕的是误报用例显示通过但实际接口已经坏了。最典型的原因是把 JSON 节点名拼错了。比如响应体里字段是userName你写了个pm.expect(jsonData.username).to.eql(admin)Apifox 执行时找不到username变为了 undefined断言不成立应该报错才对。但如果只写了不存在的断言比如断言jsonData.msg包含“成功”而接口根本没这个字段就会变成 undefined 断言不会报错但也没意义。为了避免这类“假通过”我现在的习惯是每条断言至少覆盖三层第一层状态码断言保证 HTTP 层是通的。第二层业务码断言比如code等于 0保证后端逻辑是否正确。第三层关键字段存在性断言保证响应结构里出现预期的关键数据。每多一条有效断言测试的可靠性就高一分。想一眼看出断言到底覆盖了什么就在测试结果面板里点开每条断言的日志看看实际值和预期值是不是真的比对上了。我个人做接口测试的体会是工具永远只是工具Apifox 能帮你把“发请求—取参数—写断言—跑用例—出报告”这条链路压缩到几分钟内但前提是你先想清楚每个接口的预期结果是什么。新手上手时不用急着把环境管理、变量提取、定时任务这些功能全部用上先从登录接口开始把“请求、响应、断言”这个最小闭环跑通再加上环境变量解决 token 传递基本就能覆盖日常 80% 的接口测试需求。最后再分享一个小窍门遇到接口报错不要急着怀疑工具先看响应体里返回的错误信息再回头检查请求参数很多所谓“测不通”的问题其实就是参数名拼错了或 Header 忘了带。
返回列表