如何在Postman中减慢JavaScript发送的HTTP请求速度
问题
我在Postman集合中执行一项复杂测试,需要从一个endpoint获取100000次数据,之后再进行其他测试。该API部署在云端,响应速度极快,但问题出在Postman上:当测试次数约为200次时代码运行正常,但执行100000次测试时Postman会崩溃。我确定问题在于所有HTTP请求都是异步发送的,应用无法处理过多请求。我尝试用setTimeout实现请求延迟,但完全没有效果,请求仍被批量发送。由于是在Postman中,我无法导入外部库。以下是我的代码:
let counter = 0; const counterCompleted = 100000; // My loop for 100000 elements pm.test(`my test should reply OK`, (done) => { setTimeout(() => { const payload = { // data }; pm.sendRequest({ url: pm.request.url, method: 'POST', header: { 'Content-Type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify(payload), }, }, (err, response) => { pm.expect(err).to.be.null; pm.expect(response).to.have.status(200); const data = response.json()[0]; // storing my data counter++; if (counter === counterCompleted) { // When all requests are completed, do more tests } done(); } ); }); }, 1000); });
请问我该如何减慢请求发送速度?
解决方案
当前代码的问题是所有setTimeout被几乎同时触发,并没有实现真正的间隔发送。要解决这个问题,需要改成串行请求+固定间隔延迟的模式,即完成一次请求并处理后,再延迟一段时间发送下一次,避免一次性堆积大量异步任务。
推荐实现方式(递归串行请求)
用递归函数控制请求流程,每次请求完成后判断是否继续,是的话延迟后调用自身:
const totalRequests = 100000; let completedRequests = 0; const delayMs = 100; // 可根据Postman负载调整间隔时间 // 递归发送请求的核心函数 function sendNextRequest() { if (completedRequests >= totalRequests) { // 所有请求完成后执行后续测试逻辑 console.log('全部请求完成,启动后续测试'); // 在这里添加你的后续测试代码 return; } const payload = { // 你的请求数据 }; pm.sendRequest({ url: pm.request.url, method: 'POST', header: { 'Content-Type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify(payload), } }, (err, response) => { // 断言逻辑 pm.expect(err).to.be.null; pm.expect(response).to.have.status(200); const data = response.json()[0]; // 存储数据的逻辑 completedRequests++; // 延迟后发送下一个请求 setTimeout(sendNextRequest, delayMs); }); } // 启动第一个请求 sendNextRequest();
关键改进点
- 避免批量触发延迟任务,确保前一个请求完全处理完成后,才会启动下一个请求的延迟计时,从根本上减少Postman的异步任务堆积。
- 通过
delayMs参数灵活控制请求间隔,平衡测试效率和Postman的运行稳定性。 - 去掉了不必要的
pm.test包裹,因为批量请求不属于单个测试断言场景;如果需要保留测试结构,可参考下方的变体。
保留pm.test的变体
如果必须在pm.test中执行,可调整为以下结构:
const totalRequests = 100000; let completedRequests = 0; const delayMs = 100; pm.test('批量执行10万次请求', (done) => { function sendNext() { if (completedRequests >= totalRequests) { done(); // 通知Postman测试完成 return; } const payload = { // 你的请求数据 }; pm.sendRequest({ url: pm.request.url, method: 'POST', header: {'Content-Type': 'application/json'}, body: {mode: 'raw', raw: JSON.stringify(payload)} }, (err, res) => { pm.expect(err).to.be.null; pm.expect(res).to.have.status(200); // 存储数据逻辑 completedRequests++; setTimeout(sendNext, delayMs); }); } sendNext(); });
内容的提问来源于stack exchange,提问作者asdasf
相关产品推荐
相关产品推荐

