如何用Postman-Newman实现请求并行及关联带数据文件的集合运行?
解决方案:用Newman + Node.js脚本实现并行ID获取与集合处理
核心思路
放弃Postman内置的postman.setNextRequest(串行执行且不支持动态加载外部数据文件+参数的组合场景),改用Node.js调用Newman核心库的方式,实现“获取ID后立即启动目标集合并行运行”的需求,同时可灵活控制并发量。
步骤1:准备两个Postman集合
ID获取集合(命名为
get-id-collection.json):- 仅包含1个请求,用于获取目标ID。
- 在请求的
Tests标签中,将返回的ID存入环境变量(方便脚本捕获):pm.environment.set("fetched_id", pm.response.json().id); - 导出该集合为JSON文件。
目标处理集合(命名为
process-id-collection.json):- 集合中的请求使用
{{target_id}}作为动态ID参数(比如接口路径、请求体中)。 - 确保集合支持加载外部数据文件(比如
data-100-records.json),在Postman中验证通过后,导出为JSON文件。
- 集合中的请求使用
步骤2:编写Node.js控制脚本
借助Newman的Node.js API,结合p-limit库控制并发量(避免一次性发起2000次请求导致服务器限流),实现“获取ID即启动处理任务”的并行逻辑:
先安装依赖:
npm install newman p-limit编写脚本(命名为
parallel-run.js):const newman = require('newman'); const pLimit = require('p-limit'); // 控制并发数,根据服务器承受能力调整,比如设为10 const limit = pLimit(10); // 配置参数 const ID_COLLECTION_PATH = './get-id-collection.json'; const PROCESS_COLLECTION_PATH = './process-id-collection.json'; const DATA_FILE_PATH = './data-100-records.json'; const TOTAL_ITERATIONS = 2000; // 函数:获取单个ID async function fetchId() { return new Promise((resolve, reject) => { newman.run({ collection: ID_COLLECTION_PATH, reporters: 'cli', reporter: { cli: { verbose: false } } // 减少日志输出 }, (err, summary) => { if (err) reject(err); // 从环境变量中提取ID const fetchedId = summary.environment.values.members.find(item => item.key === 'fetched_id').value; resolve(fetchedId); }); }); } // 函数:用ID运行目标集合 async function processId(id) { return new Promise((resolve, reject) => { newman.run({ collection: PROCESS_COLLECTION_PATH, data: DATA_FILE_PATH, // 加载100条记录的数据文件 envVar: [{ key: 'target_id', value: id }], // 传递ID到集合 reporters: 'cli', reporter: { cli: { verbose: false } } }, (err, summary) => { if (err) reject(err); console.log(`ID ${id} 处理完成`); resolve(summary); }); }); } // 启动并行任务 async function start() { const tasks = []; for (let i = 0; i < TOTAL_ITERATIONS; i++) { tasks.push(limit(async () => { const id = await fetchId(); // 获取ID后立即启动处理任务,无需等待其他任务 await processId(id); })); } await Promise.all(tasks); console.log('所有任务完成'); } start().catch(err => console.error('全局错误:', err));
步骤3:运行脚本
在终端执行:
node parallel-run.js
关键说明
- 并发控制:通过
p-limit限制同时运行的任务数,避免触发服务器限流策略,可根据实际情况调整数值。 - 数据文件加载:目标集合运行时通过
data参数指定外部数据文件,Newman会自动遍历100条记录完成集合运行。 - 参数传递:通过
envVar将获取到的ID传入目标集合,集合中用{{target_id}}引用即可。
内容的提问来源于stack exchange,提问作者Divyang Patel
相关产品推荐
相关产品推荐

