如何链式执行Newman测试用例集并在多次运行间传递数据
实现Newman链式执行并传递数据的解决方案
问题根源
- 异步结果判断位置错误:你把
out是否存在的判断写在了newman.run()的同级同步代码中,此时done事件尚未触发,out还未被赋值,会直接走reject逻辑 - 第二次执行逻辑为同步执行:
if(output)的判断会在run1.then回调执行前就运行,此时output还未被赋值,永远走else分支
正确实现思路
- 正确封装Newman运行为Promise:将resolve/reject逻辑全部放在
done事件回调内部,确保只有Newman运行完成后才会变更Promise状态 - 用异步链式逻辑串联两次运行:可以用
Promise.then链式调用,或者更易读的async/await语法,确保第一次运行完成拿到传递数据后,再启动第二次运行
完整实现代码
const newman = require('newman'); // 封装第一次Newman运行,完成后返回需要传递的变量 function runFirstCollection() { return new Promise((resolve, reject) => { newman.run({ // 替换为你的第一个集合配置,比如collection路径、环境变量、全局变量等 collection: '第一个集合本地路径/远程URL', globals: { /* 你的全局变量配置 */ } }) .on('done', (err, summary) => { if (err) { return reject(err); } // 提取需要传递给第二次运行的全局变量值 const transferValue = summary.globals.values.members.find(item => /* 替换为你的字段查找逻辑 */).value; resolve(transferValue); }); }); } // 封装第二次Newman运行,接收第一次传递的值作为入参 function runSecondCollection(transferValue) { return new Promise((resolve, reject) => { const testData = require('你的测试数据JSON文件路径'); // 将第一次拿到的值写入测试数据,也可以直接写入第二次运行的全局变量/环境变量配置 testData.transferData = transferValue; newman.run({ // 替换为你的第二个集合配置 collection: '第二个集合本地路径/远程URL', iterationData: testData }) .on('done', (err, summary) => { if (err) { return reject(err); } resolve(); }); }); } // 串行执行两次测试 async function runAllTests() { try { const output = await runFirstCollection(); console.log('第一次测试运行完成,拿到传递值:', output); await runSecondCollection(output); console.log('第二次测试运行完成'); } catch (error) { console.log('测试运行失败:\n', error); } } runAllTests();
注意事项
- 如果需要传递多个值,可以返回对象承载所有需要传递的字段
- 第二次运行如果不需要修改迭代数据,也可以直接把传递值写入
globals或environment参数,不需要额外处理测试数据文件
内容的提问来源于stack exchange,提问作者PixelPlex
相关产品推荐
相关产品推荐

