Scala+Gatling性能测试:读取JSON替换变量传入签名方法的问题
解决Gatling中解析JSON文件占位符并生成签名的问题
嘿,我完全懂你现在卡在哪了——Gatling的ElFileBody根本不是用来直接读取并返回文件内容的工具,它是一个函数式的请求体构建器,本质上是Session => RequestBody类型的函数,所以你直接调用.toString()只会得到类似<function1>的对象描述,完全不是你想要的替换后的JSON字符串。咱们来一步步搞定这个问题:
核心思路
我们需要分三步走:
- 先从资源文件里读取JSON的原始字符串内容
- 利用Gatling会话的表达式解析能力,把字符串里的
${device}这类占位符替换成feeder注入到会话中的实际值 - 把替换后的完整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
相关产品推荐
相关产品推荐

