Совместное использование значений cookie между группами потоков в JMeter
У меня есть следующая настройка:
Thread A
- Http Cookie Manager
- Login Page
Thread B
- Http Cookie Manager
- Page to hit
- Another page to hit
Я пытаюсь получить файл cookie, который установлен на странице входа в глобальное свойство, а затем установить его в Http Cookie Manager в Thread B. Однако я не смог понять это правильно. Я пробовал BeanShell PostProcessors и тому подобное, но не смог правильно настроить его.
=== Добавить для уточнения ===
Причина, по которой я не могу иметь страницу входа в систему и менеджер файлов cookie в Thread B, зависит от желаемого поведения. Цель состоит в том, чтобы войти в систему, получить файл cookie, а затем снова и снова нажимать кучу страниц. Это дает нам возможность войти в систему один раз, а затем имитировать множество обращений от этого пользователя. Поместив менеджера файлов cookie и запустив страницу в тот же поток, пользователь будет входить в систему, ударять кучу страниц один раз, а затем входить в систему и делать это снова.
Ответы
Ответ 1
Я должен был быть более ясным в своем вопросе, но мы это исправили. Вот наше решение:
Http Cookie Manager
Thread A - 1 Thread - 1 Loop Count
- Login Page
- BeanShell PostProcessor
- props.put("MyCookie","${COOKIE_<INSERT ACTUAL COOKIE NAME>}");
Thread B - 50 Threads - Infinite Loop Count
- BeanShell PreProcessor
- import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie("<INSERT ACTUAL COOKIE NAME>",props.get("MyCookie"),"<INSERT DOMAIN NAME>","<INSERT COOKIE PATH>",false,0);
manager.add(cookie);
- Page to hit
- Another page to hit, repeat as needed
Затем необходимо изменить конфигурацию для JMeter:
Откройте файл jmeter.properties и перейдите в строку "CookieManager.save.cookies = false" и сделайте it = true.
Это позволит использовать cookie входа в первом потоке во втором потоке.
Ответ 2
У меня такой же случай использования, как у вас, но я думаю, что есть более простое решение: внутри группы потоков вы можете использовать контроллер цикла.
Так...
Thread Group
Login
Loop Controller
- Page to hit
- Another page to hit
Тем не менее, я все еще собираюсь использовать трюк, который вы описываете, потому что я думаю, что мы захотим войти в систему один раз, а затем удалим несколько разных страниц в parrallel из разных групп потоков. Таким образом, мы сначала войдем в систему, а затем несколько разных групп потоков ударят по серверу одновременно. Таким образом, ваш трюк определенно полезен. Но для простых случаев контроллер цикла может это сделать, я думаю.
Ответ 3
Ни одно из других решений здесь не работало, но все они имели часть решения. Вот что, наконец, сработало, чтобы передать cookie (JSESSIONID, в моем случае) из одной группы потоков в другую. Примечание. Мне не нужно было устанавливать CookieManager.save.cookies
на что угодно.
Http Cookie Manager
Thread A - 1 Thread - 1 Loop Count
- Login Page
- BeanShell PostProcessor
- import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
import org.apache.jmeter.testelement.property.PropertyIterator;
import org.apache.jmeter.testelement.property.JMeterProperty;
CookieManager manager = ctx.getCurrentSampler().getCookieManager();
PropertyIterator iter = manager.getCookies().iterator();
while (iter.hasNext()) {
JMeterProperty prop = iter.next();
Cookie cookie = prop.getObjectValue();
if (cookie.getName().equals("JSESSIONID")) {
props.put("MySessionCookie", cookie);
break;
}
}
Thread B - 50 Threads - Infinite Loop Count
- BeanShell PreProcessor
- import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
manager.add(props.get("MySessionCookie"));
- Page to hit
- Another page to hit, repeat as needed
Ответ 4
Почему бы не добавить Http Cookie Manager на уровень плана тестирования вместо Thread Group one и сгруппировать все пробоотборники в одной группе потоков?
Test Plan
Http Cookie Manager
Thread Group
- Login Page
- Page to hit
- Another page to hit
Это должно решить вашу проблему без каких-либо других дополнительных пробоотборников.
Или, может быть, есть некоторые объективные причины для реализации того, как вы это сделали?
... Посмотрите на это тоже.
Ответ 5
Ответ выше действительно помог мне, но менеджер файлов cookie HTTP не хватало деталей, которые я должен был заставить работать. Установив менеджер файлов cookie, как показано ниже, он работал для меня
Http Cookie Manager
NAME $<ACTUAL_COOKIE_NAME>
VALUE ${COOKIE_<INSERT_ACTUAL_COOKIE_NAME>}
DOMAIN ${SITE}
PATH /
Thread A - 1 Thread - 1 Loop Count
....
Thread B - 50 Threads - Infinite Loop Count
....
Ответ 6
CookieManager
не CookieManager
файлы cookie между потоками. По какой-то причине метод @ClarenceKlopfstein не работал для меня (jmeter 3.0). По какой-то причине "${COOKIE_<INSERT ACTUAL COOKIE NAME>}"
, похоже, не оценил переданную строку.
Итак, вот еще одно решение для входа в систему, а затем передать .ASPXAUTH
cookie .ASPXAUTH
. Он должен работать без каких-либо изменений конфигурации: в setUp Thread Group
(важно):
BeanShell PostProcessor:
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = ctx.getCurrentSampler().getCookieManager();
Cookie cookie = manager.get(3); //Find the '.ASPXAUTH' cookie
log.info("Cookie:" + cookie);
props.put("MyCookie",cookie.getValue());
Затем в обычной группе потоков:
BeanShell PreProcessor:
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie(".ASPXAUTH",props.get("MyCookie"),"<DOMAIN>","/",false,0);
manager.add(cookie);
Ответ 7
Вместо того, чтобы иметь отдельную группу потоков для входа в систему, вы можете использовать одну группу потоков с контроллером Once Only. Добавьте Samplers под контроллером Once Only для входа в систему и получения файла cookie сеанса (который, конечно же, будет запускаться только один раз). С этого момента группа потоков будет запускать другие пробоотборники, передающие cookie сеанса, каждому запросу. Для этого у меня был диспетчер файлов cookie HTTP в области Test Plan.
Ответ 8
для более чем одного поля в cookie я пробовал эту работу
BeanShell Post Processor
props.put("MyCookie","${COOKIE_<FIRST FIELD>}");
props.put("MyCookie1","${COOKIE_<SECOND FIELD>}");
BeanShell Pre Processor
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();
Cookie cookie = new Cookie("<FIRST FIELD>",props.get("MyCookie"),"DOMAIN","/",false,0);
manager.add(cookie);
Cookie cookie1 = new Cookie("<SECOND FIELD>",props.get("MyCookie1"),"DOMAIN NAME","/",false,0);
manager.add(cookie1);