当前位置: 首页 > news >正文

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

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

什么是场景?

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

  • 虚拟用户(VU)数量

  • 执行策略(执行器)

  • 持续时间或迭代次数

  • 启动时间

  • 特定的测试逻辑

场景的核心特性

1. 独立负载配置

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

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-vusVU 数量随时间线性增减压力测试
constant-arrival-rate恒定速率生成 VUAPI 负载测试
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. 为关键业务流程创建独立场景

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. 使用混合负载模式

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. 场景间数据共享

// 全局共享数据
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. 场景特定的环境变量

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'}
}

高级场景配置

优雅停止和启动

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}
}

场景标签

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. 优化测试资源的使用

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

http://www.lryc.cn/news/618770.html

相关文章:

  • Spring面试宝典
  • Pytest项目_day13(usefixture方法、params、ids)
  • Linux系统管理利器lsof命令详解与实战应用
  • 杰理手表-增加提示音-提示音音量调整--使用提示音
  • kafka 消费者组的概念是什么?它是如何实现消息的点对点和发布/订阅模式?
  • 无人机航拍数据集|第14期 无人机水体污染目标检测YOLO数据集3000张yolov11/yolov8/yolov5可训练
  • Linux中Https配置与私有CA部署指南
  • 股指期货基本术语是什么?
  • 云计算分类与主流产品
  • Neo4j Cypher语句
  • 设置默认的pip下载清华源(国内镜像源)和pip使用清华源
  • day49 力扣42. 接雨水 力扣84.柱状图中最大的矩形
  • 零基础数据结构与算法——第七章:算法实践与工程应用-性能分析与瓶颈
  • 全面解析远程桌面:功能实现、性能优化与安全防护全攻略
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧
  • 第十篇:3D模型性能优化:从入门到实践
  • 【DL】Deep Learning base
  • CASS11三维坡度着色显示
  • PR新建项目
  • ARM芯片架构之CoreSight SoC-400 组件介绍
  • windows单机单卡+CIFAR-10数据集+Docker模拟训练
  • 自建知识库,向量数据库 体系建设(一)之BERT 与.NET 4.5.2 的兼容困境:技术代差下的支持壁垒
  • 【数据分享】2018-2024年中国10米分辨率春小麦和冬小麦分布栅格数据
  • Shell 实现多级菜单脚本编写
  • 每日一练:将一个数字表示成幂的和的方案数;动态规划、深度优先搜索
  • WireShark:非常好用的网络抓包工具
  • AI重构Java开发:飞算JavaAI如何实现效率与质量的双重突破?
  • 晶片与电路板的桥梁-封装
  • Windows server服务器上部署python项目域名访问(超详细教程)
  • Day13 Vue工程化