Как передать переменную из одной группы потоков в другую в JMeter - PullRequest
50 голосов
/ 02 апреля 2009

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

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

Ответы [ 9 ]

68 голосов
/ 02 апреля 2009

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

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

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

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

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

${__property(storeid)}

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

13 голосов
/ 17 мая 2013

Согласно документации 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 PostProcessor и настроена моя переменная

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

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

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

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

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

Внимание

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

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

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

Information about project structure

9 голосов
/ 12 августа 2015

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

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

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)}
8 голосов
/ 13 октября 2012

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

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

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

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

4 голосов
/ 11 сентября 2012

Ну, это один из способов сделать это; следуйте этим шагам, и он будет работать, позже вы сможете настроить его под свои нужды! Переменные не разделяются между потоками (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 голосов
/ 02 апреля 2009

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

Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
1 голос
/ 06 января 2015

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

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

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

Привет.

1 голос
/ 22 октября 2013

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

0 голосов
/ 01 июня 2018

JMeter Bean Shell Assertion

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

группа потоков >> Добавить >> Утверждения >> Утверждение 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

...