news 2026/3/29 15:44:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
软件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保证存在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 8:29:06

独家解密Open-AutoGLM内部逻辑:如何让系统自主决策订单流转?

第一章:独家解密Open-AutoGLM核心架构Open-AutoGLM 作为新一代开源自动代码生成语言模型,其架构设计融合了模块化推理、动态上下文感知与轻量化部署能力。该系统通过分层抽象机制实现从自然语言指令到可执行代码的端到端映射,在保证生成质量的…

作者头像 李华
网站建设 2026/3/27 1:38:42

订单高峰期不再手忙脚乱!Open-AutoGLM实时处理方案来了

第一章:订单高峰期不再手忙脚乱!Open-AutoGLM实时处理方案来了在电商大促或节假日期间,订单量可能在短时间内激增十倍甚至百倍,传统系统往往因响应延迟、队列积压而崩溃。Open-AutoGLM 作为新一代智能自动化处理引擎,专…

作者头像 李华
网站建设 2026/3/14 2:03:17

必看收藏!一文掌握Agent开发核心链路:从小白到专家的实战指南

本文系统解析了AI Agent的开发核心链路,详细阐述了Agent的四大核心能力及由LLM大脑、规划、记忆和工具调用构成的技术架构。文章深入探讨了上下文工程的优化策略,并以腾讯Dola为例展示了Agent的商业价值。对AI产品经理而言,需实现从对话到任务…

作者头像 李华
网站建设 2026/3/27 22:29:30

19.4 核心技术整合:Prompt优化+SD模型应用

19.4 核心技术整合:Prompt优化+SD模型应用 课程概述 在上一节课中,我们深入挖掘了用户在使用图像生成工具时遇到的主要痛点。本节课我们将探讨如何通过技术手段解决这些痛点,重点关注Prompt优化技术和Stable Diffusion模型的应用整合,为用户提供更可控、更易用的图像生成…

作者头像 李华