Выполнить HTTP запрос один раз для всех юзеров
#1
Отправлено 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 - название похожее на то что надо. Проблемы: желание сэкономить время взяло свое и я решил написать здесь, пока сам буду рассматривать этот контроллер.
С нетерпением жду ваших дельных советов, с меня как обычно ничего. Всем заранее благодарствую.
#2
Отправлено 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 Количество загрузок:
#3
Отправлено 23 августа 2011 - 12:17
Понятия не имею. Я пока не придумал как, но я далеко не гуру Jmeter.Это точно не реализовать через один ThreadGroup?
Если функция __P еще кажется знакомой, то props.put и props.get первый раз вижу. По каким словам гуглить? :)Запускать тред-группы по порядку можно выставив в TestPlan флаг "Run ThreadGroup consecutively". Но используйте замечательные setUp и tearDown в Jmeter 2.5.
По поводу передачи параметров между тредами смотрите в сторону props.put и props.get, а также функции __P
#4
Отправлено 23 августа 2011 - 12:34
Хотя можно сделать то, что Вы хотите, если я правильно понял, и через один ThreadGroup с использованием Throughput Controller (TotalExecutions = 1). Передавать параметры в одной ThreadGroup проще.
pic1.PNG 42,1К 62 Количество загрузок:
Большое спасибо, это действительно ближе к правде. Добалю, что галочку надо было снять в этом контролере Per user.
Осталась проблема запустить это последовательно. Как видно из скриншота, только 1 раз успела коректно отработать вторая команда
Untitled.png 41,05К 58 Количество загрузок:
#5
Отправлено 23 августа 2011 - 12:35
Понятия не имею. Я пока не придумал как, но я далеко не гуру Jmeter.
Я выше в своем посте написал.
Если функция __P еще кажется знакомой, то props.put и props.get первый раз вижу. По каким словам гуглить? :)
Придется использовать BeanShell в одном треде
props.put("GUID", "G123ID");
И в другом:
GUID = props.get("GUID");
#6
Отправлено 23 августа 2011 - 12:41
Я выше в своем посте написал.
Мы пишем практически одновременно. Я прочитал, что вы написали и ответил вам. Как запускать тестплан строго сверху вниз?
#7
Отправлено 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
#8
Отправлено 23 августа 2011 - 12:53
#9
Отправлено 23 августа 2011 - 13:06
Таким образом, остается следующее:
* поочередное выполнение ThreadGroup
* в первой ThreadGroup вставить запрос на получение GUID
** записать его в переменную (props.put) через BeanShell Sampler
* во второй ThreadGroup получить GUID (props.get) через BeanShell Sampler
* запустить тесты с GUID
#10
Отправлено 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");
Отмечен синим. Но я не знаю что писать в скобках, и как потом использовать это во второй команде.
#11
Отправлено 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"
Прикрепленные файлы
#12
Отправлено 13 сентября 2011 - 09:57
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных