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

K6性能测试:teardown登出用户及setup阶段Cookie配置问题

一、在teardown阶段获取测试涉及的用户ID列表

方案1:通过自定义指标收集用户ID

利用K6自定义指标记录用户ID作为标签,teardown阶段提取所有唯一标签值,无需外部存储也不会引入额外延迟:

import { Counter } from 'k6/metrics';
import http from 'k6/http';

// 创建计数器标记已登录用户
const loggedInUsers = new Counter('logged_in_users');

export default function () {
  // 模拟登录流程,假设返回用户ID
  const loginRes = http.post('/login', { username: 'user_x', password: 'pass' });
  if (loginRes.status === 200) {
    const userId = loginRes.json().user_id;
    // 记录用户ID到指标标签
    loggedInUsers.add(1, { user_id: userId });
    // 执行后续测试逻辑
  }
}

export function teardown(data) {
  const userIds = new Set();
  // 遍历指标样本提取所有用户ID
  loggedInUsers.samples.forEach(sample => {
    userIds.add(sample.tags.user_id);
  });

  // 批量登出用户
  for (const id of userIds) {
    http.post('/logout', { user_id: id });
  }
}

方案2:setup预分配用户,teardown直接使用预定义列表

如果测试用户是提前已知的,可在setup中加载所有用户,分配给VU使用,teardown直接用setup返回的列表登出:

import http from 'k6/http';

export function setup() {
  // 预加载测试用户列表
  const testUsers = [
    { id: 'user1', username: 'user1', password: 'pass1' },
    { id: 'user2', username: 'user2', password: 'pass2' },
    // 更多用户...
  ];
  return { testUsers };
}

export default function (data) {
  // VU按索引选取用户(需保证VU数量与用户数匹配)
  const user = data.testUsers[__VU - 1];
  const loginRes = http.post('/login', { username: user.username, password: user.password });
  // 执行测试逻辑
}

export function teardown(data) {
  // 遍历预定义用户列表批量登出
  data.testUsers.forEach(user => {
    http.post('/logout', { user_id: user.id });
  });
}
二、setup函数中正确配置Cookie

setup运行在单个独立进程中,可通过手动管理CookieJar确保请求间Cookie共享:

import http from 'k6/http';

export function setup() {
  // 创建专属CookieJar实例
  const jar = http.cookieJar();

  // 第一次登录请求,Cookie自动存入jar
  const firstLoginRes = jar.post('https://your-app.com/login', { username: 'test', password: 'test' });
  
  // 第二次请求复用同一个jar,确保Cookie正确携带
  const secondReqRes = jar.get('https://your-app.com/protected-endpoint');

  // 手动设置Cookie(应对特殊场景)
  jar.set('https://your-app.com', 'custom_cookie', 'cookie_value', {
    path: '/',
    secure: true,
    sameSite: 'Lax'
  });

  return { jar }; // 若VU需要使用该jar,可返回给default函数
}

常见问题排查

  • 检查响应头Set-Cookie的Path、Domain、SameSite属性,确保后续请求URL符合Cookie生效范围
  • 应用使用HttpOnly Cookie时,K6的CookieJar会自动处理,无需手动读取
  • 登录后需刷新Token或获取其他凭证的,要在setup中完成完整认证流程再发起后续请求

内容的提问来源于stack exchange,提问作者William Ross

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:46:18