Совместное использование значений cookie между группами потоков в JMeter - PullRequest
15 голосов
/ 22 марта 2012

У меня есть следующие настройки:

Thread A
  - Http Cookie Manager
  - Login Page
Thread B
  - Http Cookie Manager
  - Page to hit
  - Another page to hit

Я пытался получить файл cookie, установленный на странице входа в систему, в глобальное свойство, а затем установить его в диспетчере файлов cookie Http в потоке B. Однако я не смог сделать это правильно. Я пробовал BeanShell PostProcessors и тому подобное, но не смог правильно его настроить.

=== Добавить для уточнения ===

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

Ответы [ 8 ]

23 голосов
/ 22 марта 2012

Я должен был быть немного более ясным в своем вопросе, но мы исправили это. Вот наше решение:

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» и установите его = true.

Это позволит использовать файл cookie для входа в первый поток во втором потоке.

6 голосов
/ 13 апреля 2017

Ни одно из других решений здесь не сработало для меня, но все они имели некоторую часть решения. Вот что наконец-то сработало, чтобы передать куки (в моем случае 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
2 голосов
/ 06 ноября 2013

У меня тот же вариант использования, что и у вас, но я думаю, что есть более простое решение: внутри группы потоков вы можете использовать контроллер цикла.

Итак ...

Thread Group
   Login
   Loop Controller
     - Page to hit
     - Another page to hit

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

1 голос
/ 22 марта 2012

Почему бы не добавить Http Cookie Manager на уровень плана тестирования вместо одной группы потоков и сгруппировать все сэмплеры в одну группу потоков?

Test Plan
    Http Cookie Manager
    Thread Group
        - Login Page
        - Page to hit
        - Another page to hit

Это должно решить вашу проблему без каких-либо дополнительных сэмплеров.
Или, может быть, есть какие-то объективные причины для реализации того, что вы сделали?

... Пожалуйста, посмотрите на это тоже.

0 голосов
/ 28 июня 2017

Вместо того, чтобы иметь отдельную группу потоков для входа в систему, вы можете использовать одну группу потоков с Once Only Controller . Добавьте Samplers в Once Only Controller для входа в систему и получения файла cookie сеанса (который, конечно, будет запущен только один раз). С этого момента группа потоков будет просто запускать другие сэмплеры, передавая cookie-файл сеанса каждому запросу. Для этого у меня был HTTP Cookie Manager в плане тестирования .

0 голосов
/ 09 мая 2017

для более чем одного поля в 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);
0 голосов
/ 15 сентября 2016

CookieManager не делит куки между потоками. По какой-то причине метод @ ClarenceKlopfstein у меня не сработал (jmeter 3.0). По какой-то причине "${COOKIE_<INSERT ACTUAL COOKIE NAME>}", похоже, не оценивает пройденную строку.

Итак, вот еще одно решение для входа в систему, а затем передать файл 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);
0 голосов
/ 05 февраля 2014

Ответ выше действительно помог мне, но менеджер 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
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...