Нагрузочное тестирование приложений на wicket движке

Часть 1. Записываем сценарий в jMeter

Самый простой способ записать сценарий обращения к серверу приложений при работе пользователя - это отловить все запросы идущие от браузера. В этом нам поможет элемент HTTP-Proxy Server:

Настраиваем HTTP-Proxy Server

  1. Добавляем новую группу в Test Plan - туда будут помещаться запросы к серверу
  2. Добавляем HTTP-Proxy Server
  3. Настраиваем HTTP-Proxy Server:
    • Выбираем созданный Thread Group в Target Controller
    • В Grouping выбираем "Add separators between groups" для того чтобы запросы друг от друга отделялись элементом "----------".
    • Добавляем в URL Paterns паттерны для отсеивания картинок, скриптов и стилей (.*\.jpg, .*\.gif, .*\.png, .*\.js, .*\.css)

    Proxy settings
  4. Жмем кнопку Start
  5. Теперь настраиваем браузер. Например в firefox в меню Инструменты > Настройки > Дополнительно > Сеть > Настроить проставляем HTTP прокси localhost и порт 8080

После этого все запросы с браузера будут записываться в jMeter.

Настраиваем сценарий

Для того, чтобы сервер понял, что все запросы на самом деле поступают от одного и того же пользователя, необходимо включить cookie. Сервер запишет в них ID сессии по которой дальше и будет определять, от кого идут запросы. Для этого надо добавить Cookie Manager (Add > Config Element > HTTP Cookie manager) перед выполнением всех запросов. Чтобы куки очищались при каждом запуске не забудьте включить опцию "Clear cookies each iteration".

После этого можно размещать запросы страниц. 

Отправка заполненных форм

Запуск записанного сценария скорее всего приведет к неудаче. Причина проста - в формах и в ссылках wicket генерирует уникальные сслыки. Как можно решить эту проблему рассмотрим на примере формы входа в систему.

Изначально заполненная форма отправляется на длинный адрес следующего вида:

...
<form action="?wicket:interface=:0:signInForm::IFormSubmitListener::"
id="signInForm1" method="post">
...

Где signInForm - это wicket:id нашей формочки, а все остальное формируется динамически библиотекой wicket.

Для того, чтобы jMeter мог определить на какую страницу ему посылать логин с паролем, нам нужно к запросу страницы login добавить обработчик Regular Expression Extector (Add > Post Processors > Regular Expression Extector). Он должен просмотреть полученный от сервера html и найти там нашу ссылку. Исходя из названия, обработчик осуществляет поиск на основе регулярных выражений. В нашем случае в качестве поиского выражения нужно использовать конструкцию вида

"([^"]+:signInForm:[^"]+?)"

где signInForm - это wicket-id формы.

Кроме выражения в настройках Regular Expression Extector нужно указать имя переменной и шаблон (Template). В нашем случае нам нужно выбрать все что находится в кавычках — а это первая группа в регулярном выражении. Соответственно шаблон будет выглядеть как $1$. Кроме этого можно указать какое найденное выражение следует использовать (Match No).

Regex extactor

Теперь мы может отсылать post-запрос добавив в Path нашу переменную (Например /login${loginFormUrl}).

Переход по ссылкам

После того, как мы залогинились, можно и по сайту побродить. Но wicket формирует ссылки динамически! Отследить сслыку нам поможет все тот же Regular Expression Extector. При этом следует помнить два нюанса:

  1. В регулярном выражении лучше всего использовать wicket-id элемента вместе со всеми wicket-id родительских элементов. Например, если элемент tabs размещается внутри tabbed_panel, то ссылка этого элемента будет вида
    "([^"]+tabbed_panel:tabs:[^"]+?)"
  2. Списки (ListView) генерирует для элементов идентификаторы в виде порядкого номера. Этим можно воспользоваться для перехода на произвольный элемент списка, задав в параметре Match No — 0, а в качестве регулярного выражения — выражение, содержащее идентификатор списка (без конкретного номера).

Задержки

HTTP-Proxy записывает сценарий без учета задержек пользователя на освоение информации и ввод данных. Для эмуляции этих действий можно задействовать элемент "задержка" (Timer). Так как, для разных пользователей время "задержки" будет разным - то имеет смысл добавить элемент Gaussian Random Timer (Add > Timer > Gaussian Random Timer). Он позволяет задать среднее время задержки и разброс.

Сохранение результата запроса

Иногда бывает полезно проверить, что возвращает сервер в результате того или иного запроса. Сделать это можно при помощи элемента Save Responses to a file (Add > Post Processors > Save Responses to a file), При этом, если у запроса включена опция Follow Redirects, то jMeter сохранит все ответы сервера добавляя к указанному префиксу номер ответа.

Еще почитать про jMeter

  1. Официальный мануал
  2. Wicket and JMeter with Regular Expressions
  3. Набор tutorial для jMeter