Интенсивность и профиль нагрузки

Чтобы после отправки комментария не возвращалось сообщение:

Вы комментируете слишком быстро. Попридержите коней.

Надо чтобы сценарии выполнялись с суммарной интенсивностью 1,5-2,5 сценария в минуту. То есть все виртуальные пользователи, должны создавать нагрузку соотвествующую 1,5-2,5 сценария в минуту.

В сценарии должно отправляться два комментария:

  1. Комментарий от незарегистрированного пользователя:
  2. Комментарий от зарегистрированного пользователя, одного:
    • Использовать только одного пользователя:
      • Выполнить аутентификацию через wordpress.com (учётные данные будут созданы)
      • Через twitter (необходимо зарегистрироваться самостоятельно)
      • Через Google (необходимо зарегистрироваться самостоятельно)
      • Через Facebook (необходимо зарегистрироваться самостоятельно)
    • Параметры пользователя загружать, используя также CSV Data Set Config с файлом из одной строки или переменные и файл свойств, описание способов смотри ниже.

Чтобы проверить, что интенсивность рассчитана верно. Можно ориентироваться на то, что каждую минуту должно появляться под тестовой страницей примерно 4 комментария (+/-).

У каждого учащегося своя тестовая страница и своё количество виртуальных пользователей.

Cookies

Важно перед каждой итерацией очищать cookies. Иначе единожды вошедший пользователь, например, через wordpress, так всегда и будет считаться вошедшим.

А нужно каждую итерацию выполнять одинаковый сценарий. То есть, выполнять аутентификацию снова и снова.

Параметры очистки Cookies задаются в конфигурационном элементе HTTP Cookie Manager:

Тексты комментариев

Вариант 1. Из википедии

Тексты комментариев можно подобрать самостоятельно, можно взять готовые из списка сформированного на основе пословиц и поговорок из русскоязычной википедии:

  • comments-1 (документ Excel, на данном сайте не разметить txt-файл, в JMeter нужно использовать txt-файл или csv-файл из одной колонки).

В файле тексты отсортированы в алфавитном порядке. Чтобы имитировать процесс отправки случайных комментариев из некоторого набора можно перемешать строки в файле случайным образом перед запуском тестирования. Например, используя текстовый редактор Sublime Text 2 или в Microsoft Office Excel (добавить колонку со случайным значением и отсортировать по ней).

sublime-text-2

excel

Если использовать в качестве текста комментария одинаковый текст, константу, то сервер примет комментарий, но не добавит его, вернёт ошибку.

Ошибка при отправке комментария
Обнаружен дубликат комментария. Кажется, вы уже сказали это!

Поэтому и используется список различных фраз, загружаемых из файла, а не константа.

Вариант 2. Со StackOverflow

https://loadtestweb.files.wordpress.com/2017/03/comments_20k_seed1.zip

Для рандомизации также можно использовать плагин

Random CSV Data Set

Download Versions: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6
Maven Artifact: com.blazemeter:jmeter-plugins-random-csv-data-set:0.6

Проверка успешности добавления комментария

Как было сказано выше, комментарий может не добавиться. Поэтому, после отправки комментария ответ сервера нужно проверить на успешность. Для проверки ответов сервера на различные критерии в Apache JMeter используются компоненты Assertions.

Assertions
Assertions — возможность выполнить проверку ответа по различным критериям.

Рекомендуется добавить Response Assertion. И настроить правило проверки, что ответ не должен содержать строку «Ошибка при отправке комментария».

Рандомизация добавления комментариев с использованием CSV Data Set Config

При использовании компонента CSV Data Set Config со стандартными настройками:

  • Зацикливать при достижении конца файла
  • Распределять строки файла между всеми потоками
CSV Data Set Config
Стандартные настройки CSV Data Set Config

При старте теста, первый пользователь получает первую строку файла, второй пользователь получает вторую строку файла и так далее. А когда файл заканчивается, всё повторяется снова.

Таким образом, опять высока вероятность получить ошибку:

Ошибка при отправке комментария
Обнаружен дубликат комментария. Кажется, вы уже сказали это!

Чтобы её не получить, рекомендуется сделать следующее — запустить до начала теста случайное количество потоков. Они отработают, промотают список использованных строк вперёд. И в результате, первый пользователь начнёт работу с 51-й строки, второй с 52-й и так далее, появится некая случайность.

Вообще, поиск по случайному слову или фразе из файла в Apache.JMeter или любое другое использование случайного текста из файла в JMeter — распространённая задача. Решается она за счёт того, что:

  • набор текстов в файле уже перемешан в случайном порядке
  • JMeter начинает читать файл со случайной строки

