Совместное использование значений 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);