Как передать переменную из одной группы потоков в другую в JMeter
у меня есть тест JMeter с 2 группами потоков - первый-один поток (который создает некоторый инвентарь), а второй-несколько потоков (которые покупают весь инвентарь). Я использую утверждения BeanShell и экстракторы XPath для анализа возвращаемого значения (которое является XML) и хранения переменных (таких как идентификаторы приобретаемых элементов).
но, значения, которые создаются в первой группе потоков, извлекаются ли в standard ${jmeter}
тип переменных, или ${__BeanShell(vars.get("jmeter"))}
тип vars, недоступны во второй группе потоков. Есть ли способ создать переменную в первой группе потоков и сделать ее видимой для второй?
9 ответов
Я не смог сделать это с переменными (так как они являются локальными для отдельных потоков). Тем не менее, я смог решить эту проблему со свойствами!
опять же, моя первая ThreadGroup выполняет всю настройку, и мне нужна некоторая информация из этой работы, чтобы быть доступной для каждого из потоков во второй ThreadGroup. У меня есть утверждение BeanShell в первой ThreadGroup со следующим:
${__setProperty(storeid, ${storeid})};
${storeid} был извлечен с помощью экстрактора XPath. Этот Утверждение BeanShell делает другие вещи, такие как проверка того, что storeid был возвращен из предыдущего вызова и т. д.
во всяком случае, во второй группе потоков я могу использовать значение свойства "storeid" в Сэмплерах со следующим:
${__property(storeid)}
работает как шарм!
согласно документации JMeter:
16.12 совместное использование переменных между потоками и группами потоков
переменные локальны для потока переменной в одном потоке не может быть прочитан в другой. Это по замыслу. Для переменных, которые могут быть определены перед началом теста см. раздел параметризация тестов (выше). Если значение не известно, пока не начнется тест, есть различные варианты:
- сохранить переменную как свойство - свойства являются глобальными для Экземпляр в JMeter
- запись переменных в файл и их повторное чтение.
- используйте bsh.общее пространство имен - см. 16.8.2 Разделяя Переменные
- напишите свои собственные классы Java
другой способ передать переменную между потоками-использовать JMeter-plugins как упоминается Андреем Боталовым ниже.
но я обнаружил, что это немного запутанно использовать его первый раз, но он дает полный контроль над переменной во время перехода от потока к потоку. Следуйте моему примеру с использованием BeanShell, и вы увидите, как это просто:
Далее ссылаемся на разделы на картинке ниже:
(1.1) здесь я создал пользовательскую переменную в пользовательских переменных (или вы можете сделать это с помощью BSF Proccessor - disabled в этом примере (1.2))
(2.1)(2.4)я успешно использовал переменную в первом потоке - ничего особенного :)
(2.2)добавлен постпроцессор BeanShell и настроена моя переменная
(2.3)добавил его в очередь
(3.1) во втором потоке - переменная берется из очереди - с любым именем вы хотите. Но будьте осторожны, используйте мудро тайм-аут, потому что этот поток будет ждать до предыдущего завершения, чтобы он мог получить измененную переменную (эксперимент с некоторым длинным ответом)
(3.2)(3.3)(3,4)что повторяется процедура использования и изменения переменной
(3.5) переменной посылается еще раз в новой очереди - так дайте ему новое имя
(4.1)(4.2)(4.3) схватил измененную переменную из новой очереди работает как charm
предупреждение
Если вы добавляете больше потоков, добавьте некоторый счетчик в группу потоков с переменной и добавьте это имя переменной в имя очереди-сделайте то же самое в группе потоков, где вы пытаетесь поймать очередь, чтобы очередь имела уникальное имя для каждого потока (напишите комментарий, если вам нужно более четкое explenation)
Если у вас есть более одного http-запроса в одной группе потоков, добавьте процессор передачи потоков в качестве дочернего элемента последнего (или другого, если вы хотите достичь какой-то пользовательской вещи) http-запроса
играть, изменять, настраивать, чтобы получить лучший результат :) добавление большего количества потоков может привести к нежелательному поведению, поэтому вам нужно быть бдительным.
JMeter Плагины имеет Связь Между Потоками для этой цели.
есть 2 метода его использования:
- Постпроцессор/Препроцессора
- функции
__fifoPut
и__fifoPop
на мой взгляд, постпроцессор / препроцессор проще в использовании.
Я нашел, что я считаю самым простым способом сделать это.
использовать
Bean Shell PostProcessor
для установки переменной (http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables)
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");
или если Вы читаете из переменной
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));
а затем из другой группы потоков прочитайте его через (http://jmeter.apache.org/usermanual/functions.html#__property)
${__property(PC_CREATED_PROMO_CODE)}
Это невозможно в JMeter, потому что это не нормальное поведение клиента (совместное использование параметров между потоками). Вместо этого используйте одну группу потоков с контроллерами:
Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
Ну, это один из способов сделать это; следуйте этим шагам, и он будет работать, позже вы можете настроить его под свои нужды! Переменные не являются общими для потоков (JMeter называет это функцией, вероятно :)). Но недвижимость есть! Поэтому установите переменную как свойство так:
1) Нажмите testplan и включите "запустить группы потоков последовательно" -> это делает группы потоков работать упорядоченно, а не случайным образом. (вы можете позже настроить его, но пока, чтобы заставить его работать..)
2) создать например, threadgroup называется "setup"; в этой группе потоков добавьте образец BeanShell со следующим кодом:
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");
Итак, теперь свойство установлено! Если значение, которое вы хотите сохранить как свойство, является переменной allready (например, пользовательская переменная или переменная reqex), вы можете сделать:
JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));
3) Добавить фактическое испытание testgroupбыл '' например с число потоков превышает 1; добавьте тест и к этому тесту добавьте препроцессор BeanShell со следующим код:
import org.apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));
Итак, теперь вы создали переменную в этом потоке под названием theNameOfYourNewProperty, которая имеет значение вашего системного свойства theNameOfYourNewProperty. В вашем тесте теперь вы можете получить к нему доступ, как:
${theNameOfYourNewProperty}
и он будет работать для каждого потока, а не только для первого потока..
позволь дать теме вторую жизнь :) еще один способ передачи переменных между потоками чтения и записи в файл. передача переменных между потоками
другое решение-использовать простой сервер таблиц для управления набором данных. Эта функция была добавить Плагины 1.2 JMeter.
" основная идея состоит в том, чтобы использовать крошечный http-сервер в плагинах JMeter для управления файлами набора данных с помощью простых команд get / добавить строки данных в файлах"
посмотрите документацию : http://jmeter-plugins.org/wiki/HttpSimpleTableServer/
с уважением.
просто добавьте утверждение оболочки bean используйте функцию свойства, чтобы присвоить значение переменной (например, глобальной переменной), которая будет удерживать значение даже после того, как она перейдет в другой поток.
группа потоков > > добавить > > утверждения > > утверждение оболочки Bean
${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}
а затем в другом потоке вы можете вызвать эту глобальную переменную и использовать ее
ниже приведена функция, которую необходимо использовать для вызова сохраненного значение:
${__property(global_variable_name)}
https://medium.com/@priyank.it/jmeter-passing-variables-between-threads-a4dc09903b59