使用 BeanShell 预处理器发送 JSON 对象时出现问题



我想使用 BeanShell PreProcessor 将一个 JSON 对象发送到 JMeter 中的 HTTP 请求正文。为了对JSON对象进行建模,我正在使用java代码(带有一些业务逻辑(。因此,我创建了一个BeanShell预处理器,并编写了如下Java代码:

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
String key="testKey";
int lastID=5548;
int totalCount=198;
JSONObject obj1 = new JSONObject();
JSONArray obj2 = new JSONArray();
for (int i=1;i<=totalCount;i++)
{
JSONObject item = new JSONObject();
item.put("taskId", Integer.toString(lastID+i));
item.put("taskOrder",1);
item.put("snapshotTemplateKey",key);
obj2.put(item);
obj1.put("changeControlTasks", obj2);
obj1.put("ccName","Eleven" );
obj1.put("snapshotTemplateKey",key);
}
log.info(obj1);
vars.putObject("jsonData",obj1);

在HTTP请求正文中,我正在尝试获取数据,如下所示,

${jsonData}

使用上面的代码,它抛出以下共享错误

请求:

POST data:
${jsonData}

日志中的错误:

2017/08/06 07:27:10 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval
Sourced file: inline evaluation of: ``import org.json.JSONArray; import org.json.JSONException; 
import org.json.JSONOb . . . '' : Error in method invocation: Method info(  ) not found in class'org.apache.log.Logger'

任何人都可以建议上述代码的问题以及如何解决。

任何建议或解决方案也将不胜感激。

obj2 保存数据。使用obj2而不是obj1

vars.putObject("jsonData",obj2);

对于日志转换为Sring

log.info(obj1.toString());
  1. 你的 Beanshell 将无法工作,因为它将在以下行失败:

    log.info(obj1); 
    

    因为您将无法将 JSON 对象打印到日志中

  2. 即使您围绕HTTP请求采样器工作也不起作用,原因相同:您不能将JSON对象作为正文数据,因为JMeter期望在那里使用字符串
  3. Beanshell 不是最好的脚本选项,当你用大量线程运行测试时,这个函数将成为瓶颈,你应该考虑切换到 JSR223 PreProcessor 和 Groovy 语言。Groovy具有内置的JSON支持,其性能要好得多,因为可以编译和缓存行为良好的Groovy脚本。替换 Groovy 代码将是这样的:

    import groovy.json.JsonBuilder
    def key = 'testKey'
    def lastID = 5548
    def totalCount = 198
    JsonBuilder builder = new JsonBuilder()
    def array = []
    1.upto(totalCount, {
    def taskId = (lastID + "${it}".toInteger())
    array << [getKey: { key }, getTaskId: { taskId }, getTaskOrder: { 1 }]
    })
    builder(
    {
    changeControlTasks array.collect() {
    [
    "snapshotTemplateKey": it.getKey(),
    "taskId"             : it.getTaskId(),
    "taskOrder"          : it.getTaskOrder()
    ]
    }
    snapshotTemplateKey "testKey"
    ccName "Eleven"
    }
    )
    vars.put('jsonData', builder.toPrettyString())
    

最新更新