使用supertest和async.parallel发送并行http请求?

在并行/并发请求发送到应用程序时,我发现了一个有趣的问题,这个问题在探索性testing中发生。 我试图用supertest复制testing自动化的情况下,但我做错了使用asynchronous库。 任何人都可以让我知道我失踪了吗?

it('will handle concurrent GET requests', function(done){ var asyncTasks = []; for (i = 0; i < 30; i++){ asyncTasks.push(function(done){ agent.get('url') .set('headerHere', 'someVal') .send('') .expect(200, done); }) }; async.parallel(asyncTasks, function(){ done(); }); }) 

它或者不是断言预期的代码,或者根本不能说明任务。

看来你不处理async.parallelcallback中的错误。 无论是否发生错误,您都只需调用即可。 下面的代码应该将asyncTask错误传递给并行donecallback方法。

 it('will handle concurrent GET requests', function(done){ var asyncTasks = []; for (i = 0; i < 30; i++){ asyncTasks.push(function(done){ agent.get('api/vault?partition=test') .set('headerHere', 'someVal') .send('') .expect(200, done); }) }; async.parallel(asyncTasks, done); }) 

顺便说一句,看看async.times方法。 它可以使你的代码更短,更容易阅读。

 it('will handle concurrent GET requests', function(done){ var asyncTask = function(done){ agent.get('api/vault?partition=test') .set('headerHere', 'someVal') .send('') .expect(200, done); }); }; async.times(30, asyncTask, done); }) 

ezrepotein4让我走上正轨。 这是我一起去的完整答案。

 it('will handle concurrent GET requests', function(done){ var parallelRuns = 100; var actualRuns = 0; var asyncTask = function(err, result){ agent.get('url') .set('someHeader', 'someValue') .send('') .expect(200) .end(function(err, res){ actualRuns++; if (err) { return done(err); } if (actualRuns == parallelRuns){ done(); } }); } async.times(parallelRuns, asyncTask, done); })