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运行在单个独立进程中,可通过手动管理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生效范围 - 应用使用
HttpOnlyCookie时,K6的CookieJar会自动处理,无需手动读取 - 登录后需刷新Token或获取其他凭证的,要在setup中完成完整认证流程再发起后续请求
内容的提问来源于stack exchange,提问作者William Ross
相关产品推荐
相关产品推荐

