无法从位于外部BeanShell脚本中的List调用对象[Jmeter]

时间:2015-06-09 22:37:29

标签: list jmeter beanshell

我的最终目标是从列表中获取一个字符串,该列表是从JSON响应动态创建的。我在从外部BeanShell脚本中创建的列表中调用值时遇到了麻烦。外部脚本读取JSON响应并从过滤的响应中创建列表。

import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Filter;

try{

    String json = new String(prev.getResponseDataAsString());

    List allPositiveAffects = JsonPath.read(json, "$.affectTags[?(@.value > 0.0)].key", new Filter[]{});
    vars.putObject("allPositiveAffects",allPositiveAffects);
    log.info("allPositiveAffects: " + allPositiveAffects);

    int positiveAffectCount = allPositiveAffects.size();
    vars.put("positiveAffectCount",Integer.toString(positiveAffectCount));

} catch (Throwable ex){
    log.error("Error:\n", ex);
}

allPositiveAffects返回预期值,所以现在我想将其中一个值放入后续的JSON POST中。

我的Jmeter测试设置:

- Thread Group
  + JSON GET request
    - BeanShell PostProcessor
  + JSON POST request

尝试从allPositiveAffects获取值已经证明不像在我的BeanShell脚本中调用allPositiveAffects.get(n)那么容易。

我还没有想出一个简单的方法来获取列表的内容。我错过了什么吗?我在JSON POST request中尝试了几种不同的东西。最新的是:

//json POST data
{
"entries":[
"id": -1,
"key": "${__BeanShell(${allPositiveAffects}.get(1))}"]
}

返回以下错误:

java.lang.ClassCastException: net.minidev.json.JSONArray cannot be cast to java.lang.String

对此解决方案或解决方法的任何帮助将不胜感激。能够调用List而不是创建各种变量对我来说要容易得多。

1 个答案:

答案 0 :(得分:0)

我相信您可以将.toString()添加到您的表达式中,例如:

`${__BeanShell(${allPositiveAffects}.get(1).toString())}`

顺便说一下,Beanshell有一些性能开销,所以我宁愿建议通过JSON Path Extractor JMeter Plugins包获得Extras with Libs Set,它应该更方便,更少消耗资源。

请参阅Using the XPath Extractor in JMeter(向下滚动到“解析JSON”)以获取安装说明和一些JSON Path语言参考示例。