Чтобы перемешать файл в случайном порядке можно воспользоваться SublimeText, как написано в этой статье. А чтобы JMeter начал читать файл со случайной строки можно сделать так:

  1. Добавить компонент SetUp Thread Group, и настроить количество потоков в компоненте с помощью функции вычисления случайного числа, например, от 1 до 100:
    • ${__Random(1,100,)}.
  2. Внутрь компонента поместить пустое действие: Test Action, выполняющий паузу в 0 секунд.

Тогда потоки теста (Virtual User-ы), выполняющие сценарий, к моменту старта получат уже промотанные вперёд CSV Data Set Config-и.

SetUp Thread Group + Random для промотки CSV Data Set Config
SetUp Thread Group + Random(1,100) для промотки CSV Data Set Config. В результате в Ultimate Thread Group чтение строк начнётся не с первой строки, а со случайной.

Цикличность добавления комментариев с использованием HTTP Simple Table Server

Для загрузки текстов из файла в переменную рекомендуется использовать HTTP Simple Table Server:

С использованием HTTP Simple Table Server можно организовать ротацию комментариев. Читать комментарии из начала и добавлять их в конец таблицы. Комментариев 3675 в файле. За 5-ти минутный тест отправляется 10-15 комментариев. Поэтому файла хватит на сотни отладочных запусков.

Вторая причина использования HTTP Simple Table Server в том, что в HP LoadRunner работа с тестовыми данными осуществляется через Virtual Table Server. И чтобы привыкнуть к такому подходу, и сравнить удобство работы Jmeter vs LoadRunner тут рекомендуется использовать HTTP Simple Table Server.

Это как работа с базой данных, извлечение строк из начала таблицы и добавление в конец. Но эта таблица доступна по HTTP.

Вариант с CSV Data Set Config реализовать, конечно, проще. Использование HTTP Smiple Table Server — по желанию.

Логин, email, страница …

Вариант через CSV Data Set Config

Можно для загрузки всех данных использовать компонент CSV Data Set Config:

  • Один для выбора значений полей для комментирования (в файле будут строки с тремя колонками тестовых данных, в данном случае):
    • email
    • author
    • url
  • Один для добавления авторизованного комментария (в файле будет одна пара логин/пароль):
    • login
    • password
  • Также можно создать файл со списком страниц, к которым нужно оставить комментарий и также загружать это значение из файла:
    • адрес страницы, к которой надо оставлять комментарий (/2017/02/25/test-9/)

Преимущества: теоретически можно расширять состав учётных данных, которые будут использоваться для комментирования и тест будет отправлять комментарии уже от двух, трёх, … пользователей к двум, трём, … страницам.

Вариант через переменные и файл свойств

Если не заглядывать в будущее и не закладывать возможность расширения списка учётных данных и страниц, то можно все значения задать в единственном экземпляре. Используя для этого переменные.

Можно добавить значения параметров в конфигурационный файл. Например, назвать его loadtest.properties, для примера смотри файл apache-jmeter-3.1\bin\user.properties, заполнить файл как-то так:

loadtest.testPage=/2017/02/25/test-9/

loadtest.email=tectep@inbpx.ru
loadtest.author=tectep
loadtest.url=http://mail.ru

loadtest.worpress.login=secretLogin
loadtest.worpress.password=************

Разместить файл рядом с файлом скрипта. А в bat-файл запуска JMeter добавить параметр: --addprop loadtest.properties

После чего все properties, указанные в файле, будут доступны в JMeter, с помощью функции получения значений свойств property:

