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

时间:2015-08-04 18:32:23

标签: node.js asynchronous supertest

我发现在将并行/并发请求发送到应用程序时进行的探索性测试中存在一个有趣的错误。我试图使用supertest复制具有测试自动化的场景,但我使用异步库做错了。谁能让我知道我错过了什么?

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();
	    });
	})

它要么没有声明预期的代码,要么根本无法运行任务。

2 个答案:

答案 0 :(得分:1)

您似乎无法处理async.parallel回调中的错误。无论是否发生错误,您都只是在调用。下面的代码应该将asyncTask错误传递给并行done回调方法。

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);
})

答案 1 :(得分:1)

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);
	})