长时间运行K6测试时如何定期重新执行setup步骤刷新过期token
K6定时刷新token解决方案
核心思路为避开重复执行全局setup步骤,转而实现节点级的定时token刷新逻辑,同时缓存有效token避免每次迭代重复请求,可同时解决云测试多节点同步、迭代耗时增加两个痛点。
方案1:节点级共享缓存定时刷新(适配90%以上场景)
K6云测试中每个运行节点为独立进程,只需保证每个节点独立维护全局有效token缓存即可,无需跨节点同步,天然适配分布式测试场景:
import http from 'k6/http'; import { check } from 'k6'; // 每个节点独立维护的全局缓存 let cachedToken = null; let tokenExpireAt = 0; // 配置token有效期,建议比实际有效期少1-2分钟,留安全冗余避免边界失效 const TOKEN_VALID_DURATION = 29 * 60 * 1000; function getValidToken() { const now = Date.now(); // 仅token未初始化或已过期时才发起新请求 if (!cachedToken || now >= tokenExpireAt) { // 替换为自身的token获取逻辑 const loginRes = http.post('https://你的登录接口地址', JSON.stringify({ account: 'test', password: 'test' }), { headers: { 'Content-Type': 'application/json' } }); check(loginRes, { 'token获取成功': r => r.status === 200 }); cachedToken = loginRes.json().data.token; tokenExpireAt = now + TOKEN_VALID_DURATION; } return cachedToken; } export default function () { // 直接调用即可,99%以上场景直接返回缓存token,无额外耗时 const token = getValidToken(); // 后续业务逻辑使用token即可 const businessRes = http.get('https://你的业务接口地址', { headers: { Authorization: `Bearer ${token}` } }); // 业务断言逻辑 }
该方案优势:
- 同节点所有VU共享同一个token缓存,不会出现多VU重复请求token的问题
- 云测试多节点场景下无需跨节点同步,每个节点独立维护自身token即可
- 仅每半小时有1次token请求开销,对整体测试耗时的影响可忽略不计
方案2:完全隔离token刷新逻辑(零业务迭代耗时影响)
如果需要严格避免任何业务迭代被token请求阻塞,可以单独配置token刷新场景,和业务测试场景完全隔离:
import http from 'k6/http'; import { check } from 'k6'; export const options = { scenarios: { // 专门负责刷新token的场景,仅1个VU,每29分钟执行一次 token_refresh: { executor: 'per-vu-iterations', vus: 1, iterations: 1, startTime: '0s', exec: 'refreshToken', }, // 你的主业务测试场景,等待token初始化完成后启动 business_test: { executor: 'constant-vus', vus: 100, duration: '3h', startTime: '5s', exec: 'default', } } } let cachedToken = null; export function refreshToken() { // 替换为自身的token获取逻辑 const loginRes = http.post('https://你的登录接口地址', JSON.stringify({ account: 'test', password: 'test' }), { headers: { 'Content-Type': 'application/json' } }); check(loginRes, { 'token获取成功': r => r.status === 200 }); cachedToken = loginRes.json().data.token; // 定时触发下一次刷新 setTimeout(refreshToken, 29 * 60 * 1000); } export default function () { // 直接使用全局缓存的token即可,无任何额外请求 const businessRes = http.get('https://你的业务接口地址', { headers: { Authorization: `Bearer ${cachedToken}` } }); // 业务断言逻辑 }
该方案优势:token刷新逻辑完全和业务迭代隔离,不会占用业务VU的执行时间,完全不会影响业务接口的耗时统计结果。
内容的提问来源于stack exchange,提问作者juanjo Montiel
相关产品推荐
相关产品推荐

