运行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的运行环境:
- 安装必要依赖:
npm install @babel/core @babel/preset-env @babel/plugin-transform-runtime @babel/runtime core-js@3 --save-dev
- 修改
.babelrc配置:
{ "presets": [ [ "@babel/preset-env", { "targets": { "node": "current" }, "useBuiltIns": "usage", "corejs": 3 } ] ], "plugins": [ "@babel/plugin-transform-runtime" ] }
- 转译代码后运行:
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
相关产品推荐
相关产品推荐

