Как передать переменную из одной группы потоков в другую в JMeter
У меня есть тест JMeter с двумя группами Thread - первый - это один поток (который создает некоторый инвентарь), а второй имеет несколько потоков (которые покупают все ресурсы). Я использую BeanShell Assertions и XPath Extractors для анализа возвращаемого значения (которое является XML) и хранения переменных (например, идентификаторов предметов, которые необходимо приобрести).
Но значения, созданные в первой группе потоков, независимо от того, извлечены ли они в стандартные переменные типа ${jmeter}
или ${__BeanShell(vars.get("jmeter"))}
типа vars, недоступны во второй группе потоков. Есть ли способ создать переменную в первой группе потоков и сделать ее видимой для второго?
Ответы
Ответ 1
Я не смог сделать это с помощью переменных (поскольку они локальны для отдельных потоков). Тем не менее, я смог решить эту проблему со свойствами!
Опять же, моя первая ThreadGroup выполняет всю настройку, и мне нужна некоторая информация из этой работы, которая будет доступна для каждого из потоков во второй ThreadGroup. У меня есть BeanShell Assertion в первой ThreadGroup со следующим:
${__setProperty(storeid, ${storeid})};
${storeid} был извлечен с помощью XPath Extractor. Утверждение BeanShell делает другие вещи, такие как проверка того, что storeid был возвращен из предыдущего вызова и т.д.
В любом случае во второй ThreadGroup я могу использовать значение свойства "storeid" в Samplers со следующим:
${__property(storeid)}
Работает как шарм!
Ответ 2
Согласно документации JMeter:
16.12 Обмен переменных между потоками и группами потоков
Переменные локальны для потока, переменная, заданная в одном потоке, не может быть прочитана в другой. Это по дизайну. Для переменных, которые можно определить перед началом теста см. раздел Параметрирование тестов (см. выше). Если значение неизвестно до начала теста, существуют различные варианты:
- Сохранить переменную как свойство - свойства глобальны для Экземпляр JMeter
- Записывать переменные в файл и перечитывать их.
- Используйте пространство имен bsh.shared - см. 16.8.2 Обмен переменными
- Напишите свои собственные классы Java
Другой способ передать переменную между потоками - использовать jmeter-plugins как упомянутый Андреем Боталовым ниже.
Но я обнаружил, что это немного запутанно использовать его в первый раз, но он дает полный контроль над переменной во время перехода от потока к потоку.
Следуйте моему примеру с использованием BeanShell, и вы увидите, насколько это просто:
Далее, ссылаясь на разделы на рисунке ниже:
(1.1) Здесь я создал пользовательскую переменную в User Defined Variables (или вы можете сделать это с BSF Proccessor - отключен в этом примере (1.2))
(2.1) (2.4) Я успешно использовал переменную в первой нити - ничего особенного:)
(2.2) Добавлен BeanShell PostProcessor и настроил мою переменную
(2.3) Добавлено в очередь
(3.1) Во втором потоке - переменная берется из очереди - с любым именем, которое вы хотите. Но будьте осторожны, используйте разумно Timeout, потому что этот поток будет ждать до предыдущего завершения, чтобы он мог получить измененную переменную (эксперимент с некоторым длинным ответом)
(3.2) (3.3) (3,4) Это повторяющиеся шаги использования и изменения переменной
(3.5) Переменная снова отправляется в новую очередь - так что дайте ей новое имя
(4.1) (4.2) (4.3) Захваченная измененная переменная из новой очереди работает как charm
Предупреждение
-
Если вы добавляете больше потоков, добавьте несколько счетчиков в группу потоков с переменной и добавьте это имя переменной в имя очереди - выполните то же самое в группе потоков, где вы пытаетесь поймать очередь, поэтому очередь будет иметь уникальное имя для каждого потока (напишите комментарий, если вам нужно более четкое объяснение)
-
Если у вас более одного HTTP-запроса в одной группе потоков, добавьте предварительный процессор потока связи в качестве дочернего элемента последнего (или другого, если вы хотите достичь некоторой пользовательской вещи). http-запрос
Воспроизведение, изменение, настройка, чтобы получить лучший результат:) Добавление большего количества потоков может привести к нежелательному поведению, поэтому вам нужно быть бдительными.
![Information about project structure]()
Ответ 3
Плагины JMeter Inter-Thread Communication для этой цели.
Есть два способа его использования:
- постпроцессор/препроцессор
- Функции
__fifoPut
и __fifoPop
По-моему, PostProcessor/PreProcessor проще в использовании.
Ответ 4
Это невозможно в JMeter, потому что это ненормальное поведение клиента (обмен параметрами между Threads). Вместо этого используйте одну группу потоков с контроллерами:
Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
Ответ 5
Я нашел, что, по-моему, самый простой способ сделать это.
Используйте
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)}
Ответ 6
Ну, это один из способов сделать это; выполните следующие действия, и он будет работать, позже вы сможете настроить его на свои нужды! Переменные не разделяются между потоками (JMeter называет эту функцию, вероятно,:)). Но свойства! Поэтому установите свою переменную как свойство так:
1) Нажмите на свой тестовый план и включите "Выполнять группы потоков последовательно" → это заставляет группы потоков работать упорядоченными, а не случайными. (вы можете позже настроить его, но теперь, чтобы заставить его работать.)
2) создать группу потоков, называемую "setup", например; в этой группе потоков добавьте пробоотборник BeanShell со следующим кодом:
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");
Итак, теперь свойство было установлено! Если значение, которое вы хотите сохранить как свойство, является переменной allready (например, переменной пользователя или переменной reqex), вы можете:
JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));
3) добавить тестовый групповой "фактический тест", например, с количеством потоков выше 1; добавьте тест и к этому тесту добавьте препроцессор BeanShell со следующим кодом:
import org.apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));
Итак, теперь вы создали переменную в этом потоке с именемNameOfYourNewProperty, которая имеет значение вашего системного свойства theNameOfYourNewProperty. В своем тесте вы можете получить доступ к нему, например:
${theNameOfYourNewProperty}
И он будет работать для каждого потока, а не только для первого потока.
Ответ 7
Давайте дадим тему второй жизни:) Еще один способ передачи переменных между потоками - писать/читать в файл. Передача переменных между потоками
Ответ 8
Другим решением является использование Simple Table Server для управления набором данных.
Эта функция добавила плагины JMeter 1.2.
"Основная идея - использовать крошечный http-сервер в JMeter-плагинах для управления файлами набора данных с помощью простых команд получить/ добавить строки данных в файлах
Посмотрите документацию:
http://jmeter-plugins.org/wiki/HttpSimpleTableServer/
С уважением.