JMeter中如何在Beanshell预处理器替换字符串变量?
解决JMeter Beanshell预处理器中变量未替换的问题
你当前的代码中,字符串里的${origin_encrypted}这类占位符不会被Beanshell自动解析——JMeter的占位符语法仅在元件的参数化输入字段中生效,Beanshell脚本里需要主动通过JMeter内置对象获取变量值。以下是几种可行的解决方案:
方法1:使用vars对象直接获取变量(推荐)
vars是JMeter提供的内置对象,可直接访问JMeter变量,用vars.get("变量名")获取对应值后拼接字符串:
String textToSign = "{ \"origin\": \"" + vars.get("origin_encrypted") + "\"," + " \"destiny\": \"" + vars.get("destiny_encrypted") + "\"," + " \"subject\": \"" + vars.get("subject_encrypted") + "\"," + " \"amount\": \"" + vars.get("amount_encrypted") + "\"," + " \"softToken\": \"" + vars.get("softToken_encrypted") + "\" }"; log.info("Text To Sign: " + textToSign);
若担心变量不存在导致返回null,可添加默认值:
vars.get("origin_encrypted", "")
方法2:用String.format简化拼接
通过格式化字符串的方式,让代码更简洁易读:
String textToSign = String.format( "{ \"origin\": \"%s\", \"destiny\": \"%s\", \"subject\": \"%s\", \"amount\": \"%s\", \"softToken\": \"%s\" }", vars.get("origin_encrypted"), vars.get("destiny_encrypted"), vars.get("subject_encrypted"), vars.get("amount_encrypted"), vars.get("softToken_encrypted") ); log.info("Text To Sign: " + textToSign);
方法3:用JSON工具类构建(适合复杂JSON结构)
借助JMeter内置的org.json.JSONObject类构建JSON,避免手动拼接字符串的错误:
import org.json.JSONObject; JSONObject signJson = new JSONObject(); signJson.put("origin", vars.get("origin_encrypted")); signJson.put("destiny", vars.get("destiny_encrypted")); signJson.put("subject", vars.get("subject_encrypted")); signJson.put("amount", vars.get("amount_encrypted")); signJson.put("softToken", vars.get("softToken_encrypted")); String textToSign = signJson.toString(); log.info("Text To Sign: " + textToSign);
注意事项
- 确保
origin_encrypted、destiny_encrypted等变量已在JMeter中定义(如用户定义变量、正则表达式提取器等),否则vars.get()会返回null,最终JSON中会出现"null"字符串。 - JMeter 5.x及以上版本默认包含
org.json包,无需额外导入jar。
内容的提问来源于stack exchange,提问作者Hans López
相关产品推荐
相关产品推荐

