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

软件CNAS/CMA测评验收机构【Gatling动态参数处理:Session API、EL表达式、随机函数】

Gatling的Session API、EL表达式和随机函数是构建动态、真实负载测试,模拟出每个虚拟用户(Virtual User)的独特行为。

Session :一个不可变键值存储,存储着该用户的所有个性化状态。随机函数和Feeder负责生成数据并写入Session;而EL表达式则是在需要时从Session中读取数据的简洁语法。

二、 Session API

Session是Gatling状态管理的主要对象,是不可变(Immutable) 的。任何修改操作都会返回一个新的Session实例。

操作API:

存储数据:使用 .set(key, value)

.exec { session => val updatedSession = session.set("userId", 12345).set("requestId", UUID.randomUUID().toString) updatedSession // 必须返回这个新的Session }

读取数据:使用 .get(key),返回 Option[Any]

.exec { session => val maybeUserId = session("userId").asOption[Int] // 安全读取,类型转换 val userId = session("userId").as[Int] // 直接读取,类型不匹配或不存在会抛异常 session }

移除数据.remove(key)

避免使用Session API进行复杂的业务逻辑计算。它主要用于状态传递,复杂逻辑应放在exec的函数体外或使用Gatling的内置处理器。

三、 EL表达式:简洁的动态参数注入

EL表达式(表达式语言)是Gatling DSL中在字符串模板内动态引用Session属性的简洁语法,格式为 ${attributeName}。

应用示例:

URL路径和查询参数:

.get("/api/users/${userId}/orders?type=${orderType}")

请求体(JSON/XML):

.body(StringBody("""{"userId": ${userId}, "items": [${itemId}]}""")).asJson

请求头:

.header("X-Trace-Id", "${traceId}")

特性:

自动类型转换:如果Session中存储的是数字,在JSON体中会被正确渲染为数字(无引号)。

空值安全:如果Session中不存在该属性,Gatling会将该虚拟用户的请求标记为失败。

局限:无法在EL表达式中进行运算或方法调用(如${userId + 1}是无效的)。

文章来源:卓码软件测评

精彩推荐:点击蓝字即可
软件负载测试API自动化测试软件测试第三方软件测试软件性能测试软件测试机构

四、 随机函数和Feeder数据生成引擎

1. 随机函数库Random

Gatling在io.gatling.core.Predef和io.gatling.core.session.el包中提供了丰富的随机函数,可直接在EL表达式或Session API中使用。

基础随机:

.exec(http("随机用户") .get("/user/${randomInt(1, 100)}") // 生成1到100之间的整数 .header("X-Random", "${randomUuid}") // 生成随机UUID )

随机字符串:

"${randomAlphanumeric(10)}" // 10位字母数字

加权随机选择:

"${uniformSample(List("mobile", "desktop", "tablet"))}" // 均匀选择 "${circularSample(List("A", "B", "C"))}" // 循环选择

2. Feeder结构化数据源

Feeder用于从外部文件(CSV、JSON)或内部迭代器中读取数据,并注入Session。

CSV文件驱动:

// users.csv 文件内容 // userId,username // 1,userA // 2,userB val userFeeder = csv("users.csv").random val scn = scenario("场景") .feed(userFeeder) // 为每个虚拟用户注入一行数据 .exec(http("获取用户") .get("/api/${userId}") .check(jsonPath("$.name").is("${username}")) )

自定义迭代器(Iterator.continually):

val customFeeder = Iterator.continually( Map("dynamicId" -> (System.currentTimeMillis() + Random.nextInt(1000))) )

五、 模拟真实用户下单流程

模拟一个包含用户登录、浏览商品、随机下单的完整业务流程:

import scala.concurrent.duration._ import io.gatling.core.Predef._ import io.gatling.http.Predef._ class AdvancedSimulation extends Simulation { val httpProtocol = http.baseUrl("https://api.zmtests.com") // 1. 使用Feeder加载测试账户和商品数据 val userAccounts = csv("data/users.csv").circular val productPool = csv("data/products.csv").random val scn = scenario("完整购物流程") // 2. 为虚拟用户注入初始身份 .feed(userAccounts) .exec( http("用户登录") .post("/login") .body(StringBody("""{"username":"${username}","password":"${password}"}""")) .check(jsonPath("$.token").saveAs("authToken")) // 3. 提取Token存入Session ) .pause(2) // 4. 循环浏览商品 .repeat(5, "visitCount") { feed(productPool) .exec( http("浏览商品 - ${productId}") .get("/products/${productId}") .header("Authorization", "Bearer ${authToken}") // 使用Session中的Token .check(status.is(200)) ) .pause(1) } // 5. 随机决定是否下单(50%概率) .doIf(session => Random.nextBoolean()) { exec( http("创建订单") .post("/orders") .header("Authorization", "Bearer ${authToken}") .body(ElFileBody("templates/order.json")) // 6. 使用模板文件,其中可包含EL表达式 .check(jsonPath("$.orderId").saveAs("createdOrderId")) ) .exec { session => // 7. 使用Session API进行后置处理 println(s"用户 ${session("username").as[String]} 创建了订单:${session("createdOrderId").as[String]}") session } } setUp( scn.inject(rampUsers(100).during(30.seconds)) ).protocols(httpProtocol) }

六、实践

性能:避免在Session中存储过大的对象(如整个文件内容),会增加内存开销和序列化。

线程安全:Gatling的随机函数和Feeder在设计上都是线程安全的,无需额外同步。

可重复:调试时可以为随机数生成器设置固定种子(通过Session的seed属性),保证每次运行脚本时生成相同的“随机”序列。

错误处理:对于主要的Session属性,在使用EL表达式前,可先用.get进行安全检查,或使用doIf保证存在。

http://www.jsqmd.com/news/122928/

相关文章:

  • 基于PLC的船舶生活污水处理系统的仿真与设计
  • LangFlow镜像如何提升AI研发效率?真实数据告诉你
  • LangFlow镜像回滚机制:出现问题快速恢复至上一版
  • 独家解密Open-AutoGLM内部逻辑:如何让系统自主决策订单流转?
  • 从“单体智能”到“群体协同”:机器狗集群的分布式智能演进之路
  • 从0到1搭建AI智能体,看这篇就够!创建、知识库、提示词、MCP、协作与评测全流程详解!
  • 你还在人工查库存?(Open-AutoGLM自动化监控已淘汰传统模式)
  • Nano Banana AI 图像工作室:生成式AI在“数字到物理”原型设计中的应用
  • uv Linux平台安装与配置
  • 交通工程 / 运输规划,4 本高性价比国际期刊推荐!
  • 必看收藏!一文掌握Agent开发核心链路:从小白到专家的实战指南
  • LangFlow镜像容器编排:K8s环境下弹性伸缩实战
  • 为什么头部电商平台都在用Open-AutoGLM?:深度拆解其库存预测算法逻辑
  • Open-AutoGLM性能调优全攻略:让自动回复响应速度提升10倍(独家实测数据)
  • 如何用Open-AutoGLM实现售后工单5分钟闭环处理?一线技术专家亲授秘诀
  • 极萌大排灯怎么样?品牌实力+安全售后双重护航 - 速递信息
  • 海外发稿公司哪家好?多维博展(成都)科技有限公司为您解惑 - mypinpai
  • LangFlow镜像社区版发布:开源共建AI开发新生态
  • LangFlow镜像文件处理器:上传解析PDF、Word等文档
  • 错过可能再等一年:Open-AutoGLM开源首曝,电商智能化转型新拐点
  • 靠谱的振动盘厂家,为您的自动化生产保驾护航 - myqiye
  • 王炸!ReAct架构专治LLM“幻觉”,给AI装上“思考-行动”大脑,从此告别胡说八道!
  • Open-AutoGLM自动化神器:1小时搞定千场活动报名的底层逻辑
  • ARM架构国产化:高品质计算与生态演进之路
  • 桥式五轴、龙门、卧式、立式、855、1160加工中心应用大比拼 - 品牌推荐大师
  • LangFlow镜像支持自定义组件?开发者可自由扩展!
  • 【Linux 基础知识系列:第二百零九篇】Linux 文件系统 ACL 权限配置
  • 2025年广州短视频拍摄服务公司推荐:短视频拍摄服务哪家专业? - 工业推荐榜
  • LangFlow镜像与LangSmith协同:监控与调试双管齐下
  • 想快速入门学黑客,这四个工具一定要会!