You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:15:06