Как мне передать переменную из одной группы потоков в другую в JMeter

StackOverflow https://stackoverflow.com/questions/707832

Вопрос

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

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

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

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

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

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

(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) Извлеченная измененная переменная из новой очереди работает как шарм

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

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

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

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

Information about project structure

Я нашел, который, на мой взгляд, является самым простым способом сделать это.

Использование

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/

С уважением.

JMeter Bean Shell Assertion

Просто добавьте утверждение оболочки компонента используйте функцию свойства, чтобы присвоить значение переменной (например, глобальной переменной), которая будет хранить значение даже после того, как оно перейдет в другой поток.

группа потоков >> Добавить >> Утверждения >> Утверждение оболочки компонента

${__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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top