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

переменные локальны для потока переменной в одном потоке не может быть прочитан в другой. Это по замыслу. Для переменных, которые могут быть определены перед началом теста см. раздел параметризация тестов (выше). Если значение не известно, пока не начнется тест, есть различные варианты:

  1. сохранить переменную как свойство - свойства являются глобальными для Экземпляр в JMeter
  2. запись переменных в файл и их повторное чтение.
  3. используйте bsh.общее пространство имен - см. 16.8.2 Разделяя Переменные
  4. напишите свои собственные классы Java

другой способ передать переменную между потоками-использовать JMeter-plugins как упоминается Андреем Боталовым ниже.

но я обнаружил, что это немного запутанно использовать его первый раз, но он дает полный контроль над переменной во время перехода от потока к потоку. Следуйте моему примеру с использованием BeanShell, и вы увидите, как это просто:

Project stucture Далее ссылаемся на разделы на картинке ниже:

(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

предупреждение

  1. Если вы добавляете больше потоков, добавьте некоторый счетчик в группу потоков с переменной и добавьте это имя переменной в имя очереди-сделайте то же самое в группе потоков, где вы пытаетесь поймать очередь, чтобы очередь имела уникальное имя для каждого потока (напишите комментарий, если вам нужно более четкое explenation)

  2. Если у вас есть более одного http-запроса в одной группе потоков, добавьте процессор передачи потоков в качестве дочернего элемента последнего (или другого, если вы хотите достичь какой-то пользовательской вещи) http-запроса

играть, изменять, настраивать, чтобы получить лучший результат :) добавление большего количества потоков может привести к нежелательному поведению, поэтому вам нужно быть бдительным.

Information about project structure


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/

с уважением.


JMeter Bean Shell Assertion

просто добавьте утверждение оболочки 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