使用BeanShell PreProcessor发送JSON对象时出现问题

时间:2017-08-05 18:07:59

标签: javascript json performance jmeter jmeter-plugins

我想使用BeanShell PreProcessor将一个JSON对象发送到JMeter中的HTTP Request主体。要建模JSON对象,我使用的是java代码(带有一些业务逻辑)。因此我创建了一个BeanShell PreProcessor并编写了如下的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'

任何人都可以提出上述代码的问题以及解决方法。

任何建议或解决方案也将受到赞赏。

2 个答案:

答案 0 :(得分:1)

obj2保存数据。使用ABCDConfig.cmake代替obj2

obj1

用于日志转换为“转发”

 vars.putObject("jsonData",obj2);

答案 1 :(得分:0)

  1. 你的Beanshell无法正常工作,因为它会在这一行失败:

    log.info(obj1); 
    

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

  2. 即使您在HTTP请求采样器上工作也不会出于同样的原因:您不能将JSON对象作为正文数据,因为JMeter需要一个字符串
  3. Beanshell is not the best scripting option,当您使用大量线程运行测试时,此功能将成为瓶颈,您应该考虑切换到JSR223 PreProcessorGroovy语言。 Groovy has built-in JSON supportits performance is much better可以编译和缓存表现良好的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())