如何在k6中实现指定API调用顺序及并行请求即时响应
在k6中实现API请求并行发起的方法
我没办法让API调用按预期的并行方式执行,想复现某个请求场景,但在k6里还原不了正确的请求顺序。试过结合Promise.all和同步调用,但效果不好。
当前用的是简单的顺序调用代码:
group('Map', function () { group('Open Map with Given Build and Level', function () { app.getUserType(authToken, 23); app.projectFieldsPage.getKPIsIDByName(authToken, 23); app.getUser(authToken); app.getProjectInfo(authToken,23) app.dashboardPage.getProjectShort(authToken, 23); app.projectFieldsPage.getSelectControlKPIs(authToken, 23); app.getBuildsInfoShort(authToken, 23, 142); app.globalSettingsPage.getProjectSettings(authToken, 23); app.getLevelsInfoShort(authToken, 23, 142, 471); app.layoutsPage.getLayoutsWithPermissions(authToken, 23); }); sleep(1); });
需求:希望a、b、c类请求同时发起,每个请求完成后立即返回响应,不用等其他请求结束,也不阻塞其他请求启动。
解决方案
在k6里实现并行请求,核心是用Promise.all,但前提是每个API调用必须是异步非阻塞的。如果你的app模块里的方法还是同步调用(比如直接用http.get),得先改成异步版本,用http.asyncRequest来发起请求,这样才不会阻塞其他请求启动。
修改后的代码示例:
group('Map', function () { group('Open Map with Given Build and Level', async function () { // 把需要并行的请求都包装成返回Promise的异步调用 await Promise.all([ app.getUserType(authToken, 23), // 确保方法内部用http.asyncRequest并返回Promise app.projectFieldsPage.getKPIsIDByName(authToken, 23), app.getUser(authToken), app.getProjectInfo(authToken, 23), app.dashboardPage.getProjectShort(authToken, 23), app.projectFieldsPage.getSelectControlKPIs(authToken, 23), app.getBuildsInfoShort(authToken, 23, 142), app.globalSettingsPage.getProjectSettings(authToken, 23), app.getLevelsInfoShort(authToken, 23, 142, 471), app.layoutsPage.getLayoutsWithPermissions(authToken, 23) ]); }); sleep(1); });
关键注意事项
- 必须把group的回调改成
async function,才能使用await等待所有Promise完成 - 检查
app模块中的每个方法,确保内部用http.asyncRequest发起请求并返回Promise。比如getUserType的内部实现应该类似:
async function getUserType(authToken, projectId) { return http.asyncRequest('GET', 'https://your-api-endpoint/user-type', null, { headers: { 'Authorization': `Bearer ${authToken}` } }); }
- 如果部分请求有依赖关系(比如必须先拿到某请求结果才能发起另一个),可以把这类依赖请求单独放在
Promise.all外或嵌套await,但按当前需求,所有目标请求可无依赖并行发起。
内容的提问来源于stack exchange,提问作者Artem Sviatnenko
相关产品推荐
相关产品推荐

