JMeter Alter HTTP заголовки во время тестирования

Я пытаюсь проверить службу HTTP с помощью JMeter. HTTP-служба требует аутентификации через простой механизм маркера на предъявителя. Я пытаюсь действовать следующим образом:

  • Запрос аутентификации POST
  • Сохранить токен как переменную
  • Установить HTTP-заголовок авторизации для сохраненной переменной
  • Запросить защищенный ресурс (ы)
  • Оценить производительность

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

Проблема заключается в получении переменной в HTTP-заголовке. В "Header Manager" значение устанавливается следующим образом:

Header Manager Attempt

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

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

JMeter Nesting

Все тесты проходят, чтобы получить ограниченный ресурс, который терпит неудачу с 400, поскольку заголовок авторизации неверен.

Мне кажется, что я пропускаю что-то действительно очевидное и/или приближаюсь к этой проблеме неправильно.

Ответы

Ответ 1

Изменить в августе 2017 года:

  • Несмотря на то, что этот ответ прекрасен и принят автором, он слишком сложный и правильный ответ должен быть ниже, который намного проще и удобнее fooobar.com/questions/381584/....

Вы можете динамически построить свой заголовок авторизации, используя Beanshell PreProcessor следующим образом:

  • Добавить пустой HTTP Header Manager в качестве дочернего элемента вашего запроса, для которого требуется авторизация
  • Добавить Beanshell PreProcessor как дочерний объект того же запроса со следующим кодом:

    import org.apache.jmeter.protocol.http.control.Header;
    
    sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("BEARER")));
    

Это построит полностью динамический заголовок, используя переменную BEARER.

  • sampler является сокращением класса HTTPSamplerProxy, который предоставляет доступ к экземпляру родительского семплера
  • vars является экземпляром класса JMeterVariables, который позволяет читать и записывать доступ ко всем переменным JMeter, доступным в пределах текущего контекст (обычно текущая группа потоков)

См. Как использовать BeanShell: любимый встроенный компонент JMeter для более подробной информации о скриптах Beanshell и кулинарной книге Beanshell.

Ответ 2

Посмотреть это сообщение в форуме: http://www.jmeter-archive.org/Variables-in-HTTP-headers-td4579331.html

Вам нужно переместить свой логин под контроллером. В моем случае я использовал контроллер только один раз. Затем после контроллера вы можете добавить HTTP Header Manager с заголовком авторизации как "Bearer ${BEARER}", и он будет читать вашу переменную. Это лучше, чем другой ответ, потому что тогда вам не нужно дублировать PreProcessor BeanShell по каждому запросу. Мое дерево выглядело так:

Дерево JMeter