2016-02-18 2 views
0

В моем плане тестирования JMeter я пытаюсь записать все ошибки в журнал. Я использую BeanShell постпроцессор настроен следующим образомJMeter Thread Group, не попадающая в BeanShell PostProcessor

import org.apache.jmeter.services.FileServer; 

if (ResponseCode != null && ResponseCode.equals("200") == false) { 
Failure = true; 

// displays in Results Tree 
FailureMessage ="Creation of a new CAE record failed. Response code " + ResponseCode + "." ; 

// Static elements 
part1 = "Creation of a new record failed. Response code: "; 
part2 = ". Sorry!"; 

// Open File(s) 
FileOutputStream f = new FileOutputStream("d:\\error.csv", true); 
PrintStream p = new PrintStream(f); 

// Write data to file 
p.println(part1 + ResponseCode + part2); 

// Close File(s) 
p.close(); 
f.close(); 
} 

Я пытаюсь сделать простой тест, где запрос HTTP делает POST, который проходит в файле JSon из C: JMeter/тесты/где каталог больше не существует. (Скажем, кто-то случайно удаляет его ...)

Проблема заключается испытание остановки (см ниже) и никогда не добраться до BeanShell писать без ошибок в лог-файл. Мне нужно собрать все ответы об ошибках и только ответы об ошибках.

Я не уверен, как с этим справиться. Я читал Jmeter. BeanShell PostProcessor и другие, но они не затрагивают вопрос о том, что происходит, когда он не попадает в BeanShell.

Любая помощь приветствуется!

org.apache.jorphan.util.JMeterStopThreadException: End of sequence 
    at org.apache.jmeter.functions.FileToString.execute(FileToString.java:105) 
    at org.apache.jmeter.engine.util.CompoundVariable.execute(CompoundVariable.java:142) 
    at org.apache.jmeter.engine.util.CompoundVariable.execute(CompoundVariable.java:118) 
    at org.apache.jmeter.testelement.property.FunctionProperty.getStringValue(FunctionProperty.java:101) 
    at org.apache.jmeter.testelement.AbstractTestElement.getPropertyAsString(AbstractTestElement.java:274) 
    at org.apache.jmeter.config.Argument.getValue(Argument.java:146) 
    at org.apache.jmeter.protocol.http.util.HTTPArgument.getEncodedValue(HTTPArgument.java:236) 
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sendPostData(HTTPHC4Impl.java:1111) 
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.handleMethod(HTTPHC4Impl.java:453) 
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:329) 
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74) 
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146) 
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1135) 
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434) 
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.io.FileNotFoundException: File 'C:\JMeter\test\payloads\Request_1.json' does not exist 
    at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:299) 
    at org.apache.commons.io.FileUtils.readFileToString(FileUtils.java:1711) 
    at org.apache.commons.io.FileUtils.readFileToString(FileUtils.java:1734) 
    at org.apache.jmeter.functions.FileToString.execute(FileToString.java:102) 

РЕШЕНИЕ

На основе обратной связи Дмитрия, я перешел из Beanshell постпроцессор в Beanshell утверждения. После некоторой настройки я получил ее для работы там, где теперь она записывает только ошибки (ответ! = 200) в файл errors.csv. Вместо добавления файла из предыдущего прогона он перезаписывается при каждом прогоне, поэтому фиксируются только ошибки последнего запуска.

Если кто-то думает, что мое решение может быть улучшено, я буду рад получить обратную связь. Еще раз спасибо Кирилю и Дмитрию.

import org.apache.jmeter.services.FileServer; 

if (ResponseCode != null && ResponseCode.equals("200") == true) { 
    SampleResult.setResponseOK(); 
} 
    else if (!ResponseCode.equals ("200") == true) { 
    Failure = true; 
    FailureMessage ="Creation of a new record failed. Response code " + ResponseCode + "." ; // displays in Results Tree 
    print ("Creation of a new record failed: Response code " + ResponseCode + "."); // goes to stdout 
    log.warn("Creation of a new record failed: Response code " + ResponseCode); // this goes to the JMeter log file 

// Static elements or calculations 
    part1 = "Unable to generate a new record via POST. The response code is: \""; 
    part2 = "\". \n\n For response code = \'Non-HTTP ressponse\', verify the payload file still exists. \n For response code = 409, check the recordTypeId and recordGrpId combination for validity. \n For response code = 500, verify the database and its host server are reachable. "; 

// Open File(s) 
    FileOutputStream f = new FileOutputStream(FileServer.getFileServer().getBaseDir() + "\\error.csv"); 
    PrintStream p = new PrintStream(f); 

// Write data to file 
    p.println(part1 + ResponseCode + part2); 

// Close File(s) 
    p.close(); 
    f.close(); 
} 
+0

не имеет отношения к вашему вопросу, но 'ResponseCode.equals (" 200 ") == true': обычно статус 200 указывает на успех, и вам не нужно добавлять' == 'для booleans. Таким образом, maybeyou должен был иметь условие как '! ResponseCode.equals (" 200 ")' (т. Е. Ввести условие ошибки, если код возврата не 200)? –

+0

@KirilS. Благодарю. Я нашел и исправил это в своем коде после моей первоначальной публикации. Я хотел набрать «ResponseCode.equals (« 200 ») == false». Использует ли ваш «! ResponseCode.equals (« 200 ») == true' то же самое? – David

+0

'! ResponseCode.equals (" 200 ")' (без каких-либо ==) совпадает с 'ResponseCode.equals (" 200 ") == false' (' equals' возвращает логическое значение, оператор! Инвертирует его значение) –

ответ

1
  1. Есть нет ResponseCode, Failure и FailureMessage в Beanshell постпроцессор, не переключитесь на Beanshell Assertion вместо этого.
  2. Ваш пункт ResponseCode.equals("200") предполагает положительный ответ, ответы об ошибках, как правило, имеют коды ответов> 400

См How to Use BeanShell: JMeter's Favorite Built-in Component руководство для всесторонней информации о Beanshell сценариев в JMeter.

+0

Спасибо! Я приложил свой вопрос к решению благодаря вам. Я не знал о том, что вы заявили в № 1. Это все изменило. – David

0

Jmeter перезаписывает ваш файл error.csv вместо добавления к нему, потому что вы открываете его повторно при каждом вызове подтверждения. Попробуйте открыть его до и, например, в отдельном Beanshell Sampler в setup thread group:

file = new FileOutputStream("error.csv", true); 
bsh.shared.custom_log = new PrintStream(file) 

, а затем использовать его в Beanshell утверждение так, как:

if (ResponseCode.equals("200")==false) { 
    bsh.shared.custom_log.println(part1 + ResponseCode + part2); 
} 

BTV, AFAIK, вы не нужна эта часть вообще, потому что HTTP ответы с кодом 200 ОК по умолчанию:

if (ResponseCode != null && ResponseCode.equals("200") == true) { 
    SampleResult.setResponseOK(); 
} 

Я did't проверил код, поэтому могут быть опечатки, но очень похоже один работает для меня.

Доступ к общим значениям, доступным для Beanshell, осуществляется под блокировкой, поэтому остерегайтесь возможных проблем с производительностью, если вы их сильно пишете.С таким скриптом и довольно короткими строками (50-100 символов) i'v получил ~ 1 кбайт в секунду без существенного влияния на производительность jmeter.

Смежные вопросы