${__property(loadtest.testPage,,/2017/02/25/test-9/)}
${__property(loadtest.email,,tectep@inbpx.ru)}
${__property(loadtest.author,,tectep)}
${__property(loadtest.url,,http://mail.ru)}
${__property(loadtest.worpress.login,,login)}
${__property(loadtest.worpress.password,,*****)}

Используя таблицу User Defined Variables в корневом компоненте Test Plan можно сразу задавать значения нужных переменных. В качестве значения брать значение из файла с properties.

Например задать переменную с именем:

loadtest_testPage

В качестве значения указать:

${__property(loadtest.testPage,,/2017/02/25/test-9/)}

А потом получить значения переменной в тесте, везде, где нужно:

${loadtest_testPage}

Корреляция параметров формы

При отправке комментария серверу передаётся большое количество полей. Среди них есть несколько CSRF-токенов, их имена содержат строку «nonce». CSRF-токены генерируются индивидуально для пользователя, открывшего страницу и ожидается, что пользователь передаст их серверу вместе с комментарием. Это будет признаком того, что пользователь действительно открыл страицу сайта и не является роботом-спаммером, отправляющим комментарии.

Эти токены нужно обязательно скоррелировать:

  1. Найти в ответе на какой запрос они приходят от сервера. Удобно воспользоваться консолью браузера или использовать полнотекстовый поиск в прокси-сервере Fiddler4:
  2. Добавить в нагрузочный скрипт компонент для выполнения такого запроса:
  3. Добавить Post Processor-ы, для извлечения значений полей, которые нужно передавать при отправке комментариев. Рекомендуется использовать:
  4. Добавить в нагрузочный скрипт компонент для отправки комментария, с передачей CSRF-токенов, идентификатора статьи к которой отправляется комментарий, текста комментария, информации о пользователе.

Речь о тегах input и textarea с уникальными значениями атрибутов id и name, которые можно использовать как селекторы:

<input type="hidden" id="highlander_comment_nonce" name="highlander_comment_nonce" value="ceddc7c48c">
<input type="hidden" name="_wp_http_referer" value="/2017/03/12/%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8c-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b9/">
<input type="hidden" name="hc_post_as" id="hc_post_as" value="guest">
<textarea id="comment" name="comment" title="Введите свой комментарий..." placeholder="Введите свой комментарий..." style="height: 41px; overflow: hidden; word-wrap: break-word; resize: none;"></textarea>
<input id="email" name="email" type="email" value="tectep01@test.test">
<input id="author" name="author" type="text" value="Tectep 01">
<input id="url" name="url" type="url" value="http://pflb.ru">
<input type="hidden" name="wp_avatar" id="wordpress-avatar" class="comment-meta-wordpress" value="">
<input type="hidden" name="wp_user_id" id="wordpress-user_id" class="comment-meta-wordpress" value="">
<input type="hidden" name="wp_access_token" id="wordpress-access_token" class="comment-meta-wordpress" value="">
<input type="hidden" name="twitter_avatar" id="twitter-avatar" class="comment-meta-twitter" value="">
<input type="hidden" name="twitter_user_id" id="twitter-user_id" class="comment-meta-twitter" value="">
<input type="hidden" name="twitter_access_token" id="twitter-access_token" class="comment-meta-twitter" value="">
<input type="hidden" name="fb_avatar" id="facebook-avatar" class="comment-meta-facebook" value="">
<input type="hidden" name="fb_user_id" id="facebook-user_id" class="comment-meta-facebook" value="">
<input type="hidden" name="fb_access_token" id="facebook-access_token" class="comment-meta-facebook" value="">
<input type="hidden" name="googleplus_avatar" id="googleplus-avatar" class="comment-meta-googleplus" value="">
<input type="hidden" name="googleplus_user_id" id="googleplus-user_id" class="comment-meta-googleplus" value="">
<input type="hidden" name="googleplus_access_token" id="googleplus-access_token" class="comment-meta-googleplus" value="">
<input type="checkbox" name="subscribe" id="subscribe" value="subscribe" style="width: auto;">
<input type="checkbox" name="subscribe_blog" id="subscribe_blog" value="subscribe" style="width: auto;">
<input type="checkbox" name="subscribe" id="subscribe" value="subscribe" style="width: auto;">
<input type="checkbox" name="subscribe_blog" id="subscribe_blog" value="subscribe" style="width: auto;">
<input name="submit" type="submit" id="comment-submit" class="submit" value="Отправить">
<input type="hidden" name="comment_post_ID" value="346" id="comment_post_ID">
<input name="submit" type="submit" id="comment-submit" class="submit" value="Отправить">
<input type="hidden" name="comment_post_ID" value="346" id="comment_post_ID">
<input type="hidden" name="comment_parent" id="comment_parent" value="0">
<input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="dcaaa6e13e">
<input type="hidden" name="genseq" value="1489728836">
<input type="hidden" id="ak_js" name="ak_js" value="1489728835549">

Комментарий достаточно отправлять к статье, комментарий верхнего уровня. Отправлять комментарий к комментарию не нужно.

Пример выбора значения атрибута value из тега input с id / name = highlander_comment_nonce с помощью CSS/JQuery Extractor:

  • Reference Name: highlander_comment_nonce
  • CSS/JQuery expression:
    • input#highlander_comment_nonce
    • #highlander_comment_nonce
    • input[name='highlander_comment_nonce']
    • input[id='highlander_comment_nonce']
  • Attribute: value
  • Match No. (0 for Random): 1
  • Default Value:

После чего в переменной ${highlander_comment_nonce} будет значение атрибута value = 4afc63c8f.

Задание 4. Оставить комментарий к статье: 5 комментариев

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s