【问题标题】:Issue while sending a JSON object with BeanShell PreProcessor使用 BeanShell PreProcessor 发送 JSON 对象时出现问题
【发布时间】:2017-08-05 18:07:58
【问题描述】:

我想使用 BeanShell 预处理器将一个 JSON 对象发送到 JMeter 中的 HTTP 请求正文。为了对 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'

谁能建议上述代码有什么问题以及如何解决。

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

【问题讨论】:

    标签: javascript json performance jmeter jmeter-plugins


    【解决方案1】:

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

     vars.putObject("jsonData",obj2);
    

    对于日志转换为Sring

     log.info(obj1.toString());
    

    【讨论】:

    • 试过你的建议,还是遇到同样的问题
    • 添加回答日志问题
    【解决方案2】:
    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())
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2022-01-09
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多