#groovy #jmeter #jsr223
#groovy #jmeter #jsr223
Вопрос:
Я пытаюсь использовать следующий код для проверки ответа a HTTP Request
, который вызывается из другого Thread Group
a Module Controller
.
File myfile = new File(FileServer.resolveBaseRelativeName("results/" filen "-report.xml"));
if(${__isVarDefined(vars.get("myvar"))} == true){
FileUtils.writeByteArrayToFile(myfile,bytes);
} else {
FileUtils.writeStringToFile(myfile, prev.getResponseDataAsString(), "UTF-8");
}
Empty xml
создается, когда myvar
переменная пуста, она не содержит данных ответа на запрос.
Ответ №1:
Вы можете записать byte[] в обоих случаях, используя getResponseData() (и удаленный вызов функции)
if(vars.get("myvar") ! null){
FileUtils.writeByteArrayToFile(myfile, bytes);
} else {
FileUtils.writeByteArrayToFile(myfile, prev.getResponseData());
}
Комментарии:
1.
prev.getResponseData()
кажется нулевым, но HTTP-запрос получил ответ.2. @plaidshirt у вас есть другой постпроцессор, который управляет результатом?
3. Я использую несколько экстракторов путей JSON для получения значений.
Ответ №2:
-
Вы не можете использовать
vars
сокращение для извлечения значений из другой группы потоков, поскольку переменные JMeter являются локальными для потока, следовательно, к ним нельзя получить доступ из другой группы потоков. Вместо этого вам нужно использоватьprops
. Смотрите документацию:Свойства не совпадают с переменными. Переменные являются локальными для потока; свойства являются общими для всех потоков, и на них необходимо ссылаться с помощью функции __P или __property.
-
Не вставляйте функции или переменные JMeter в скрипты Groovy, если вам нужно проверить, определена переменная или нет — попытайтесь получить ее и посмотреть, так ли это
null
:if (vars.get('myvar') != null) { //the code will be executed if the var is defined }
Ознакомьтесь с Transferring Data and Objects (like List, Maps, Array etc.) Between Samplers and Threads
главой шпаргалки Groovy Templates для JMeter для получения более подробной информации.
В абсолютном большинстве случаев проще использовать плагин для взаимодействия между потоками
Комментарии:
1. Переменная myvar присутствует в фактической группе потоков, предыдущая.getResponseDataAsString() должна поступать из другой.
2. Вам нужно сделать что-то вроде
props.put('response', prev.getResponseDataAsString())
в 1-й группе потоков иFileUtils.writeStringToFile(myfile, props.get('response'), 'UTF-8')
во 2-й группе потоков3. Я вижу, но в этом случае я сохраняю ответ в каждом случае в значении свойства, но в большинстве случаев я его не использую.