Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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, и вы увидите, насколько это просто:

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

(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}

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

Ответ 8

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

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

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

С уважением.