【问题标题】:Using supertest and async.parallel to send parallel http requests?使用 supertest 和 async.parallel 发送并行 http 请求?
【发布时间】:2015-08-04 18:32:22
【问题描述】:

我在探索性测试期间发现了一个有趣的错误,当并行/并发请求发送到应用程序时会发生这种错误。我正在尝试使用 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();
	    });
	})

据我所知,它要么没有声明预期的代码,要么根本没有运行任务。

【问题讨论】:

  • 您似乎没有处理 async.parallel 回调中的错误。无论是否发生错误,您都只是在调用完成。

标签: node.js asynchronous supertest


【解决方案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);
})

【讨论】:

  • 这是很好的信息。我发现我需要进行一项额外的修改,因为测试通过时没有调用 done。在处理完所有请求后,我添加了一个计数器来调用完成。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2014-12-24
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多