ARTICLE DETAIL

资讯详情

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

Postman接口自动化实战:集合、断言、数据驱动与Newman报告

Postman接口自动化实战:集合、断言、数据驱动与Newman报告 最开始接触接口测试那阵子我几乎全靠手工点点点一个接口十个用例每次换参数、看返回、对字段半天下来眼睛花了不说还特别容易漏断言。后来把 Postman 用熟了才发现这个工具完全可以承载接口自动化测试的整套流程——用例沉淀成集合、批量跑出结果、失败自动高亮再加上 Newman 配合生成可视化报告团队里人人都能看懂测试结论。这篇文章就围绕这条链路把我实际摸索出来的选型、写法、执行和报告方案完整拆一遍适合刚入手接口自动化、不想一上来就造代码框架轮子的团队参考。1. 为什么我把接口自动化押注在 Postman 上1.1 接口自动化的本质问题回归效率与用例沉淀接口自动化测试要解决的从来不是“能不能调通”而是“改完代码之后能不能用最短时间把核心链路全部验一遍”。手工点接口最大的问题在于用例全部存在人脑子里——今天记得这个接口要校验哪些字段明天可能就忘了更不用说团队成员之间根本没法定量共享。自动化真正的价值是两条一是把用例变成可重复执行的资产二是把“通过/失败”的判定从人眼变成断言脚本。我做过的项目里接口数量少则十几个、多则上百个每次版本迭代都涉及字段新增、参数校验逻辑调整。如果没有一套自动化的回归用例光是回归测试就要占掉一整天。Postman 的 Collection 天然就是干这个事的一个集合里可以放几十上百个请求每个请求配好自己的断言跑一遍的结果一清二楚。它不要求你先写 Java、Python 框架不需要配置复杂的依赖和编译环境打开工具就能开始沉淀用例这是它作为自动化测试入口最大的价值。1.2 Postman 与代码框架的取舍快、轻、门槛低团队里经常有人争论接口自动化到底用 Postman 还是用代码框架我的结论是看团队构成和项目阶段。代码方案比如 Java 的 RestAssured 或者 Python 的 Requests Pytest优点是灵活、适合超大规模用例、便于和公司统一测试平台深度集成缺点是学习成本高、上手慢、维护链路长中小团队往往写完框架就没精力写用例了。Postman 的快和轻恰恰切中痛点。一个请求从导入到加上断言两分钟内能跑起来新手看一遍界面就能维护用例要分享给同事导出一个 JSON 文件或者直接共享集合链接就行。它当然也有短板——复杂逻辑处理不如代码灵活几千条用例跑起来性能一般。但多数业务项目的接口体量根本到不了那个程度几百个用例用 Postman 已经稳得很。我的实际建议是项目初期直接用 Postman 把自动化跑通等用例规模大到需要平台化管理时再考虑把用例迁移到代码框架不迟届时 Postman 导出的 JSON 也能作为编写代码用例的参考底稿。2. 环境准备安装、汉化与免登录这些“细节坑”值得提前说清楚2.1 版本选择与安装含旧系统的注意事项Postman 安装本身没什么技术含量去官网下载对应平台的安装包一路下一步就行。但有两个细节容易忽略。第一是版本更新的节奏Postman 目前已经到 v10 之后的版本界面和以前的老版本有差异很多网上教程还在讲旧版看教程时要注意版本对应否则菜单入口找不到。第二是老系统的兼容性如果还有人用 Windows 7新版 Postman 早就放弃支持了装最新版会直接报错或者打不开需要去找支持 Win7 的旧版本安装包这个兼容性问题在新版本发布说明里写得很清楚只是搜索时容易被最新版下载地址淹没导致白折腾半天。安装完成后建议先做个基本验证打开工具、创建一个空集合、添加一个最简单的 GET 请求确认能正常发送。这一步能帮你把“工具本身的问题”和“接口脚本的问题”分开免得后面写自动化用例时突然跑不通了还不知道是环境坏了还是脚本错了。2.2 汉化与登录问题用免费正版就够别碰破解包搜索 Postman 相关关键词时“汉化”“破解版”这类词热度一直很高。先说汉化。Postman 官方界面是英文的想用中文主要是通过民间汉化包做法是把对应版本目录下的 app.asar 文件替换成汉化版前提是汉化包版本和软件版本严格对应差一个小版本号都可能启动闪退。我的个人建议是新手别急着汉化。Postman 的核心英文词就那么几十个——Request、Collection、Environment、Tests、Runner用几天就熟了汉化反而容易让你在查资料时对不上官方术语增加困惑。再说登录。新版 Postman 做了强制登录不登录连本地集合都用不了。网上流传的“免登录”“破解版”我劝你直接绕开——破解包通常修改了安装包结构很容易被杀毒软件报毒而且大概率带着后门脚本你公司的接口地址、请求参数、token 全都经它发送这风险远大于省那一次注册的时间。正规做法就是注册一个免费账号邮箱或者谷歌账号都行登录后集合可以云端同步换电脑不丢用例这本身是功能不是障碍。另外如果是公司内部使用可以让团队建一个共享 Workspace所有自动化用例统一放在里面比互相传 JSON 文件舒服得多。2.3 三个核心概念集合、环境变量、全局变量搭好环境之后先把三个最基本的概念搞清楚否则后面所有自动化脚本都玩不转。Collection集合它是用例的容器。你可以把登录、创建订单、查询订单、删除订单这些请求按业务模块放进同一个集合集合里还可以建文件夹做分级管理。自动化执行的最小单位通常是整个集合或者集内指定文件夹。Environment环境变量用于区分不同环境的差异。比如 dev 环境的接口地址是http://dev.example.comtest 环境是http://test.example.com通过环境变量{{base_url}}来引用切换环境时不用改请求内容只切换变量集合就行。环境还可以追加变量组Postman 里一套环境对应一组 Key-Value。Globals全局变量适合放所有环境下都不变的数据比如公司统一的公共请求头字段名、固定的组织 ID。它的优先级低于环境变量——引用变量时Postman 会优先去当前环境里找找不到再去全局里找。这三者的关系可以类比成集合是菜谱环境变量是不同厨房的配料表全局变量是所有厨房都常备的盐。搞清楚这一点后面做登录 token 传递和批量数据驱动才不会一头雾水。3. 从手工点到自动化跑断言、变量、数据驱动三板斧3.1 用 Tests 脚本把“看返回”变成“自动校验”手工测试时我们靠眼睛看返回结果自动化测试靠的则是 Tests 标签页里的脚本。Postman 的断言运行在沙箱环境里语法基于 JavaScript最常用的是pm.test和pm.expect。不需要你会完整的 JS记住几类高频写法就够应付绝大多数场景。// 1. 断言状态码 pm.test(状态码为200, function () { pm.response.to.have.status(200); }); // 2. 断言返回字段值 pm.test(业务code为0, function () { var jsonData pm.response.json(); pm.expect(jsonData.code).to.eql(0); }); // 3. 断言字段存在且非空 pm.test(data列表不为空, function () { var jsonData pm.response.json(); pm.expect(jsonData.data).to.be.an(array).that.is.not.empty; }); // 4. 断言响应时间 pm.test(响应时间小于300ms, function () { pm.expect(pm.response.responseTime).to.be.below(300); });这里有两个容易踩的点。第一eql是严格相等1和1会判失败实际工作中接口返回的数字类型经常出幺蛾子看到断言失败先确认是不是类型问题。第二响应体要是 XML 或纯文本默认的pm.response.json()会报错需要先判断 Content-Type 再选择不同的解析方式所以我习惯在断言函数开头先加一行var jsonData pm.response.json();把解析动作隔离出来后续断言报错时更容易定位是解析失败还是校验失败。3.2 变量作用域与动态参数最容易被忽视的细节自动化用例里会有大量重复使用却又每次不同的参数比如创建订单时要生成唯一订单号、注册时要填随机手机号。Postman 提供了一套动态变量在请求体里直接用{{$timestamp}}、{{$guid}}、{{$randomInt}}这类占位符发送时由 Postman 自动生成随机值。我用得最多的是{{$timestamp}}拼接业务单号配合一个固定前缀能保证每次跑测试时数据的唯一性避免重复数据导致接口幂等校验失败。变量的作用域顺序也需要刻意记一下数据变量data 环境变量environment 全局变量global。也就是说如果环境变量和全局变量里存在同名 KeyPostman 会用环境变量的值如果在 Runner 里上传了 CSV 数据文件文件里的字段名优先级最高。这个顺序决定了你排查“为什么变量没生效”时的方向——先看是不是被更高优先级的同名变量遮挡了。另外要格外注意环境变量的读写。提取响应值写回变量时用的是var jsonData pm.response.json(); pm.environment.set(token, jsonData.data.token);这个pm.environment.set操作的是当前选中的环境如果脚本运行时报错说环境不存在多半是当前环境没选中或者环境被切走了。建议在 Runner 跑批之前先手动切换到目标环境并确认环境变量面板里的 Key 初始值正确。3.3 从 CSV 读数据一个接口批量验证 N 条用例接口自动化里最常见的场景是同一套操作跑不同的数据组合比如用五个账号分别验证权限、用十组关键词验证搜索接口的边界。Postman 的做法是准备一个 CSV 或 JSON 数据文件在 Runner 里上传后每跑一次迭代就读一行数据请求里的{{字段名}}会自动替换成当前行的值。CSV 文件格式很简单第一行是字段名后面每行是一条用例username,password,expectCode zhangsan,123456,0 lisi,wrongpass,10001 wangwu,123456,0在 Runner 的 Data 选项卡里选中这个文件Postman 会显示总共多少条数据。然后请求的 Body 里这样写{ username: {{username}}, password: {{password}} }断言里也能引用当前行的数据pm.expect(jsonData.code).to.eql(parseInt(expectCode));。这里要说一个容易踩的坑CSV 文件里的数值类型Postman 默认当字符串读取所以和返回里的数字类型严格比较会失败建议要么在断言里做类型转换要么在 CSV 里直接用双引号把字符串包起来。还有CSV 文件保存时用 UTF-8 编码否则里面如果有中文会乱码导致断言永远对不上预期值。数据驱动这一个功能基本就能把“一个接口手测十组数据”的重复劳动消灭掉配合 Runner 看报告哪组数据没过一目了然。4. Runner 与 Newman让用例批量跑起来4.1 Collection Runner图形界面里的批量执行Collection Runner 是 Postman 自带批量执行入口。入口在集合右侧的 “Run” 按钮点开后可以选择要跑的集合或文件夹、设置迭代次数、每两次请求之间的延迟时间、是否保存响应结果、是否启用数据文件。第一次跑的时候建议勾选保存响应这样失败用例可以直接看当时的返回体不用再重跑一遍。Runner 执行时是按集合里的请求顺序从上到下跑的这个顺序非常重要。比如前面说到的登录、创建、查询、删除这种有依赖关系的流程请求在集合里的顺序就是执行顺序谁在前谁在后必须摆对。如果中间的请求依赖前一个请求写入的环境变量那前一个请求必须先执行成功变量才会被设置进去。这一点在图界面里看不出问题但跑批时经常出现“第二个请求报变量不存在”就是执行顺序和变量写入顺序错位了。Runner 跑完会给出一个汇总面板总请求数、通过数、失败数、平均耗时。但说实话Runner 自带的结果界面比较简陋没有按请求分类的详细报告也不方便分享给团队看。所以线上跑批我基本都交给 Newman它的可扩展性和报告能力要强得多。4.2 Newman命令行的自动化执行方式Newman 是 Postman 官方出品的命令行工具通过 npm 安装是连接 Postman 集合和自动化体系的关键一环。安装前提是机器上有 Node.js装好后执行npm install -g newman执行一次全量回归的基本命令是newman run 你的集合文件.json \ -e 你的环境文件.json \ -d 你的数据文件.csv \ -r cli,json,htmlextra集合文件和环境文件怎么导出在 Postman 里集合点右侧 “Export” 导出 JSON环境变量也同理。我个人习惯把集合文件、环境文件、数据文件全部放进项目仓库的test/api目录里和代码一起提交。这样每次迭代改接口时测试用例跟着代码走回归时拉最新仓库直接跑比任何人都依赖本地 Postman 环境要稳妥。Newman 也支持 Docker 方式运行不需要在 CI 机器上装 Node一条 Docker 命令就能跑docker run --rm -v $(pwd):/etc/newman \ postman/newman run 你的集合文件.json \ -e 你的环境文件.json文件目录需要挂载进容器否则 Newman 找不到集合文件。这个细节经常有人踩——没挂载目录直接报文件不存在其实文件就在当前目录里。4.3 把 Newman 接进 CI定时跑、提交就跑Newman 最大的价值是可以脱离 Postman 图形界面在服务器上定时或者触发式执行。最常见的接法是接 Jenkins创建一个自由风格任务构建步骤里选 “Execute shell”写入 newman 命令然后把生成的 HTML 报告路径加入 “Post-build Actions” 的 “Publish HTML reports” 配置里跑完就能在 Jenkins 页面上直接看报告。GitLab CI 也同理项目里放一个.gitlab-ci.ymlapi-test: stage: test image: node:18 script: - npm install -g newman newman-reporter-htmlextra - newman run test/api/collection.json -e test/api/env.json -r htmlextra artifacts: paths: - test/api/report.html这里强调一个实践心得CI 里跑接口自动化一定要把“失败即中断”的策略想清楚。默认情况下 newman 跑完失败用例会返回非 0 退出码这会导致 CI 任务红掉你可以选择接受这种失败适合主线接口失败就该阻止发布也可以加--suppress-exit-code让它失败但任务仍显示成功适合辅助性用例集。我个人的做法是分两层核心链路用一个单独任务失败会阻止流水线完整回归用另一个任务允许失败但会推送报告到群人工及时跟进处理。这样既不耽误发布效率也不会放过真正的接口问题。5. 完美可视化报告从 HTML Extra 到 Allure 实战5.1 一套命令生成漂亮的 HTML 报告Newman 自带的 CLI 报告只有文字看着不够直观。对应需求我强烈推荐newman-reporter-htmlextra它是社区里最常用的 HTML 报告增强插件。安装很简单npm install -g newman-reporter-htmlextra然后在跑批命令里加上-r htmlextra和导出路径newman run 集合.json -e 环境.json -d 数据.csv \ -r cli,htmlextra \ --reporter-htmlextra-export test/api/report.html生成的 HTML 报告是独立单页文件样式精致包含总览卡片总请求数、通过率、平均响应时间、每个请求的详细状态、响应时间分布图、断言明细和失败时的响应预览。这个报告直接发给产品、开发、测试群都没有沟通障碍领导要看测试结论也不用打开 Postman 对着界面解释。它还有一个很实用的功能支持自定义主题和标题。比如在命令里追加--reporter-htmlextra-title 某项目接口自动化回归报告 --reporter-htmlextra-light-theme跑出来的报告标题就是中文的页头也有项目名发给外部团队时观感完全不一样。我通常固定一个模板命令存成 shell 脚本每次只要改集合文件路径报告三十秒内出来。5.2 再进一步用 Allure 做更专业的可视化HTMLExtra 报告适合快速查看和分享但如果团队已经有 Allure 这套测试报告体系想把 Postman 的结果也汇进去也不是不行。思路是利用newman-reporter-allure这个插件让 newman 执行时产出 Allure 兼容的结果文件再用 Allure CLI 生成统一报告。npm install -g newman-reporter-allure newman run 集合.json -e 环境.json \ -r allure \ --reporter-allure-export allure-results/ allure generate allure-results/ -o allure-report/ allure open allure-report/Allure 报告的优势是支持历史趋势、用例分层、失败重试等高级信息适合已经搭好测试平台、需要把接口自动化和功能测试报告统一展示的团队。但说实话如果你们还没有 Allure 基础设施一上来就为了 Postman 单独搭一套 Allure 有点重HTMLExtra 报告的性价比已经很高。到底是“完美的报告”还是“够用的报告”取决于你团队当前的报告消费习惯。5.3 报告应该怎么看失败原因定位的三个维度报告不是生成完就完事的重点是会看。拿到一份 HTML 报告我习惯按三个维度快速定位问题。第一是错误类型分布。接口挂了先看状态码——是 4xx 还是 5xx能快速区分是客户端参数问题还是服务端异常。第二是断言明细。状态码全过但断言失败说明接口能通但字段内容不符合预期基本都是业务代码改动导致的字段缺失或类型变化这时候点开失败的响应预览去核对实际数据。第三是响应时间分布。单个请求耗时异常拉长未必是断言失败但它可能是性能回归值得单独排查慢接口。这里还要提一个实操建议在命令行跑批时把--verbose参数加上它会把每个请求的耗时、响应码都打印出来即使不打开 HTML 报告也能先扫一遍有没有明显的耗时异常。报告是给结果看的但排查过程不能只依赖报告命令行输出和日志永远是最快的定位路径。6. 一套完整示例登录态复用与业务闭环自动化6.1 登录接口提取 Token 并自动传递接口自动化里最高频的需求就是登录态复用。大多数业务接口都要带 token如果每个请求手动去维护 token用例根本跑不起来。正确做法是在登录请求的 Tests 脚本里把返回的 token 写入环境变量后面所有请求的 Header 里统一引用。登录请求的 Tests 脚本var jsonData pm.response.json(); // 假设返回结构是 { code: 0, data: { token: xxx, expires: 7200 } } pm.test(登录成功且返回token, function () { pm.expect(jsonData.code).to.eql(0); pm.expect(jsonData.data.token).to.be.a(string).that.is.not.empty; }); pm.environment.set(token, jsonData.data.token);然后后续请求的 Headers 里加一个 Key 为Authorization、值为Bearer {{token}}的请求头——这里的双大括号就是环境变量引用。读者可能要问为什么 token 存环境变量而不是全局变量因为测试环境、生产环境的 token 体系不同存环境变量可以跟着环境切换自然隔离。有依赖关系的流程建议把登录请求放在 Collection 里业务流程请求的最前面Runner 跑批时登录先执行token 写入了环境变量后续请求自动继承登录态。如果遇到某些环境 token 有效期特别短可以在集合里放一个“登录校验”预请求脚本通过pm.sendRequest请求一个轻量接口检查 token 是否还有效失效则自动重登——这个做法复杂一些但接口多、跑批时间长时很实用。6.2 依赖业务接口串联与断言抓手自动化测试做到后来你会发现单接口验证只是基本功真正有价值的是把业务链路串成闭环。拿“创建订单 → 查询订单 → 删除订单”这条链路举例集合里三个请求摆放顺序不能乱并且响应值要通过环境变量在请求之间传递。创建订单请求的 Tests 里把返回的订单 ID 存起来var jsonData pm.response.json(); pm.environment.set(orderId, jsonData.data.orderId);查询订单请求的 URL 里直接用{{orderId}}拼路径http://{{base_url}}/order/{{orderId}}。删除订单也同理。这样整条链路跑下来三个接口互相咬合不是孤立的三段验证。串联链路的断言我通常在每个请求里加两个层次的校验基础层校验状态码和业务 code 都是 0业务层校验前一个请求写入的变量确实被后续请求正确使用。比如查询订单的响应里应该断言返回的orderId和之前写入的{{orderId}}一致——这才能证明数据链路是真通的而不是两边各自返回了成功就算完。6.3 调试自动化脚本的通用套路自动化脚本写出来第一次跑很少是绿的调试是常态。我一般按下面这套思路排查第一步打开 Postman ConsoleView 菜单下的 Show Postman Console看请求发出去了没有、响应状态码是多少、控制台有没有 JS 报错。第二步在 Tests 脚本里加两行console.log(jsonData)把解析后的响应体打出来。Console 里可以直接查看对象结构比盯着一堆原始 JSON 字符串舒服。第三步检查环境变量面板确认上一个请求写入的变量真的存在、值正确。很多“变量不存在”其实是脚本里写错了变量名或者变量写入的时机晚于读取的时机。第四步单请求执行通过后再放到 Runner 里跑一遍确认在批量执行的环境下结果一致。还要提一个很容易被忽略的习惯改动脚本后记得保存并顺手点一下集合的 “Save” 按钮。Postman 里编辑的脚本不会自动落盘经常有人改了断言忘保存Runner 一跑发现还是旧逻辑以为是代码问题实际是保存的问题。7. 跑完后记这些坑我踩了好久才发现7.1 执行顺序与请求依赖Runner 默认按集合顺序执行是好事也是坑。说它是坑是因为很多人没意识到 Tests 脚本里的pm.sendRequest是异步发起的请求执行时机不受集合顺序控制。我之前在某个请求的 Tests 里用pm.sendRequest去拿一个“中间数据”结果这个异步请求还没返回集合已经跑到下一个主请求了主请求引用的变量为空整条链路崩了。这里的经验是跨请求的数据依赖尽量用前置请求直接塞进环境变量不要去依赖异步逻辑。如果确实需要动态获取数据宁可把“获取数据”也独立成一个请求放在集合里靠顺序保证执行而不是靠 Tests 脚本里的异步调用串联。能用顺序解决的问题就不要引入并发复杂度。7.2 环境变量与数据污染的常见场景有段时间我跑自动化经常出现“上午全绿下午全红”的诡异情况最后定位到原因环境变量被手工测试改了。团队里有同事在 Postman 界面手动切换到某个环境、改了里面的 token 值本地环境变量的内容就和我的自动化脚本预期不一致了批量跑起来自然乱套。这里给出我的建议线上跑批用的环境文件、集合文件全部以仓库里维护的 JSON 文件为准每次跑批前用文件重新导入覆盖而不是依赖 Postman 云端的环境变量状态。Newman 执行时用的是命令行传入的环境文件本身可以做到不被人工界面干扰。但如果你有时也要在图形界面里用同一套环境记得在跑批前先执行一次“Environment 重置”或者手动核对关键变量避免数据污染导致的误报。7.3 关于汉化和登录的一些个人结论回到开头说的汉化和登录问题。折腾过汉化包、也见过同事下载破解版之后电脑中招之后我现在给团队的建议就三条。第一登录是必须的注册账号免费别把精力花在找免登录上直接用它提供的免费能力。第二汉化的收益其实很低Postman 的界面词汇固定一周就能适应把术语统一成中英文对照反而更好。第三绝不使用破解版和来路不明的汉化包接口测试工具经手的是全公司最敏感的接口地址、参数和密钥这个底线不能破。另外从谷歌浏览器或者 Charles 这类抓包工具里复制请求、一键导入 Postman 这个功能确实能大大加快用例录入速度。Chrome 的开发者工具里右键请求选 Copy as cURL然后打开 Postman 的 Import 粘贴进去请求的 URL、Headers、Body 全部自动生成我建集合的时候都是这么批量导入的效率比手敲高一个数量级。工具之间流转顺手之后Postman 充当接口测试的统一入口会越来越顺这也是我一直推荐它的原因。
返回列表