Обработка ответа JMeter WebSocket Sampler - PullRequest
0 голосов
/ 11 сентября 2018

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

Я пытаюсь загрузить тестприложение WebSocket с использованием плагина JMeter « JMeter WebSocket Sampler ».

Мне нужно посоветовать, как мне следует обрабатывать сообщения, отправленные с сервера WebSocket.

Вот некоторые условия,

  1. После установления соединения с сервером WebSocket сервер отправляет сообщения JMeter в произвольные сроки.
  2. Когда JMeter получает сообщение, он должен вернуть сообщение, чтобы уведомить о получении сообщения..
  3. На основании содержимого сообщения с сервера JMeter должен изменить локальные переменные.

Вот мой текущий обзор конфигурации JMeter.

  1. Используйте Параллельный контроллер , чтобы разделить поток для получения сообщения и отправки сообщения.

  2. При получении цепочки сообщений я пытался использовать JSR223 Listner под пустым сэмплером WebSocket для написания JavaScript для обработки полученных данных.Сервер отправляет данные в формате JSON.

  3. При отправке цепочки сообщений я использую контроллер Loop, который будет ожидать изменения значения переменной при получении цепочки сообщений на основе сообщений сервера.

Например, когда сервер отправляет сообщение «Event_A_Notify» в JMeter, получая проверку потока сообщений и устанавливая переменную Event в «A».Затем поток сообщений отправит на сервер сообщение «Event_A_Received».

У меня возникла проблема с обработкой полученных сообщений.

В JSR223 Lisner я могу использовать sampleResult.getResponseDataAsString () метод для извлечения сообщений с сервера WebSocket в строковом формате.

Вот как выглядят данные.(Я изменил содержимое, чтобы оно выглядело просто. Фактическое содержимое сообщения больше с большим количеством свойств).

[Message 1]
{"Sample1":"A","uuid":"a5c77959-0284-40eb-9523-8706c947b620"}

[Message 2]
{"Sample2":"B","uuid":"93330fff-13fe-4040-9fe7-0e6d7054ee4a"}    

[Message 3]
{"Sample3":"C","uuid":"099cea81-6f8f-4417-b0c5-29199f42a6f3"}    

[Message 4]
{"Sample4":"D","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a1"}    

Когда полученное сообщение превышает 10, JMeter удаляет старое сообщение, чтобы сохранить 10 самых последних сообщений.

[Message 8]
{"Sample8":"H","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a1"} 

[Message 9]
{"Sample9":"I","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a2"} 

[Message 10]
{"Sample10":"J","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a3"} 

[Message 11]
{"Sample11":"K","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a4"} 

[Message 12]
{"Sample12":"L","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a5"} 

[Message 13]
{"Sample13":"M","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a6"} 

[Message 14]
{"Sample14":"N","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a7"} 

[Message 15]
{"Sample15":"O","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a8"} 

[Message 16]
{"Sample16":"P","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a508a9"} 

[Message 17]
{"Sample17":"Q","uuid":"01bf3c23-87cb-41cb-ab04-1a9613a50810"} 

Вот содержимое JSR223 Listner для обработки полученного сообщения.

В основном я делаю следующее.

  1. Использование sampleResult.getResponseDataAsString(); для получения ответа.
  2. Использование String (responseData) .split (/ [Message [0-9] +] /); и разбиение строки намассив сообщений путем удаления [Message \ d].
  3. Используйте объект массива messageArray для хранения всего ответа от сервера WebSocket.И обрабатывайте один за другим в цикле for.
var responseData = sampleResult.getResponseDataAsString();

var counter = parseInt(vars.get("counter1"));

var messageList = new String(responseData).split(/\[Message [0-9]+\]/);

messageList.shift();

var messageArray = vars.getObject("messageArray");

messageList.forEach(function(message, index) {
    if (messageArray.indexOf(message) >= 0) {
     return true;
  }
  else {
     messageArray.push(message);
  }
});

for (i = counter; i < messageArray.length; i++) {

    if (messageArray[i].match(/(someEvent).*/)) {
         vars.put("userVariable",true);
       counter += 1;
       break;
   }
   else {
          vars.put("userVariable",false);
      counter += 1;
   }
}

vars.put("counter1",counter);
vars.putObject("messageArray", messageArray);

Проблема с этим кодом:

  1. Поскольку объект messageArray хранит всесообщения, messageArray становится слишком большим, и JMeter в конечном итоге завершится сбоем из-за исключения OutOfMemory.
  2. Код для проверки того, существует ли полученное сообщение в messageArray, слишком медленный, и производительность снижается экспоненциально по мере увеличения количества хранимых сообщений.

Может ли кто-нибудь предложить более эффективный и умный способ обработки сообщений WebSocket в JMeter?

Я действительно ценю ваш вклад.

Спасибо,

С наилучшими пожеланиями,

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

После установления соединения с сервером WebSocket сервер отправляет сообщения JMeter в произвольные сроки.Когда JMeter получает сообщение, он должен вернуть сообщение, чтобы уведомить о получении сообщения.Основываясь на содержимом сообщений с сервера, JMeter должен модифицировать локальные переменные.

Это довольно просто сделать с помощью этого плагина: https://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/. Он предоставляет «сэмплер чтения», который вы можетеможно использовать для ожидания сообщения, затем извлечь из полученного сообщения все, что вам нужно, и использовать «запись сэмплера» для возврата сообщения на сервер.

0 голосов
/ 16 сентября 2018

Вот то, что я придумал.

В основном, вот что я решил сделать, и, похоже, теперь он работает намного лучше.

  1. Извлечение индекса и содержимого сообщения, затем присвойте паре ключ-значение объекта JavaScript.

  2. После обработки сообщения удалите индекс сообщения и его содержимое из объекта JavaScript.

  3. Переменная счетчика пользователя для отслеживания последнего обработанного индекса сообщения.

// Retrieve response data from websocket server
var responseData = sampleResult.getResponseDataAsString();

// Retrieve counter
var counter = parseInt(vars.get("counter"));


// Store index of message in to array meessageIndexArray
var re = new RegExp(/\[Message ([0-9]+)\]/g);
var messageIndex = []
var match;
while (match = re.exec(responseData)) {
   messageIndex.push(parseInt(match[1]));
}

// Get the message List and remove [Message \d] field and new line.
var messageList = new String(responseData).split(/\[Message [0-9]+\]/);
messageList.shift();

// If counter value is less than the minimum number of the messageIndex,
// set the counter to messageIndex[0]

if (counter < messageIndex[0]) {
   counter = messageIndex[0];
}

// Figure out the index of the counter value in the messageIndex
var counterIndex = messageIndex.indexOf(counter);


// Put all of the messages into messageObject object with messageIndex as a key and messageList as a value
var messageObject = vars.getObject("messageObject");

if (counterIndex != -1) {
  for (i = counterIndex; i < messageIndex.length; i ++) {
     messageObject[messageIndex[i]] = messageList[i];
  }

  // Iterate through messageObject properties to check message
  for (var prop in messageObject) {
      if (messageObject[prop].match(/(SomeValue).*/)) {
         vars.put("userVariable",value1);
            ..
          delete messageObject[prop];
          counter += 1;
          break;
          }
      else {
          vars.put("userVariable",value2);
          delete messageObject[prop];
          counter += 1;
      }
  }

}
vars.put("counter",counter);
vars.putObject("messageObject", messageObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...