Как мне передать переменную из одной группы потоков в другую в JMeter
Вопрос
У меня есть тест JMeter с 2 группами потоков - первая представляет собой один поток (который создает некоторый инвентарь), а вторая имеет несколько потоков (которые покупают весь инвентарь).Я использую утверждения BeanShell и экстракторы XPath для анализа возвращаемого значения (которое является XML) и сохранения переменных (таких как идентификаторы приобретаемых товаров).
Но значения, которые создаются в первой группе потоков, независимо от того, извлечены ли они в стандартную ${jmeter}
переменные типа, или ${__BeanShell(vars.get("jmeter"))}
переменные типа недоступны во второй группе потоков.Можно ли как-нибудь создать переменную в первой группе потоков и сделать ее видимой для второй?
Решение
Я не смог сделать это с помощью переменных (поскольку они являются локальными для отдельных потоков).Тем не менее, я смог решить эту проблему с помощью свойств!
Опять же, моя первая группа потоков выполняет всю настройку, и мне нужно, чтобы некоторая информация из этой работы была доступна каждому из потоков во второй группе потоков.У меня есть утверждение BeanShell в первой ThreadGroup со следующим:
${__setProperty(storeid, ${storeid})};
${storeid} был извлечен с помощью XPath Extractor.Утверждение BeanShell выполняет другие действия, например, проверяет, был ли storeid возвращен из предыдущего вызова, и т.д.
В любом случае, во второй ThreadGroup я могу использовать значение свойства "storeid" в Samplers со следующим:
${__property(storeid)}
Работает как шарм!
Другие советы
Согласно документации JMeter:
16.12 Совместное использование переменных между потоками и группами потоков
Переменные являются локальными для потока переменная, установленная в одном потоке, не может быть прочитана в другом.Это сделано специально.О переменных, которые можно определить перед началом теста см. раздел Параметризация тестов (выше).Если значение неизвестно до начала теста, существуют различные варианты:
- Хранить эту переменную в качестве свойства - свойства являются глобальными для Экземпляр в JMeter
- Запишите переменные в файл и перечитайте их.
- Используйте пространство имен bsh.shared - см. 16.8.2 Совместное использование Переменных
- Напишите свои собственные классы Java
Другой способ передачи переменной между потоками - использовать jmeter-plugins как упомянутый Андреем Боталовым ниже.
Но я обнаружил, что его использование в первый раз немного сбивает с толку, но он дает полный контроль над переменной при передаче из потока в поток.Следуйте моему примеру с использованием BeanShell, и вы увидите, насколько это просто:
Далее ссылка на разделы на рисунке ниже:
(1.1) Здесь я создал пользовательскую переменную в пользовательских переменных (или вы можете сделать это с помощью BSF Proccessor - отключен в этом примере (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) Извлеченная измененная переменная из новой очереди работает как шарм
Предупреждение
Если вы добавите больше потоков, затем добавьте некоторый счетчик в группу потоков с переменной и добавьте имя этой переменной к имени очереди - сделайте то же самое в группе потоков, где вы пытаетесь перехватить очередь, чтобы очередь имела уникальное имя для каждого потока (напишите комментарий, если вам нужно более четкое объяснение)
Если у вас есть более одного http-запроса в одной группе потоков, то добавьте препроцессор связи потоков в качестве дочернего элемента последнего (или другого, если вы хотите выполнить какую-то пользовательскую задачу) http-запроса
Играйте, модифицируйте, настраивайте для получения наилучшего результата :) Добавление дополнительных потоков может привести к нежелательному поведению, поэтому вам нужно быть осторожным.
Я нашел, который, на мой взгляд, является самым простым способом сделать это.
Использование
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 имеют Межпоточная коммуникация для этой цели.
Есть 2 способа его использования:
- Постпроцессор/ПреПроцессор
- Функции
__fifoPut
и__fifoPop
На мой взгляд, постпроцессор / препроцессор проще в использовании.
Это невозможно в JMeter, потому что это ненормальное поведение клиента (совместное использование параметров между потоками).Вместо этого используйте одну группу потоков с контроллерами:
Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
Что ж, это один из способов сделать это;следуйте этим шагам, и это сработает, позже вы сможете настроить это в соответствии с вашими потребностями!Переменные не являются общими для потоков (вероятно, JMeter называет это функцией :) ).Но свойства есть!Итак, установите вашу переменную как свойство вот так:
1) Щелкните свой тестовый план и включите "Запускать группы потоков последовательно" -> это позволяет группам потоков выполняться упорядоченно, а не случайным образом.(позже вы можете настроить это, но пока, чтобы заставить его работать ..)
2) создайте threadgroup под названием 'setup', например;в этой группе потоков добавьте пробоотборник BeanShell со следующим кодом:
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");
Итак, теперь свойство установлено!Если значение, которое вы хотите сохранить как свойство, является переменной allready (например, определяемой пользователем переменной или переменной reqex), вы можете сделать:
JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));
3) добавьте тестовую группу 'actual test', например, с количеством потоков, превышающим 1;добавьте тест и к этому тесту добавьте препроцессор BeanShell со следующим кодом:
import org.apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));
Итак, теперь вы создали переменную в этом потоке с именем theNameOfYourNewProperty, которая имеет значение вашего системного свойства theNameOfYourNewProperty.В вашем тесте теперь вы можете получить к нему доступ следующим образом:
${theNameOfYourNewProperty}
И это будет работать для каждого потока, а не только для первого потока..
Давайте дадим теме вторую жизнь :) Еще один способ передачи переменных между потоками - это запись / чтение в файл. Передача переменных между потоками
Другим решением является использование сервера Simple Table для управления набором данных.Эта функция заключалась в добавлении плагинов 1.2 JMeter.
"Основная идея состоит в том, чтобы использовать крошечный http - сервер в плагинах JMeter для управления файлами набора данных с помощью простых команд, чтобы получить / Добавить строки данных в файлах"
Посмотрите на документацию :http://jmeter-plugins.org/wiki/HttpSimpleTableServer/
С уважением.
Просто добавьте утверждение оболочки компонента используйте функцию свойства, чтобы присвоить значение переменной (например, глобальной переменной), которая будет хранить значение даже после того, как оно перейдет в другой поток.
группа потоков >> Добавить >> Утверждения >> Утверждение оболочки компонента
${__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