详解k6中的核心概念——场景(Scenarios)

在 k6 性能测试工具中,场景(Scenarios) 是一个核心概念,它允许您定义不同的负载模式和测试策略,模拟真实世界中的各种用户行为模式。

什么是场景?

场景是 k6 中用于定义和组织不同负载测试策略的高级结构。每个场景可以有自己的:

  • 虚拟用户(VU)数量

  • 执行策略(执行器)

  • 持续时间或迭代次数

  • 启动时间

  • 特定的测试逻辑

场景的核心特性

1. 独立负载配置

每个场景可以有不同的负载配置:

javascript 复制代码
scenarios: {
  spike_test: {
    executor: 'ramping-vus',
    stages: [
      { duration: '10s', target: 100 }, // 10秒内增加到100 VU
      { duration: '1m', target: 100 },  // 保持100 VU 1分钟
      { duration: '10s', target: 0 }    // 10秒内降为0 VU
    ]
  },
  stability_test: {
    executor: 'constant-vus',
    vus: 50,
    duration: '1h'
  }
}

2. 多种执行器(Executors)

k6 提供多种执行器来模拟不同负载模式:

执行器类型 描述 适用场景
shared-iterations 所有 VU 共享总迭代次数 登录、注册等固定操作
per-vu-iterations 每个 VU 执行固定次数的迭代 购物流程、搜索流程
constant-vus 固定数量的 VU 运行指定时间 稳定性测试
ramping-vus VU 数量随时间线性增减 压力测试
constant-arrival-rate 恒定速率生成 VU API 负载测试
ramping-arrival-rate 变化速率生成 VU 渐变负载测试

3. 并行或顺序执行

多个场景可以并行或顺序执行:

复制代码
scenarios: {
  login_scenario: {
    executor: 'shared-iterations',
    iterations: 100,
    vus: 20,
    exec: 'loginFlow'
  },
  search_scenario: {
    executor: 'constant-vus',
    vus: 30,
    duration: '5m',
    exec: 'searchFlow',
    startTime: '2m' // 在登录场景开始2分钟后启动
  }
}

注意:如果没有参数startTime,那么默认所有场景同时启动,我们可以通过设置startTime的开始时间值,来控制不同场景的启动时间

4. 独立的指标收集

k6 会为每个场景单独收集和报告指标:

复制代码
http_req_duration...........: avg=123.45ms (scenario=login_scenario)
http_req_duration...........: avg=234.56ms (scenario=search_scenario)
iterations..................: 100 (scenario=login_scenario)
iterations..................: 1500 (scenario=search_scenario)

为什么需要场景?

  1. 模拟真实用户行为

    • 不同用户群体可能有不同行为模式

    • 例如:普通用户 vs VIP 用户,浏览用户 vs 购买用户

  2. 测试系统在不同负载下的表现

    • 突发流量(秒杀活动)

    • 持续负载(日常访问)

    • 逐渐增加的负载(促销预热)

  3. 隔离测试不同功能模块

    • 登录模块

    • 搜索模块

    • 支付模块

  4. 优化测试资源使用

    • 并行执行多个测试场景

    • 针对不同模块设置不同负载

场景最佳实践

1. 为关键业务流程创建独立场景

javascript 复制代码
scenarios: {
  user_registration: {
    executor: 'per-vu-iterations',
    vus: 10,
    iterations: 5,
    exec: 'registrationFlow'
  },
  product_purchase: {
    executor: 'constant-arrival-rate',
    rate: 30,
    timeUnit: '1s',
    duration: '10m',
    preAllocatedVUs: 10,
    exec: 'purchaseFlow'
  }
}

2. 使用混合负载模式

javascript 复制代码
scenarios: {
  // 正常负载
  normal_traffic: {
    executor: 'constant-vus',
    vus: 100,
    duration: '30m'
  },
  // 突发流量(模拟促销)
  flash_sale: {
    executor: 'ramping-vus',
    stages: [
      { duration: '2m', target: 500 },
      { duration: '3m', target: 500 },
      { duration: '2m', target: 100 }
    ],
    startTime: '15m' // 在正常负载15分钟后启动
  }
}

3. 场景间数据共享

javascript 复制代码
// 全局共享数据
const authTokens = new Map();

export function setup() {
  // 预先生成认证令牌
  for (let i = 1; i <= 100; i++) {
    authTokens.set(`user_${i}`, generateToken());
  }
  return authTokens;
}

export function loginFlow(data) {
  // 使用共享的认证令牌
  const token = data.get(`user_${__VU}`);
}

4. 场景特定的环境变量

javascript 复制代码
scenarios: {
  staging_test: {
    executor: 'constant-vus',
    vus: 10,
    duration: '10m',
    env: { BASE_URL: 'https://staging.example.com' },
    exec: 'mainFlow'
  },
  production_test: {
    executor: 'constant-vus',
    vus: 5,
    duration: '5m',
    env: { BASE_URL: 'https://api.example.com' },
    exec: 'mainFlow'
  }
}

高级场景配置

优雅停止和启动

javascript 复制代码
scenarios: {
  critical_checkout: {
    executor: 'ramping-arrival-rate',
    startRate: 5,
    timeUnit: '1s',
    stages: [
      { target: 10, duration: '30s' },
      { target: 10, duration: '5m' }
    ],
    gracefulStop: '2m', // 优雅停止时间
    preAllocatedVUs: 5,
    maxVUs: 50
  }
}

场景标签

javascript 复制代码
scenarios: {
  eu_users: {
    executor: 'constant-vus',
    vus: 20,
    duration: '10m',
    tags: { region: 'europe' },
    exec: 'userFlow'
  },
  us_users: {
    executor: 'constant-vus',
    vus: 30,
    duration: '10m',
    tags: { region: 'usa' },
    exec: 'userFlow'
  }
}

总结

k6 中的场景是一个强大的功能,它允许您:

  1. 定义多种负载模式和测试策略

  2. 模拟真实世界的用户行为

  3. 并行测试系统的不同部分

  4. 收集细粒度的性能指标

  5. 优化测试资源的使用

通过合理使用场景,您可以创建更真实、更高效的性能测试,更准确地评估系统在各种条件下的表现,从而更好地发现和解决性能瓶颈。

相关推荐
程序员小远1 小时前
性能测试之性能调优
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
xy345311 小时前
Wireshark捕获过滤器——语法元素详解
网络·测试工具·渗透测试·wireshark
PhotonixBay18 小时前
共聚焦成像核心原理:针孔、PSF与三维形貌测量技术
人工智能·测试工具·算法
程序员小远18 小时前
接口测试之文件上传
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
kft131420 小时前
Playwright + 本地 AI,从录制到自愈闭环的一站式自动化测试平台。
人工智能·测试工具
蒲公英内测分发2 天前
Typeoff:当 AI 开始参与工作,我们可能需要重新思考“输入”这件事
人工智能·测试工具·项目管理·语音输入·ai语音输入
LT10157974442 天前
2026年手机机型兼容性测试选型指南:安卓机型碎片化、APP闪退UI错乱如何解决
android·测试工具·ui·智能手机
Luminbox紫创测控2 天前
GB/T 5137.3 2020标准:汽车安全玻璃耐辐照与耐模拟气候试验方法
人工智能·测试工具·汽车·安全性测试·uv·测试标准