Jmeter как изменить переменную в BeanShell

#jmeter #beanshell

Вопрос:

У меня следующая ситуация с jmeter: у меня есть две группы потоков, и я хочу использовать переменную, извлеченную из ответа от первого, во второй поток. Что я делаю:

  1. переменная извлекается с помощью экстрактора путей JSON/YAML, а затем устанавливается как свойство с утверждением BeanShell ${__setProperty(id, ${id})};
  2. Затем во второй группе потоков у меня есть препроцессор BeanShell, в котором я пытаюсь изменить значение с помощью следующего сценария
     String ids2 = props.get("id");
    String ids3 = vars.put(${__intSum(2,-4)});
    String ids = vars.put(ids,"${__intSum(${ids2},${ids3})}");
 

В результате я получаю исключение в jmeter

 ava.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source) ~[?:1.8.0_221]
    at java.lang.Integer.parseInt(Unknown Source) ~[?:1.8.0_221]
    at java.lang.Integer.parseInt(Unknown Source) ~[?:1.8.0_221]
    at org.apache.jmeter.functions.IntSum.execute(IntSum.java:66) ~[ApacheJMeter_functions.jar:5.4.1]
    at org.apache.jmeter.engine.util.CompoundVariable.execute(CompoundVariable.java:138) ~[ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.engine.util.CompoundVariable.execute(CompoundVariable.java:113) ~[ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.testelement.property.FunctionProperty.getStringValue(FunctionProperty.java:91) ~[ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.testbeans.TestBeanHelper.unwrapProperty(TestBeanHelper.java:129) ~[ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.testbeans.TestBeanHelper.prepare(TestBeanHelper.java:84) ~[ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:202) ~[ApacheJMeter_core.jar:5.4.1]
    at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:382) ~[ApacheJMeter_core.jar:5.4.1]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_221]


 

Цель состоит в том, чтобы уменьшить переменную на 2, а затем перенести ее в другую переменную, которую я буду использовать только во второй группе потоков

Любая помощь будет высоко оценена

Комментарии:

1. Вы можете рассмотреть следующее: 1. Преобразуйте строку ids2 в число перед добавлением 2. vars.put() должен иметь два параметра key,value . И ключ, и значение должны быть строками 3. ids должны находиться в кавычках 4. Используйте компоненты JSR223 с Groovy

Ответ №1:

  1. Начиная с JMeter 3.1 рекомендуется использовать тестовые элементы JSR223 и язык Groovy для написания сценариев
  2. Ваш подход может работать для 1 потока, но если у вас будет > 1 поток, свойство будет перезаписано, если вы хотите, чтобы каждый поток (виртуальный пользователь) имел свое собственное значение, вам следует добавить текущий номер потока в качестве префикса или постфикса для свойства. Соответствующая функция __threadNum() или, если вы предпочитаете сценарии, вы можете вызвать ctx.getThreadNum() функцию
  3. В подавляющем большинстве случаев плагин межпроточной связи проще в использовании