Перейти к содержимому

Фотография

Выполнить HTTP запрос один раз для всех юзеров


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 23 августа 2011 - 11:45

Дано:
Есть некий HTTP запрос, в респонсе которого есть некие данные, необходимые мне для другого запроса. Пример: Я создаю аккаунт (далее первая команда) - команда возврачает мне GUID, этот GUID мне надо использовать в команде редактирования аккаунта (далее вторая команда).

Вопрос:
Как реализовать в Jmeter выполнение этой первой команды один раз для всех юзеров, т. е. c полученым GUIDом работать всем юзерам в Thread Group? Мне надо получить перфоманс второй команды. Once Only Controller выполняет первую команду для каждого(!) юзера, и при нагрузке в 1000 юзеров я получаю 1000 лишних реквестов, что не есть хорошо.

Варианты, куда я копал:
Использовать 2 Thread Group: в первой - первая команда получает этот GUID, во второй уже непосредственно нагрузка. Проблемы: не могу передать GUID из одной Thread Group в другую, Thread Groups стартуют не последовательно.
ForEach Controller - название похожее на то что надо. Проблемы: желание сэкономить время взяло свое и я решил написать здесь, пока сам буду рассматривать этот контроллер.

С нетерпением жду ваших дельных советов, с меня как обычно ничего. Всем заранее благодарствую.
  • 0

#2 AxelM

AxelM

    Активный участник

  • Members
  • PipPip
  • 118 сообщений
  • ФИО:Зверев Дмитрий
  • Город:Санкт-Петербург


Отправлено 23 августа 2011 - 12:09

Дано:
Есть некий HTTP запрос, в респонсе которого есть некие данные, необходимые мне для другого запроса. Пример: Я создаю аккаунт (далее первая команда) - команда возврачает мне GUID, этот GUID мне надо использовать в команде редактирования аккаунта (далее вторая команда).

Вопрос:
Как реализовать в Jmeter выполнение этой первой команды один раз для всех юзеров, т. е. c полученым GUIDом работать всем юзерам в Thread Group? Мне надо получить перфоманс второй команды. Once Only Controller выполняет первую команду для каждого(!) юзера, и при нагрузке в 1000 юзеров я получаю 1000 лишних реквестов, что не есть хорошо.


Это точно не реализовать через один ThreadGroup?

Варианты, куда я копал:
Использовать 2 Thread Group: в первой - первая команда получает этот GUID, во второй уже непосредственно нагрузка. Проблемы: не могу передать GUID из одной Thread Group в другую, Thread Groups стартуют не последовательно.


Запускать тред-группы по порядку можно выставив в TestPlan флаг "Run ThreadGroup consecutively". Но используйте замечательные setUp и tearDown в Jmeter 2.5.
По поводу передачи параметров между тред-группами смотрите в сторону props.put и props.get, а также функции __P

Хотя можно сделать то, что Вы хотите, если я правильно понял, и через один ThreadGroup с использованием Throughput Controller (TotalExecutions = 1). Передавать параметры в одной ThreadGroup проще.
Прикрепленный файл  pic1.PNG   42,1К   62 Количество загрузок:
  • 0

#3 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 23 августа 2011 - 12:17

Это точно не реализовать через один ThreadGroup?

Понятия не имею. Я пока не придумал как, но я далеко не гуру Jmeter.

Запускать тред-группы по порядку можно выставив в TestPlan флаг "Run ThreadGroup consecutively". Но используйте замечательные setUp и tearDown в Jmeter 2.5.
По поводу передачи параметров между тредами смотрите в сторону props.put и props.get, а также функции __P

Если функция __P еще кажется знакомой, то props.put и props.get первый раз вижу. По каким словам гуглить? :)
  • 0

#4 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 23 августа 2011 - 12:34

Хотя можно сделать то, что Вы хотите, если я правильно понял, и через один ThreadGroup с использованием Throughput Controller (TotalExecutions = 1). Передавать параметры в одной ThreadGroup проще.
Прикрепленный файл  pic1.PNG   42,1К   62 Количество загрузок:


Большое спасибо, это действительно ближе к правде. Добалю, что галочку надо было снять в этом контролере Per user.
Осталась проблема запустить это последовательно. Как видно из скриншота, только 1 раз успела коректно отработать вторая команда
Прикрепленный файл  Untitled.png   41,05К   58 Количество загрузок:
  • 0

#5 AxelM

AxelM

    Активный участник

  • Members
  • PipPip
  • 118 сообщений
  • ФИО:Зверев Дмитрий
  • Город:Санкт-Петербург


Отправлено 23 августа 2011 - 12:35

Понятия не имею. Я пока не придумал как, но я далеко не гуру Jmeter.


Я выше в своем посте написал.

