ARTICLE DETAIL

资讯详情

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

Postman Collection批量运行:从手动接口测试到自动化回归

Postman Collection批量运行:从手动接口测试到自动化回归 1. 从手工点按钮到批量回归Collection到底解决了什么问题1.1 手工测试的三大痛点你肯定遇到过如果你用过Postman十有八九经历过这样的场景开发改了后端某个模块你需要在Postman里一个一个点开几十个请求逐个点Send看返回结果。点完一遍颈椎僵硬眼睛发花想再回归一遍又得重来。这不是个人操作习惯的问题而是纯手工接口测试天然的三个弱点。第一耗时。接口一变回归清单少则五六个多则几十个请求每个都要手动切换环境、手动改参数、手动查看结果。哪怕每个请求只要十秒钟三十个请求就是五分钟起步还不包括思考和组织的时间。第二容易漏。手工操作最大的问题不是慢而是注意力会疲惫点着点着就漏掉一个请求或者某个请求参数忘了改测了等于没测。第三没法固定场景。今天回归时这个请求用了A用户的数据明天再用B用户的数据整个结果就没有可比性出了bug也不好定位是代码问题还是操作过程变了样。而Collection集合批量运行解决的就是这三件事。你可以把一组相关接口整理成一个Collection按业务链路的顺序排好配置好环境、变量、脚本和数据然后一键让Postman按顺序把所有请求跑一遍自动收集结果、执行断言、输出报告。整个过程不需要你一直在旁边守着。这也是这个功能在我眼里最核心的价值它把手工逐个测变成了自动化批量回归而且是依托于Postman本身就能做到的不需要额外引入一套复杂的测试框架。1.2 批量运行不是把接口堆一起跑而是一次完整的回归很多人第一次接触Collection批量运行时会有一个误解觉得它就是把一堆请求放进一个文件夹里然后一次性发送。这个理解对了一半。Collection批量运行确实是把多个请求串起来跑但真正有价值的地方在于串字而不是跑字。一组接口之间往往存在依赖关系。比如你测电商系统先要登录拿token然后用token查商品列表再把商品加购物车最后下单结算。这四个接口如果拆开单独跑每个都能跑通但组合在一起才能真正验证一条完整的业务链路。Collection批量运行正好覆盖这个场景你按调用顺序把请求排好通过脚本把上一个请求返回的token存成变量下一个请求自动引用这样整条链路就可以无缝地串起来重复执行。另一个场景是数据驱动。同一个下单接口需要测正常价格、折扣价、零元订单、库存不足、未登录等一组case每个case的请求体不同但结构相同。如果手工去改一遍费时费力还容易改错。借助Collection的批量运行能力配合CSV或JSON数据文件Postman可以自动把每一组参数带进去跑一遍自动验证每一组的响应是否符合预期。这才是批量运行真正值钱的地方——它不只是省掉了点鼠标的时间还帮你把回归测试参数组合验证接口链路验证这些原本需要额外写脚本的事情都在Postman里完成了。一句话总结我的建议不要只把Collection当成分类文件夹要把Collection当成一套可重复执行的测试资产来设计。这个思维转变是今天这篇文章最想传递的东西。2. 好的Collection不是文件夹变量、脚本和依赖这样设计2.1 三种层次的变量搞清楚优先级比背文档管用批量运行之前首先要做的一步是把Collection里的变量体系捋清楚。Postman的变量有全局变量、环境变量、集合变量和数据变量等好几层新手经常在这里翻车。变量用对了批量运行就是一条流水线变量没配对你会在响应日志里看到一堆{{xxx}}原样输出。先说我的推荐用法。环境变量用来放不同环境之间的差异配置比如测试环境的Base URL是http://192.168.1.10:8080生产环境是https://api.example.com这种一变就变的东西应该放进环境变量里。集合变量用来放这个Collection内部共享的固定值比如公共请求头里的Content-Type、默认的channelId。全局变量我建议尽量少用因为全局变量不区分环境很容易污染。比如你在联调环境给全局变量设置了token切到测试环境后老token还是会优先被引用到导致鉴权莫名其妙失败。关于优先级Postman从低到高大致是这个顺序全局变量 集合变量 环境变量 数据文件 局部变量。什么意思如果同一个名字token在环境变量和数据文件里都存在批量运行时数据文件里的值会把环境变量盖掉。很多人不知道这一点结果明明在环境里配置了正确的token一跑批量却用的是数据文件里的旧值排查半天才反应过来。建议你理解成越贴近当前请求的变量优先级越高。数据文件属于本次运行的数据所以它会压过环境预设值。2.2 集合级脚本批量运行中统一动作的正确位置Collection除了装请求还能挂脚本。选中Collection右侧可以看到Pre-request Script和Tests两个页签分别对应请求前脚本和响应后断言。很多人只是把它们当成单独的每个请求里的辅助工具但在批量运行场景下集合级的脚本才是真正的利器。集合级Pre-request Script会在集合里每一个请求发送之前执行。比如你可以在这里统一生成当前时间戳写入变量reqTime所有请求的Body里都能引用{{reqTime}}或者统一给需要签名的请求计算MD5签名这样签名逻辑只维护一份而不是复制到每一个请求里去。集合级Tests同理每当一个请求返回后都会先执行集合级Tests再来执行请求自己的Tests。你可以把公共断言写在这里比如所有响应都必须200所有响应时间不能超过3秒这样每个请求就自动拥有了统一的底线检查。我自己的习惯是公共逻辑全放到集合级个性断言才放到单请求里。举个例子集合级Tests里写pm.test(接口响应时间不超过3000ms, function () { pm.expect(pm.response.responseTime).to.be.below(3000); }); pm.test(接口状态码为200或201, function () { pm.expect(pm.response.code).to.be.oneOf([200, 201]); });这样批量跑下来任何一个请求如果响应时间超标或者状态码异常结果面板里立刻就会看到失败标记。如果你把这些公共检查复制到每个请求里不仅维护成本高还很容易漏。集合级脚本这个设计越用越会觉得它贴心。2.3 令牌串联从登录接口到业务接口的依赖处理批量运行最常见的依赖场景就是登录态。业务接口需要带token而token只有登录接口登录成功后才返回。你怎么在批量运行中让后面的请求自动带上新登录得到的token正确做法是这样。集合里的第一个请求放登录接口在它自己的Tests脚本里写入提取token并保存的逻辑。比如登录接口返回的JSON结构是{code: 0, data: {token: xxxx}}脚本可以这样写const res pm.response.json(); if (res.code 0) { pm.environment.set(accessToken, res.data.token); } else { throw new Error(登录失败无法获取token); }后续所有需要鉴权的请求在Authorization或Header里填Bearer {{accessToken}}。批量运行时第一个请求先把token存好第二个请求发出时变量已经被填充自然就能引用到最新值。这里有一个很多人踩过的坑手动单跑登录接口时token确实被设置了但批量跑的时候后面的业务接口还是401。原因多半是环境没选对或者你用了集合变量保存token而请求里同时又存在同名环境变量并且环境变量优先级更高。变量引用优先级的问题前面提到过实际排查时我建议你先在批量运行前打开环境变量的当前值看一眼再运行一次确认第一个请求的Tests有没有真正把值写进去这样排查链路会很清晰。顺带提一个和登录态相关的细节批量运行时Postman的Cookie是共享的。如果你的接口走Cookie鉴权登录接口Set-Cookie之后后续请求会自动带上Cookie不需要你手动处理。但如果上一次运行遗留了过期Cookie新登录接口反而可能让Cookie信息变乱所以批量回归前也别忘了在设置里清一下Cookie。3. Runner参数面板迭代、顺序、延迟你真的调对了吗3.1 迭代次数和请求执行顺序的默认逻辑Collection准备好之后点Collection右侧的Run按钮就会进入Runner面板。这个面板看起来就是个普通弹窗但其实里面每一项参数的组合效果直接决定你这次批量跑得稳不稳。先讲迭代次数。Runner面板里的Iterations表示整套Collection要顺序执行几遍——注意是整套不是单个请求。比如你的Collection里有15个请求Iterations设成3那Postman会先把15个请求按顺序跑一遍再跑第二遍再跑第三遍总共执行45次。这个逻辑听起来简单但很多人第一次会理解错以为迭代次数少指每个请求跑3次。其实从结果面板上看会更直观总结果数是请求数乘以迭代数。再讲执行顺序。默认情况下Runner按Collection当前的展示顺序执行也就是你在列表里看到的那个先后次序。如果你把集合里的请求当成一条业务链路来编排那这个顺序就是你想要的调用顺序。但有个坑默认顺序是严格按照Collection树结构来的如果里面有Folder会先执行Folder里的请求还是先执行平级请求我的经验是建议你提前在Collection里把顺序调整到位不要依赖Runner自动排序。实测中Postman会按Collection树从上到下、文件夹内从左到右的方式执行这个顺序在Runner面板里是可以看到并通过拖拽调整的。稳妥起见每次新建Collection我都建议按业务链路顺序放置请求文件夹名用模块名加序号前缀比如01-登录认证、02-商品查询、03-订单流程这样一眼就能看懂执行顺序也不容易出错。3.2 数据文件、延迟和保存响应这几个选项怎么配合Runner面板下半部分有几个选项框很多人忽略但它们在特定场景下极其好用。第一个是Data File也就是数据文件选择框后面专门讲数据驱动时会展开。这里只提醒一句一旦你选择了CSV或JSON数据文件迭代次数会受数据行数限制建议迭代次数直接等于数据行数别人为拉开差距。第二个是Delay请求间延迟单位毫秒。它会在每两个请求之间插入一个等待时间而不是在每轮迭代之间等待。批量跑几十个请求的时候如果接口服务端有频率限制或者请求之间涉及异步操作、数据库落库延迟设得太短后面请求很容易失败。我实测过一个下单流程订单创建接口返回成功后紧接着去查订单详情如果中间不加延迟偶尔能查到但经常查不到因为订单数据是异步写入的。这时候在Runner里把Delay设为500到1000毫秒命中率立刻稳定。注意这个Delay是所有请求之间都生效不是只对特定请求生效所以设置之前要估一下整体时长。第三个是Save responses。勾选后Runner会在结果面板里保存每个请求的完整请求头和响应体。跑完过后你可以随时点一条请求回看当时的实际响应内容这对排查定位问题很关键。代价是运行内存和耗时都会上升如果接口数量特别大结果数据会很占空间。我自己的习惯是本地调参的时候勾选真正放到自动化流程里跑的时候不勾提高整体效率。还有一个很实用的选项叫Keep variable values。勾选它批量运行结束后脚本里写入的变量值会保留不勾则运行结束后变量会回滚到运行前的值。举个例子如果你在Tests脚本里用pm.environment.set(accessToken, ...)更新了token勾选后会保留新token不勾则还是旧token。这个选项对运行是否污染环境影响很大我在下面的踩坑章节里专门说。3.3 别把运行器跑挂限流与超时控制的实战调参批量运行除了功能上要配置对还要考虑到实际运行环境。接口数量一多或者迭代次数一大请求就会像潮水一样打向服务端。很多测试环境扛不住这种瞬时压力会出现连接超时、服务假死甚至给后端留下大量脏数据。针对这种情况我的建议是分梯度来。第一次批量跑Delay设大一点比如1000到2000毫秒观察整体响应情况确认服务端稳定后再逐步缩小。不要一上来就设置Delay0跑全量看起来爽快出了问题定位成本极高。除此之外可以在集合级Tests里加一个超时断言比如pm.expect(pm.response.responseTime).to.be.below(3000)一旦响应超时立刻标记失败这样你能在结果面板上快速筛选出不是业务错而是性能错的请求。这种区分定位会节省大量时间。关于超时配置单个请求的Settings里有一处叫Request Timeout默认没有上限但批量跑的时候如果某个接口卡死整个Runner就可能一直停在那里不动。我做自动化冒烟测试时会习惯手动把它设成5000毫秒超过就当失败处理。虽然Postman没有提供Runner级别的全局超时但通过集合级断言单请求超时的组合已经能覆盖绝大多数场景。另一个和资源相关的经验是批量运行完结果面板如果保存了大量响应体Postman会明显变卡。Runner面板里尽量在跑完后立即导出需要的报告和结果然后清掉本次运行结果桌面版的多轮大结果沉淀会拖慢整个应用特别影响后面继续调试的心情。4. 数据驱动让一套请求变成上百条用例4.1 CSV数据文件怎么写字段和变量怎么对应数据驱动是Collection批量运行里最值得花时间掌握的能力。它的思路很简单请求模板保持不动把变化的参数外置到一个数据文件里Postman每轮迭代从数据文件里取一行数据填充进请求这样一套请求就能被多条数据复用。数据文件最常用的是CSV。格式有严格讲究第一行必须是列名也就是变量名后面每一行是一组测试数据。比如我要测试一个根据用户ID查信息的接口CSV可以这样组织userId,expectName 1001,张三 1002,李四 1003,王五在请求的URL或者Params里把写死的值替换成{{userId}}这样批量运行时第一轮迭代取第一行userId变成1001第二轮取第二行变成1002。如果你的接口的GET参数是/api/user?userIdxxx那就直接在Params里的value处填{{userId}}。POST接口同理Body里用{{userId}}占位。这就是数据驱动最朴素的用法。JSON数据文件也可以结构是数组套对象比如[ {userId: 1001, expectName: 张三}, {userId: 1002, expectName: 李四} ]两种格式我都有用过。CSV更轻量Excel另存为就能生成适合团队里不太懂技术的同事维护用例JSON可以嵌套复杂结构适合body层级比较深的情况。如果你只需要传单个字段CSV就够用了。这里要提醒的一个细节是编码。CSV文件如果包含中文另存的时候一定选UTF-8编码不要用ANSI。否则在Windows上导入后请求体里的中文参数会变成乱码排查起来非常隐蔽。还有CSV列名不要带空格和特殊符号user-id这种命名在引用时容易出幺蛾子建议统一用驼峰命名或下划线。4.2 迭代次数与数据行数的匹配关系及边界情况选了数据文件之后迭代次数和数据行数的关系值得单独说清楚。Postman默认的逻辑是迭代次数最大不能超过数据文件的行数。比如CSV有5行数据Runner面板里Iterations最多设5设6也只会跑5轮超过的部分不会反复循环使用数据。这一点和很多人的直觉不一样。所以最佳实践是Iterations直接设成数据行数或者干脆保留默认值让Postman自动读取重点是把数据文件选对。还有一种情况需要特别注意某些列在CSV里是空值。空值会导致变量被设置成空字符串请求体里就会出现这种内容。比如有手机号字段某一行没填请求发出去后服务端可能返回参数缺失之类的错误而你还以为数据没问题。我的习惯是在让测试同事准备数据文件之前先给一份模板文件并要求必填字段不得留空。如果确实需要测空值场景那就明确写出来比如MMS值写一个空格字符也算一种显式测试意图。与之相关的深度用法是数据文件的字段可以和断言配合起来。断言里读当前行的期望值方式是通过data对象。在前面那个查用户名的例子里Tests脚本可以这样写const res pm.response.json(); pm.test(用户名与数据文件中期望值一致, function () { pm.expect(res.data.name).to.eql(data.expectName); });data是Postman在数据驱动模式里自动注入的全局对象表示当前迭代正在使用的数据行。这个写法非常推荐因为它让每条数据不仅被执行还被验证了它对不对的结果。如果某行数据让接口返回了错误的用户名断言会立刻把它揪出来而不是看着一大片200状态码就以为一切都好。4.3 断言里读数据让每个用例都验证到自己的数据批量运行最大的错觉就是都返回200了应该没问题。实际上接口返回200只代表请求成功不代表业务逻辑正确。尤其是数据驱动模式下每条数据的期望值往往不同更需要针对每一行数据做独立断言。继续以用户查询接口为例响应结构是{code: 0, data: {id: 1001, name: 张三}}。如果只看状态码1001、1002、1003全部返回200你会以为测试全过了。但如果接口有bug把1002的name返回成了张三状态码还是200肉眼根本发现不了。断言的存在就是为了捕获这种业务逻辑错误。除了对字段值做比对你也可以对返回结构做检查。比如pm.test(查询结果包含关键字段, function () { pm.expect(res).to.have.property(data); pm.expect(res.data).to.have.all.keys([id, name, mobile]); });这种断言对一个批量回归项目来说特别重要因为接口结构一旦变化它能立刻报出来你不用等到前端联调时才发现字段对不上。在数据驱动模式下写断言有一个经验尽量把断言写成根据当前数据断言当前结果而不是断言一个固定值。也就是说期望值从data.expectXXX里取而不是从代码里写死的常量里取。这样数据文件里的每一行就等价于一个独立的测试case你扩充测试用例时只需要往CSV里加行不需要修改任何脚本。这也是我把数据驱动称为用一套请求变成上百条用例的原因。5. 跑完不是结束结果面板、失败排查与报告导出5.1 Runner结果表怎么看状态、断言、响应时间Runner运行结束后结果面板会展示一个汇总表格。有人只看一眼整体通过率就关掉了其实这个面板的信息量远不止通过率。结果表里每一行代表一次请求执行列名大致包括请求方法、名称、URL、状态、响应时间、断言失败数量等。状态列会用绿色和红色区分通过失败直观但容易让人产生惰性。我的建议是优先关注两列断言失败数和响应时间。断言失败数说明的是业务逻辑是否通过响应时间则暴露了性能隐患。如果一个请求响应时间为3186ms虽然断言全过了但在批量回归的语境里它也是值得关注的信号说明这个接口有变慢的趋势。结果面板还支持按状态筛选比如只看失败项或者只看某个Folder里的请求。接口数量大的时候先筛失败项再逐条点开比从头翻到尾效率高得多。筛完之后点开任意一行右侧会展示详细的请求和响应内容包括请求头、请求体、响应状态、响应体和测试结果。这一步是排查问题的入口。5.2 失败用例的排查链路Console日志和请求对比批量跑完有失败用例怎么办我的固定排查链路是三步走。第一步先看结果面板里这条请求的断言失败详情。点击失败项测试结果标签页里会直接显示哪一条断言挂了比如expected response to have status code 200 but got 500这个信息能帮你判断是断言写错了还是接口真的有问题。第二步打开Postman底部的Console控制台重新跑一次可以只跑这一个Collection或Folder在Console里能看到更底层的信息——实际发出的请求URL、Headers、Body以及收到的响应原始内容。很多批量运行时的问题比如变量没解析、请求体格式错乱、Cookie没带上在这个原始请求日志里会原形毕露。第三步对照一下这个请求单独手动运行的样子。在Collection里找到这条失败请求环境变量保持不变手动点一次Send对比响应是否一致。如果手动能过、批量里挂掉那问题大概率出在依赖上——比如前置请求没有成功设置变量或者上一轮的脏数据影响了这一轮。如果手动也挂那问题就在接口本身与批量运行无关。这套链路不复杂但很有效。我见过不少人批量跑失败后第一反应是改断言、加Delay其实问题根本不在那儿。先看原始日志再对比手工执行永远比瞎猜省时间。5.3 导出报告从本地结果到团队共享Runner的结果面板默认只存在你本地关掉窗口后想看就得重新跑一遍。如果要把批量运行的结果拿给开发、项目经理看或者作为测试记录存档导出报告就是必要的环节。导出方式很简单结果面板右上角有Export按钮。你可以选择导出为JSON格式这是机器可读的结构化数据适合做二次统计也可以选HTML格式浏览器打开后是一份带表格的报告。我一般两种都导出JSON留着存档HTML发给需要看的人。不过这里也要说句公道话Postman自带的HTML报告相对朴素就是请求列表、状态码、时间、断言结果没有图表和趋势分析。如果你所在的团队对测试报告有更高要求建议用Newman配合htmlextra这类报告插件。Newman的HTML报告会更美观带通过率图表断言的统计也更清晰。别误会这不是说Postman内置导出不好而是不同场景要选不同工具。本地快查快用自带导出足够交付给团队看Newman的增强报告更专业。6. 让批量运行跑得更远Newman命令行和自动化集成6.1 Newman脱离开图形界面批量运行Collection如果你只在自己的电脑上用Postman前面的内容已经够用了。但当你需要把Collection批量运行纳入团队的持续集成流程或者让它在服务器上定时跑起来就需要接触Newman。Newman是Postman官方的命令行工具作用是脱离图形界面运行Collection。它和Runner执行的是同一套Collection文件同一个断言脚本只是没有GUI运行完后把结果输出到终端或保存成文件。这也意味着你精心设计好的Collection换一个运行载体就可以变成自动化测试工具链里的一员。安装Newman的前提是你有Node.js环境然后执行npm install -g newman安装完成后先导出Collection文件。在Postman里选中你的Collection点右侧...菜单选择Export选Collection v2.1格式得到一个JSON文件。同时如果用了环境变量也把环境文件导出来。命令行的基本调用是这个样子newman run my-collection.json -e my-env.json如果你需要并发、失败重试、数据文件、报告输出等能力Newman都提供了对应的参数。它本质上就是把Runner面板的选项翻译成了命令行参数理解这一点从GUI迁移到命令行的过渡成本就很低了。6.2 环境文件和数据文件的命令行组合实际项目里Newman运行Command经常比上面那行要长得多。这里给一份我常用的成型命令模板你可以直接套用。假设你的项目结构大致是/workspace ├── collection.json ├── env-test.json └── testdata.csv需要按数据行跑、每轮迭代之间有延迟、超过5000ms算超时并导出HTML和JSON报告命令可以写成newman run collection.json \ -e env-test.json \ -d testdata.csv \ --delay-request 500 \ --timeout-request 5000 \ --reporters cli,html,json \ --reporter-html-export report.html \ --reporter-json-export report.json这里有三个参数值得单独解释。--delay-request 500就是Runner面板里的Delay单位毫秒。--timeout-request 5000是每个请求的超时上限。-d指定数据文件和Runner面板选数据文件是同一件事。命令行方式最大的好处是可配置、可重复同一份命令可以在不同机器上复现完全一样的测试过程这是手动点按钮做不到的。另外一个实用参数是-n指定迭代次数替代面板里的Iterations。如果和数据文件一起用同样注意迭代次数不要超过数据行数。6.3 从手动跑到定时跑的落地思路有了Newman之后批量运行就从一个偶尔手动点的功能变成了可以自动执行的任务。最常见的落地思路是把Newman命令封装到一个Shell脚本里然后用服务器的定时任务去调用它。比如每天凌晨跑一遍冒烟测试把报告发到指定目录或者每次代码发布后在发布流程里增加一步自动执行接口回归。这些都属于很成熟的工程实践Postman官方也提供了Newman和CI系统的集成文档。但如果你所在的公司没有搭建CI/CD这套东西也建议先从本机定时任务开始。比如Windows的任务计划程序、macOS的launchd都可以定时执行Newman命令让批量回归每天自动跑一次。第二天早上到工位打开报告看一眼有没有回归失败比手动点一早上Send要轻松得多。需要提醒的是自动化运行和手动运行有一个心态上的区别。手动跑挂了我们可以现场查自动跑挂了你必须依赖报告本身去定位问题。所以运行环境、报告生成、日志保留这些环节要提前规划好。Newman生成的报告文件记得按日期归档比如命令里就带report-$(date %Y%m%d).html这种命名方式这样出了问题能快速找到对应日期的历史报告。最后再多说一句网络上有不少跳过登录破解汉化包之类的流传版本我劝你不要碰。Postman现在启动需要登录这是官方策略正常注册一个免费账号登录后本地数据照样能用没必要为了省登录那一步去承担未知的安全风险。至于汉化新版在设置里已经支持切换多种显示语言直接在官方版里调语言设置就好更省心也更安全。我做接口测试这几年用过不少自动化工具回头来看Postman Collection是最简单、也最容易被低估的起点。不需要学复杂的语法不需要搭庞大的框架只要把Collection里的变量、脚本、数据文件这些基本功打磨好再用Runner或Newman把它们串起来它就能覆盖一个中小型项目绝大部分的接口回归需求。它的上限超乎很多人的预期而它给你的成长路径也足够平滑。
返回列表