2016-08-12 2 views
1

У меня есть BeanShellPostProcessor, который начинается с:JMeter BeanShell постпроцессор Попытки обработать строку как байт []

result = ctx.getPreviousResult(); 
String data = result.getResponseDataAsString(); 

На второй петле LoopController, это даст это в журнале:

ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: set Variable assignment: data: Can't assign byte [] to java.lang.String 
WARN - jmeter.extractor.BeanShellPostProcessor: Problem in BeanShell script org.apache.jorphan.util.JMeterException: Error invoking bsh method: set Variable assignment: data: Can't assign byte [] to java.lang.String 

Однако, если я удалить String декларацию, я не получаю предупреждение (поэтому использование этого работать вокруг) ... т.е. неоднозначной о типе):

data = result.getResponseDataAsString(); 

Если я печатаю result.getResponseDataAsString().getClass().getName() до этой строки, я получаю java.lang.String.

Невероятно новый для BeanShell использование в JMeter, но довольно уверенно, что проблема в линии.

В то же время, если у меня есть log.info заявления до назначения String data = ..., они не будут печатать на второй итерации цикла, что заставляет меня подвергнуть сомнению эту оценку.

Как я могу понять/исправить попытку byte[]?

Для справки: вот мой тест план:

enter image description here

В принципе, каждый пробоотборник использует result.getResponseDataAsString(), чтобы получить тело ответа, делает некоторые манипуляции «нормализовать», а затем устанавливает значение через vars.put(). BeanShell Assertion использует vars.get() для извлечения двух значений, сравнивает их и наборы FailureMessage и Failure соответственно.

Примечание: оба варианта PostProcessor имеют такую ​​же проблему.

Примечание 2: String data = new String(result.getResponseData()); одинаково проблематично (то есть та же ошибка) ... не то, что я бы никогда не выступает за создание String из byte[] без явного кодирования/о кодировке.

+2

Я пробовал ваш код и не получал никаких ошибок. Хотя для этого вам не нужен 'ctx', вы можете напрямую использовать' prev.getResponseDataAsString() '. Итак, либо ваш ответ действительно двоичный, либо ... Попробуйте это: создайте сэмплер BeanShell с кодом: 'SampleResult.setResponseData (« Hello »);' и поместите ваш постпроцессор под этот пробоотборник. Возвращает ли она ту же ошибку? Если нет, это означает определенно что-то с вашими конкретными данными. Если да, вам нужно посмотреть на свою среду ... –

+0

Спасибо за подсказку на 'prev'. Кроме того, я использовал вашу идею сэмплера BeanShell, чтобы построить небольшой .JMX, упомянутый в моем ответе. Вы помогли мне открыть мою собственную ошибку. –

ответ

2

Я создал небольшой .jmx и успешно воссоздал проблему.

Я разыскал к определенной строке в JMeter кодексе (JMeter 3.0, org.apache.jmeter.extractor.BeanShellPostProcessor:63:.

bshInterpreter.set("data", prev.getResponseData());//$NON-NLS-1$ 

Это наконечники меня ... Я с вар именем data в вышеприведенном постпроцессоре

снова Посмотрел @ JMeter UI и ... конечно же, data является предопределенным вар скрипт, напечатал (в строке выше) в качестве byte[].

я буду считать, что BeanShell управлял byte[] <--> String литье, когда мой var не был объявлен String. При строгом объявлении String возникла путаница.

решаемые переименовывать мой сценарий вар к:

String localResponseData = result.getResponseDataAsString(); 

урок: не называйте переменные Bean Shell, как data (или любой другой предопределенный один)!

+0

Woow, great find :) Я потратил 30 минут, пытаясь понять, почему моя задача JMeter post process не может использовать имя переменной данных. – Boris

+1

Конечно, мы могли бы сэкономить себе массу неприятностей, обратив внимание на список определенных имен переменных в пользовательском интерфейсе: - \ –