You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala+Gatling性能测试:读取JSON替换变量传入签名方法的问题

解决Gatling中解析JSON文件占位符并生成签名的问题

嘿,我完全懂你现在卡在哪了——Gatling的ElFileBody根本不是用来直接读取并返回文件内容的工具,它是一个函数式的请求体构建器,本质上是Session => RequestBody类型的函数,所以你直接调用.toString()只会得到类似<function1>的对象描述,完全不是你想要的替换后的JSON字符串。咱们来一步步搞定这个问题:

核心思路

我们需要分三步走:

  1. 先从资源文件里读取JSON的原始字符串内容
  2. 利用Gatling会话的表达式解析能力,把字符串里的${device}这类占位符替换成feeder注入到会话中的实际值
  3. 把替换后的完整JSON字符串传给getSignature生成签名,再存入会话

具体代码实现

首先,提前读取JSON文件的原始内容(可以放在测试类的初始化部分,避免每次请求都重复读文件):

import scala.io.Source

// 读取resources目录下的abc.json文件内容
val rawJsonContent = Source.fromResource("abc.json").mkString

然后在你的场景流程里,处理会话并生成签名:

.exec(session => {
  // 用Gatling的会话解析JSON里的占位符,替换成会话中的实际值
  val resolvedJson = session.elString(rawJsonContent).apply(session)
  
  // 调用签名生成方法,传入key和替换后的JSON字符串
  val generatedSign = SignatureGeneration.getSignature(key, resolvedJson)
  
  // 把签名存入会话,供后续请求使用
  session.set("sign", generatedSign)
})

关键细节解释

  • Source.fromResource("abc.json"):Gatling默认会从src/test/resources目录读取资源文件,所以确保你的abc.json放在这个路径下
  • session.elString(rawJsonContent):这个方法会把字符串中的Gatling表达式(比如${device})转换成一个能从会话中取值的函数,调用.apply(session)就会得到替换后的最终字符串
  • 为什么不能用ElFileBody?因为它是为构建HTTP请求体设计的,内部会自动处理表达式解析,但它不会直接暴露解析后的字符串给你调用的自定义方法,所以咱们得手动完成解析步骤

额外注意事项

  • 如果你的JSON文件里有多个${}占位符,elString会自动处理所有的表达式,只要这些变量已经通过feeder或者其他方式注入到会话中
  • 记得处理文件读取可能出现的异常(比如文件不存在),可以加个try-catch或者用Option来包装读取逻辑

内容的提问来源于stack exchange,提问作者user2565256

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:17:36