Если функция __P еще кажется знакомой, то props.put и props.get первый раз вижу. По каким словам гуглить? :)


Придется использовать BeanShell в одном треде
props.put("GUID", "G123ID");
И в другом:
GUID = props.get("GUID");
  • 0

#6 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 23 августа 2011 - 12:41

Я выше в своем посте написал.


Мы пишем практически одновременно. Я прочитал, что вы написали и ответил вам. Как запускать тестплан строго сверху вниз?
  • 0

#7 AxelM

AxelM

    Активный участник

  • Members
  • PipPip
  • 118 сообщений
  • ФИО:Зверев Дмитрий
  • Город:Санкт-Петербург


Отправлено 23 августа 2011 - 12:47


Хотя можно сделать то, что Вы хотите, если я правильно понял, и через один ThreadGroup с использованием Throughput Controller (TotalExecutions = 1). Передавать параметры в одной ThreadGroup проще.
Прикрепленный файл  pic1.PNG   42,1К   62 Количество загрузок:


Большое спасибо, это действительно ближе к правде. Добалю, что галочку надо было снять в этом контролере Per user.
Осталась проблема запустить это последовательно. Как видно из скриншота, только 1 раз успела коректно отработать вторая команда
Прикрепленный файл  Untitled.png   41,05К   58 Количество загрузок:


На вскидку:
после получения GUID выставить BeanShell Sampler, где написать vars.put("run","1");
основные тесты включить в If Controller, где укажите условие "${__V(run)}"=="1"
Тогда основные тесты не будут пытаться бежать раньше получения GUID
  • 0

#8 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 23 августа 2011 - 12:53

Тут проблема по-видимому уже в другом. При 100 юзерах, вторая команда выполняется тоже только 1 раз. То есть если в Throughput Controller стоит 1 и галочка Per User снята, команда выполняется только одним юзером и не отдает GUID другим.
  • 0

#9 AxelM

AxelM

    Активный участник

  • Members
  • PipPip
  • 118 сообщений
  • ФИО:Зверев Дмитрий
  • Город:Санкт-Петербург


Отправлено 23 августа 2011 - 13:06

Да, Вы правы. Проверил.
Таким образом, остается следующее:
* поочередное выполнение ThreadGroup
* в первой ThreadGroup вставить запрос на получение GUID
** записать его в переменную (props.put) через BeanShell Sampler
* во второй ThreadGroup получить GUID (props.get) через BeanShell Sampler
* запустить тесты с GUID
  • 0

#10 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 23 августа 2011 - 14:13

Позволю себе задать уже детский вопрос, опять-таки из-за экономии времени и надеясь на вашу благосклонность.

Регэксп постпроцессор возвращает мне GUID в переменной ${GUID}

Что надо написать в первом и втором BeanShell Sampler?

Первый:
props.put("GUID", ${guid});
Резалт:
props.put("GUID", 4c7ca3f8-4fde-4997-9a2e-a090fec4ea03);
Request Headers:
Отмечен красным, то есть зафейлился. GUID передается, дальше непонятно.

Второй:
GUID = props.get("GUID");
Отмечен синим. Но я не знаю что писать в скобках, и как потом использовать это во второй команде.
  • 0

#11 AxelM

AxelM

    Активный участник

  • Members
  • PipPip
  • 118 сообщений
  • ФИО:Зверев Дмитрий
  • Город:Санкт-Петербург


Отправлено 23 августа 2011 - 18:46

Позволю себе задать уже детский вопрос, опять-таки из-за экономии времени и надеясь на вашу благосклонность.

Регэксп постпроцессор возвращает мне GUID в переменной ${GUID}

Что надо написать в первом и втором BeanShell Sampler?

Первый:
props.put("GUID", ${guid});
Резалт:
props.put("GUID", 4c7ca3f8-4fde-4997-9a2e-a090fec4ea03);
Request Headers:
Отмечен красным, то есть зафейлился. GUID передается, дальше непонятно.

Второй:
GUID = props.get("GUID");
Отмечен синим. Но я не знаю что писать в скобках, и как потом использовать это во второй команде.


В аттаче я написал пример с использованием jmeter-plugins

Смотрим на View Results Tree
Debug Sampler в первой тред-группе: "JMeterProperties: GUID=4c7ca3f8-4fde-4997-9a2e-a090fec4ea03111"
Debug Sampler во втрой тред-группе: "JMeterProperties: GUID=4c7ca3f8-4fde-4997-9a2e-a090fec4ea03111"

Прикрепленные файлы


  • 1

#12 dinas

dinas

    Новый участник

  • Members
  • Pip
  • 52 сообщений
  • Город:Минск

Отправлено 13 сентября 2011 - 09:57

Я дичайше прошу прощения. Забыл сказать спасибо. Очень благодарю тебя, AxelM.
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных