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]()
Ответ 3
в препроцессоре Beanshell используйте приведенный ниже код
import org.apache.jmeter.protocol.http.control.Header;
. Sampler.getHeaderManager() удалить (0);
для более подробной информации: -
https://jmeterblogb.blogspot.in/2016/10/add-empty-header-in-jmeter-sample.html