it-swarm.com.ru

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

У меня есть тест JMeter с двумя группами потоков - первый - это один поток (который создает некоторый инвентарь), а второй - несколько потоков (которые приобретают весь инвентарь). Я использую BeanShell Assertions и XPath Extractor для анализа возвращаемого значения (которое является XML) и хранения переменных (таких как идентификаторы покупаемых предметов). 

Но значения, созданные в первой группе потоков, независимо от того, извлечены ли они в стандартные переменные типа ${jmeter} или vars типа ${__BeanShell(vars.get("jmeter"))}, недоступны во второй группе потоков. Есть ли способ создать переменную в первой группе потоков и сделать ее видимой для второй?

45
Todd R

Я не смог сделать это с переменными (так как они локальны для отдельных потоков). Однако мне удалось решить эту проблему с помощью свойств!

Опять же, моя первая ThreadGroup выполняет все настройки, и мне нужно, чтобы некоторая информация из этой работы была доступна каждому из потоков во второй ThreadGroup. У меня есть утверждение BeanShell в первой ThreadGroup со следующим:

${__setProperty(storeid, ${storeid})};

$ {Storeid} был извлечен с помощью XPath Extractor. BeanShell Assertion выполняет другие функции, такие как проверка того, что storeid был возвращен из предыдущего вызова, и т.д.

В любом случае, во второй ThreadGroup я могу использовать значение свойства storeid в Samplers со следующим:

${__property(storeid)}

Работает как шарм!

64
Todd R

Согласно документации JMeter: 

16.12 Совместное использование переменных между потоками и группами потоков 

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

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

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

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

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

(1.1) Здесь я создал пользовательскую переменную в пользовательских переменных (или вы можете сделать это с помощью BSF Proccessor - в этом примере отключен (1.2))

(2.1) (2.4) Я успешно использовал переменную в первом потоке - ничего особенного :)

(2.2) Добавлен BeanShell PostProcessor и настроена моя переменная

(2.3) Добавил его в очередь

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

(3.2) (3.3) (3,4) Это повторяет шаги использования и изменения переменной 

(3.5) Переменная отправляется еще раз в новой очереди - поэтому предоставьте ей новое имя

(4.1) (4.2) (4.3) Полученная измененная переменная из новой очереди работает как charm

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

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

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

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

Information about project structure

13
pbaranski

Я обнаружил, что считаю самым простым способом сделать это.

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

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)}
9
joviano dias

JMeter Plugins имеет Межпотоковая связь для этой цели.

Есть 2 способа использовать его:

  • Постпроцессор/препроцессор
  • Функции __fifoPut и __fifoPop

На мой взгляд, PostProcessor/PreProcessor проще в использовании.

8
Andrei Botalov

Это невозможно в JMeter, потому что это ненормальное поведение клиента (разделение параметров между потоками). Вместо этого используйте одну группу потоков с контроллерами:

Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
4
Mork0075

Ну, это один из способов сделать это; следуйте этим шагам, и это сработает, позже вы сможете настроить его под свои нужды! Переменные не разделяются между потоками (JMeter называет это функцией, вероятно, :)). Но свойства есть! Итак, установите вашу переменную как свойство:

1) Щелкните свой тестовый план и включите «Запускать группы потоков последовательно» -> это позволяет группам потоков работать упорядоченно, а не случайным образом. (Вы можете позже настроить его, но сейчас, чтобы заставить его работать ..)

2) например, создать группу потоков с именем 'setup'; в этой группе потоков добавьте BeanShell Sampler со следующим кодом:

import org.Apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");

Так что теперь свойство было установлено! Если значение, которое вы хотите сохранить в качестве свойства, уже является переменной (например, пользовательская переменная или переменная reqex), вы можете сделать:

JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));

3) добавить группу тестов «фактический тест», например, с количеством потоков больше 1; добавьте тест и к этому тесту добавьте препроцессор BeanShell со следующим кодом:

import org.Apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));

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

${theNameOfYourNewProperty}

И это будет работать для каждого потока, а не только для первого потока ..

4
Fico

Давайте дадим теме вторую жизнь :) Еще один способ передачи переменных между потоками - это запись/чтение в файл. Передача переменных между потоками

1
olyv

Другое решение состоит в том, чтобы использовать Simple Table Server для управления набором данных . Эта функция была добавлена ​​в 1,2 плагина JMeter.

«Основная идея состоит в том, чтобы использовать крошечный http-сервер в плагинах JMeter для управления файлами набора данных с помощью простых команд для get/add строк данных в файлах»

Посмотрите документацию: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

С уважением.

1
Vincent Daburon

JMeter Bean Shell Assertion

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

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

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

0
Vajjala Vinay Rao