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

长时间运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:24:01