NodeJS中使用Newman运行多集合时无法更新环境变量文件
问题原因
你当前的代码是并行执行两个Newman集合,每个集合都直接读取原始环境文件,彼此完全独立运行。第一个集合修改的变量(无论环境还是全局)仅存在于自身运行上下文,既不会自动写入环境文件,也不会传递给第二个集合,所以第二个集合只能读到初始值。
解决方法
要实现变量共享,需串行执行集合,并且将前一个集合运行后更新的变量传递给下一个集合,而非每次都读取原始文件。具体步骤如下:
1. 改用串行执行逻辑
forEach是并行执行,必须改成串行,确保第一个集合跑完再启动第二个,这样才能拿到更新后的变量。
2. 传递更新后的环境变量
不再每次传入原始环境文件路径,而是在第一个集合运行完成后,获取更新后的环境变量对象,作为第二个集合的environment参数传入。
修改后的代码
const newman = require('newman'); const fs = require('fs'); // 读取原始环境文件并转为对象 const environmentFile = './FeatureTesting_Variables.postman_environment.json'; let currentEnv = JSON.parse(fs.readFileSync(environmentFile, 'utf8')); const collections = [ './IndividualCollection/SignIn.postman_collection.json', './IndividualCollection/WorkSpace.postman_collection.json', ]; // 串行执行集合的异步函数 async function runCollectionsSequentially() { for (const collectionPath of collections) { await new Promise((resolve, reject) => { newman.run({ collection: collectionPath, environment: currentEnv, // 传入当前最新的环境变量对象 reporters: ['cli', 'htmlextra', 'json'], color: 'auto', }, (err, summary) => { if (err) { reject(err); return; } // 更新currentEnv为当前集合运行后的环境变量 currentEnv = summary.environment.values.members.reduce((env, item) => { const existingVar = env.values.members.find(v => v.key === item.key); if (existingVar) { existingVar.value = item.value; } return env; }, JSON.parse(JSON.stringify(currentEnv))); // 深拷贝避免污染原对象 resolve(); }); }); } // 可选:将最终更新的变量写回环境文件 fs.writeFileSync(environmentFile, JSON.stringify(currentEnv, null, 2)); } // 启动执行 runCollectionsSequentially().catch(err => { console.error('集合运行失败:', err); process.exit(1); });
3. 关键说明
- 串行执行:用
for...of配合async/await,保证上一个集合执行完成后再启动下一个。 - 变量传递:每次运行都传入当前最新的环境变量对象,确保第二个集合能获取第一个集合修改后的
clientHandshakeToken。 - 深拷贝处理:避免直接修改原环境对象,防止上下文数据污染。
- 可选写回文件:如果需要将最终更新的变量持久化到环境文件,保留
fs.writeFileSync步骤即可。
额外提示
如果使用全局变量共享,逻辑类似:在第一个集合跑完后,从summary.globals提取更新后的变量,传递给下一个集合的globals参数即可。
内容的提问来源于stack exchange,提问作者Shahroz Ahmad
相关产品推荐
相关产品推荐

