Невозможно вызвать объект из списка, расположенного во внешнем скрипте BeanShell [Jmeter]

Моя конечная цель - получить строку из списка, который создается динамически из ответа 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 оказалась не такой простой задачей, как вызов allPositiveAffects.get(n), как я могу, в моем сценарии BeanShell.

Я не придумал простого способа получить содержимое списков. Я что-то упускаю? Я пробовал несколько разных вещей в своем 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

Любая помощь в решении или обходном пути будет принята с благодарностью. Для меня было бы намного проще иметь возможность вызывать список вместо создания различных переменных.


person Boz    schedule 09.06.2015    source источник


Ответы (1)


Я считаю, что вы могли бы просто добавить .toString() к своему выражению, например:

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

Кстати, у Beanshell есть некоторые накладные расходы на производительность, поэтому я бы предпочел использовать JSON Path Extractor, который доступен через Extras with Libs Set пакета JMeter Plugins, он должен быть более удобным и менее ресурсоемким потребляющий.

См. Использование экстрактора XPath в JMeter (прокрутите вниз до «Анализ JSON» ) для инструкций по установке и некоторых справочных примеров на языке JSON Path.

person Dmitri T    schedule 10.06.2015
comment
Спасибо за предложение, к сожалению, ${__BeanShell(${allPositiveAffects}.get(1).toString())} по-прежнему выдает ClassCastException ошибку. Я использовал JSON Path Extractor, о котором вы упомянули, но у меня есть довольно сложные фильтры для некоторых вызовов, для которых требуется BeanShell. Я могу переключить более простые фильтры на плагин Extractor для повышения производительности. При попытке получить значение, созданное из массива, созданного с помощью экстрактора, я получаю и оцениваю ошибку. Caused by: In file: inline evaluation of: ["affect1"...] Encountered "[" at line 1, column 1. - person Boz; 10.06.2015
comment
Я потратил на это слишком много времени, но, думаю, меня смущает, почему, когда я вызываю allPositiveAffects.get(n) во внешнем скрипте BeanShell, он возвращает правильное значение, но не делает то же самое в HTTP-запросе с функцией BeanShell. Последней отчаянной попыткой было перебрать allPositiveAffects и добавить его в новый ArrayList: List positiveAffectsArray = new ArrayList(); for (String affect : allPositiveAffects){ positiveAffectsArray.add(affect); } Это возвращает ClassCastException: java.util.ArrayList cannot be cast to java.lang.String - person Boz; 10.06.2015
comment
Мне удалось обойти эту проблему, используя одно из других ваших предложений относительно общие переменные. Я определил bsh.shared.allPositiveAffects = allPositiveAffects , а затем сделал встроенный BeanShell ${__BeanShell(List allPositiveAffects = bsh.shared.allPositiveAffects; allPositiveAffects.get(${__Random(0,${positiveAffectCount})});)} - person Boz; 15.06.2015