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

运行k6负载测试时遇ReferenceError: regeneratorRuntime未定义求助

解决k6测试中ReferenceError: regeneratorRuntime is not defined问题

这个报错的核心原因有两个:一是你用了k6不兼容的axios库(k6的运行时是独立的,不支持Node.js或浏览器的第三方HTTP库,只能用它自带的http模块);二是async/await相关语法未被正确转译,加上babel配置没适配k6的运行环境。下面一步步帮你解决:

第一步:替换axios为k6原生http模块

k6不支持axios,必须用它自带的http模块处理请求。把你的认证函数改成k6兼容的写法:

import http from "k6/http";
import { check } from "k6";

// 获取认证token的同步函数(k6的http模块默认是同步的)
function getAuthToken() {
  const dataForBody = `client_id=LoadTesting&grant_type=client_credentials&scope=${encodeURI('StitchApi')}&client_secret=${encodeURI(process.env.REACT_APP_CLIENT_SECRET)}`;
  const messageHeaders = {
    'Content-Type': 'application/x-www-form-urlencoded',
  };

  // 用k6的http.post发送请求
  const res = http.post(process.env.REACT_APP_STITCH_AUTH_URL, dataForBody, { headers: messageHeaders });
  
  // 加检查确保token请求成功
  check(res, {
    "auth request succeeded": (r) => r.status === 200,
    "token received": (r) => r.json().access_token !== undefined,
  });

  return res.json().access_token;
}

第二步:用k6的setup函数处理前置认证

k6推荐在setup函数里做一次性的前置操作(比如获取token),这样所有测试用户(VU)可以复用这个token,避免重复请求:

let authToken;

// setup函数在测试开始前仅执行一次
export function setup() {
  authToken = getAuthToken();
  console.log("AUTH!!!!!!", authToken);
  return { token: authToken }; // 将token传递给测试函数
}

export default function (data) {
  const url = "https://mywebsite.net/Api/GraphQL/";
  const payload = JSON.stringify({
    query: `
      {
        student(id: "5asdfasdfasdfasdf") {
          name
        }
      }
    `
  });
  const params = {
    headers: {
      "authorization": `Bearer ${data.token}`, // 使用setup获取的有效token
      "content-type": "application/json",
    }
  };

  let res = http.post(url, payload, params);
  check(res, {
    "status is 200": (r) => r.status === 200,
    "is authenticated": (r) => r.json().authenticated === true,
    // 注意:GraphQL响应一般在data字段下,需根据实际返回结构调整检查逻辑
    "student name matches": (r) => r.json().data?.student?.name === "预期学生姓名",
    // 原检查中的"caption is correct"是针对HTML的,而你请求的是GraphQL接口(返回JSON),建议删除该检查
  });
};

第三步:如果必须用async/await,修复babel配置

如果你确实需要使用async/await语法,需要调整babel配置适配k6的运行环境:

  1. 安装必要依赖:
npm install @babel/core @babel/preset-env @babel/plugin-transform-runtime @babel/runtime core-js@3 --save-dev
  1. 修改.babelrc配置:
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        },
        "useBuiltIns": "usage",
        "corejs": 3
      }
    ]
  ],
  "plugins": [
    "@babel/plugin-transform-runtime"
  ]
}
  1. 转译代码后运行:
babel src --out-dir dist
k6 run dist/your-test-file.js

额外注意点

  • 不要在k6测试中使用global.console.log,直接用console.log即可,k6原生支持。
  • 原代码中const authorization = registerHandlers();会得到一个Promise(而非直接的token),这也是导致后续逻辑异常的原因,用setup函数可以完美规避。

内容的提问来源于stack exchange,提问作者Daniel Greene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:26:57