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

Управление сеансом /cookie в Apache JMeter

У нас есть простой тест производительности в приложении.

  • Мы входим в систему
  • Поиск по некоторым критериям
  • повторяет поиск различных параметров.

Мы используем Jmeter для тестирования производительности. Нам нужно иметь несколько потоков для проверки этого масштабируемым образом.

Способ, которым мы в настоящее время располагаем, это:

-Test Plan
  - Thread Group
      - Cookie Manager
      - Login To application
      - Search on param 1
      - Search on param 2
  - results summary table
  - Summary report

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

Когда я запускаю для одного потока, он работает отлично и отлично работает. Когда я масштабирую его до нескольких потоков, как только начинается следующий поток, сеанс для последнего потока становится недействительным. Это приводит к сбоям для всех уже запущенных потоков из-за недавно созданного потока.

Я достиг этого результата с наблюдением:
1. Если я запускаю несколько потоков, только последний поток имеет действительные ответы в дереве итогового результата
2. Если я запускаю с 2 потоками с периодом нарастания в 10 секунд, что означает, что каждый поток получает время, чтобы закончить сам, то оба они успешно выполняются.

В соответствии с моим пониманием каждый поток регистрируется в приложении, а так как менеджер файлов cookie находится на уровне потока, значения будут поддерживаться для идентификатора сеанса для каждого потока соответственно? Но что вызывает переопределение значения идентификатора сеанса между потоками?

Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Скопировано из документации jmeter:

Последний элемент - HTTP Cookie Менеджер. Менеджер файлов cookie должен быть добавлен ко всем веб-тестам - иначе JMeter игнорирует файлы cookie. Добавив это на уровне группы Thread, мы убедитесь, что все HTTP-запросы будут использовать одни и те же файлы cookie.

Из главы "4.2.2 Логические контроллеры" в http://jmeter.apache.org/usermanual/test_plan.html.

EDIT. Я думаю, вы должны использовать http://jmeter.apache.org/usermanual/component_reference.html#Simple_Controller, чтобы группировать ваши запросы вместе с менеджером файлов cookie.

Ответ 2

Я думаю, что ответ Андрей не может помочь. Он цитирует, что каждый запрос будет использовать те же файлы cookie, но в соответствии с руководством jmeter:

Каждый поток JMeter имеет свою собственную область хранения файлов cookie.

Насколько я понимаю этот вопрос, вы хотите, чтобы каждый поток делил один и тот же файл cookie идентификатора сеанса. Поэтому мне кажется, что вам нужно иметь две группы потоков и выполнять их последовательно. Первая группа потоков (с единственным потоком, который выполняется только один раз) должна войти в систему и сохранить значение cookie сеанса в глобальном параметре (возможно, вам нужно использовать возможности jmeter scripting). Затем установите этот файл cookie в менеджере файлов cookie второй группы потоков.

Надеюсь, что это поможет.

Ответ 3

Попробуйте увеличить время нарастания. Я столкнулся с тем же вопросом, где время нарастания составляло около 1 секунды, тогда я увеличил его до 3 секунд на поток, и он прошел нормально.

Ответ 4

Попробуйте следующее:

Откройте пользовательские свойства, имеющиеся в папке bin JMeter

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

CookieManager.check.cookies=false

Сохраните его и запустите script. Я надеюсь, что это решит вашу проблему.

Ответ 5

Сначала измените свой код на:

jmeter.properties
CookieManager.save.cookies=true
CookieManager.name.prefix=mycookie_

Затем добавьте менеджер файлов cookie HTTP в ту же группу потоков, что и ваш java-пробоотборник.

Затем в вашем java-пробоотборнике добавьте:

JMeterVariables jmv = JMeterContextService.getContext().getVariables();
Iterator<Map.Entry<String,Object>> it = jmv.getIterator();
while(it.hasNext()){
    Map.Entry<String,Object> v = it.next();
    System.out.println("name: " + v.getKey() + " value: " + v.getValue());
}