JMeter - почему только один контроллер работает более одного раза - PullRequest
9 голосов
/ 21 января 2011

Я добавил два запроса: один для входа в систему для сохранения идентификатора сеанса и другой запрос для проверки нагрузочного теста, для которого требуется идентификатор сеанса.

Я сделал запрос на вход в систему только один раз, добавив его в качестве дочернего для только один раз контроллера.

Но когда я проверяю это, добавляя около 100 или 200 потоков, логин также выполняется так много времени.Я хочу выполнить запрос на вход в систему только для начального потока.Является ли это возможным?Ниже я добавил иерархию тестов.

 ThreadGroup: 
 HTTP request default 
 HTTP cookie manager
     once only controller
 login HTTP request
 HTTP request for number of users 

Ответы [ 6 ]

29 голосов
/ 21 января 2011

Контроллер «ТОЛЬКО ОДИН РАЗ» работает не так, как вы думаете.

Он работает «только один раз» В РЕЗЬБЕ.Таким образом, если у вас 100 потоков, он будет работать 100 раз.

Если вы хотите, чтобы он выполнялся ОДИН РАЗ В ТЕСТЕ, выполните следующие действия:

Test Plan (Set thread groups to "run consecutively"
 - Cookie Manager
 - Thread Group A (1 thread, 1 loop)
 - - -  Login Logic
 - Thread Group B
 - - - Rest of test

Обратите внимание, если вам нужноразделите любые переменные между группами потоков A и B, вам нужно установить их как свойства.Переменные не могут быть общими для групп потоков, но свойства могут.Для этого вам понадобится функция свойств.

Функция __setProperty автоматически сохраняет значение в виде глобальной переменной.Самый простой способ инициировать __setProperty - создать сценарий Beanshell для POST-процессора в качестве дочернего элемента к сэмплеру, который создает файл cookie в THREAD A. Чтобы извлечь значение в THREAD B, добавьте функцию __property в качестве VALUE для параметра,нужно значение куки.

Сценарий Beanshell будет выглядеть примерно так:

props.put("COOKIENAME","COOKIEVALUE");   //creates a property "COOKIENAME" with value "COOKIEVALUE" 
print(props.get("COOKIENAME"));   //prints the value out to the console

Приведенный выше код всегда будет иметь одинаковое значение для COOKIENAME, но меньше, чем идея.Итак, нам нужно убедиться, что «COOKIEVALUE» является динамическим.Я бы порекомендовал поместить регулярное выражение POST-PROCESSOR для извлечения значения cookie, а затем передать его в скрипт beanshell.

Итак, наш план тестирования теперь выглядит следующим образом:

Test Plan (Set thread groups to "run consecutively"
 - Thread Group A (1 thread, 1 loop)
 - - -  Login Logic
 - - - - -  Regex to grab cookie, store as "regexCookie"
 - - - - -  Beanshell to set property
 - Thread Group B
 - - - Rest of test

А теперь наш скрипт-бинчелл выглядит так:

props.put("COOKIENAME",vars.get("regexCookie"));   //creates a property "COOKIENAME" with value from "regexCookie"
print(props.get("COOKIENAME"));   //prints the value out to the console

Ссылки на руководство пользователя:

4 голосов
/ 04 января 2016

В новых версиях JMeter вы можете добавить «группу потоков setUp», которая делает именно то, что вам нужно.

Специальный тип ThreadGroup, который можно использовать для выполнения действий перед тестированием. Поведение этих потоков точно такое же, как у обычного элемента Thread Group. Разница в том, что потоки такого типа выполняются до того, как тест переходит к выполнению обычных групп потоков.

http://jmeter.apache.org/usermanual/component_reference.html#setUp_Thread_Group

2 голосов
/ 21 января 2011

Вы можете поместить «HTTP-запрос на вход» в контроллер Once Only, а обычный «HTTP-запрос» - в контроллер Loop.Теперь вы можете настроить цикл на выполнение HTTP-запроса 100 или 200 раз.См .: jmeter.apache.org/usermanual/component_reference.html#Loop_Controller

Использование таймеров для создания более реалистичного теста.Скажем, вы хотите, чтобы 200 запросов происходили за 120 секунд, тогда вы можете сделать каждый запрос приостановленным на 120/200 секунд.Большинство таймеров работают с миллисекундами, поэтому вы можете сделать это число (120/200 * 1000) миллисекундами.См. Jmeter.apache.org/usermanual/component_reference.html#timers

Вы также можете создать отдельную группу потоков установки, в которой вы выполняете вход и выполняете 200 потоков в другой группе потоков.Проверьте эту статью: http://www.informit.com/guides/content.aspx?g=java&seqNum=520

Вся эта информация должна помочь вам в правильном направлении.Удачи!

0 голосов
/ 05 июня 2019
${__groovy(${__threadNum} == 1 && vars.getIteration() == 1)}
0 голосов
/ 20 февраля 2013

В Jmeter 2.9 для этого можно использовать «Один только контроллер» и «Контроллер цикла».

Это прекрасно!

Фрэнки

0 голосов
/ 15 августа 2012

Только после того, как контроллер работает так, как объяснил BlackGaff.

То, что вы пытаетесь сделать, кажется неправильным, так как это означает, что вы аутентифицируете своих 100 пользователей с тем же логином / паролем.

Но еслиВы все еще хотите это сделать, вы можете использовать setupThread с одним пользователем, это обычно полезно для некоторой задачи инициализации в тесте, но ни в коем случае не отвечает вашим требованиям, которые мне кажутся неправильными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...