Интенсивность и профиль нагрузки
Чтобы после отправки комментария не возвращалось сообщение:
Вы комментируете слишком быстро. Попридержите коней.
Надо чтобы сценарии выполнялись с суммарной интенсивностью 1,5-2,5 сценария в минуту. То есть все виртуальные пользователи, должны создавать нагрузку соотвествующую 1,5-2,5 сценария в минуту.
В сценарии должно отправляться два комментария:
- Комментарий от незарегистрированного пользователя:
- Использовать список из 10-ти пользователей вида:
- tectep1@loadtestweb.wordpress.com, Performance Tester 01, https://loadtestweb.wordpress.com/
- tectep2@loadtestweb.wordpress.com, Performance Tester 02, https://loadtestweb.wordpress.com/
- tectep3@loadtestweb.wordpress.com, Performance Tester 03, https://loadtestweb.wordpress.com/
- …
- Параметры пользователей загружать, используя CSV Data Set Config, описание способа смотри ниже.
- Использовать список из 10-ти пользователей вида:
- Комментарий от зарегистрированного пользователя, одного:
- Использовать только одного пользователя:
- Выполнить аутентификацию через 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 (добавить колонку со случайным значением и отсортировать по ней).
Если использовать в качестве текста комментария одинаковый текст, константу, то сервер примет комментарий, но не добавит его, вернёт ошибку.
Ошибка при отправке комментария
Обнаружен дубликат комментария. Кажется, вы уже сказали это!
Поэтому и используется список различных фраз, загружаемых из файла, а не константа.
Вариант 2. Со StackOverflow
https://loadtestweb.files.wordpress.com/2017/03/comments_20k_seed1.zip
Для рандомизации также можно использовать плагин
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.

Рекомендуется добавить Response Assertion. И настроить правило проверки, что ответ не должен содержать строку «Ошибка при отправке комментария».
Рандомизация добавления комментариев с использованием CSV Data Set Config
При использовании компонента CSV Data Set Config со стандартными настройками:
- Зацикливать при достижении конца файла
- Распределять строки файла между всеми потоками

При старте теста, первый пользователь получает первую строку файла, второй пользователь получает вторую строку файла и так далее. А когда файл заканчивается, всё повторяется снова.
Таким образом, опять высока вероятность получить ошибку:
Ошибка при отправке комментария
Обнаружен дубликат комментария. Кажется, вы уже сказали это!
Чтобы её не получить, рекомендуется сделать следующее — запустить до начала теста случайное количество потоков. Они отработают, промотают список использованных строк вперёд. И в результате, первый пользователь начнёт работу с 51-й строки, второй с 52-й и так далее, появится некая случайность.
Вообще, поиск по случайному слову или фразе из файла в Apache.JMeter или любое другое использование случайного текста из файла в JMeter — распространённая задача. Решается она за счёт того, что:
- набор текстов в файле уже перемешан в случайном порядке
- JMeter начинает читать файл со случайной строки
Чтобы перемешать файл в случайном порядке можно воспользоваться SublimeText, как написано в этой статье. А чтобы JMeter начал читать файл со случайной строки можно сделать так:
- Добавить компонент SetUp Thread Group, и настроить количество потоков в компоненте с помощью функции вычисления случайного числа, например, от 1 до 100:
-
${__Random(1,100,)}.
-
- Внутрь компонента поместить пустое действие: Test Action, выполняющий паузу в 0 секунд.
Тогда потоки теста (Virtual User-ы), выполняющие сценарий, к моменту старта получат уже промотанные вперёд CSV Data Set Config-и.

Цикличность добавления комментариев с использованием 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:
- Один для выбора значений полей для комментирования (в файле будут строки с тремя колонками тестовых данных, в данном случае):
- 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-токены генерируются индивидуально для пользователя, открывшего страницу и ожидается, что пользователь передаст их серверу вместе с комментарием. Это будет признаком того, что пользователь действительно открыл страицу сайта и не является роботом-спаммером, отправляющим комментарии.
Эти токены нужно обязательно скоррелировать:
- Найти в ответе на какой запрос они приходят от сервера. Удобно воспользоваться консолью браузера или использовать полнотекстовый поиск в прокси-сервере Fiddler4:
- Добавить в нагрузочный скрипт компонент для выполнения такого запроса:
- Добавить Post Processor-ы, для извлечения значений полей, которые нужно передавать при отправке комментариев. Рекомендуется использовать:
- CSS/JQuery Extractor (простой и понятный синтаксис селекторов);
- Regular Expression Extractor (синтаксис сложнее, но очень быстро работает).
- Добавить в нагрузочный скрипт компонент для отправки комментария, с передачей 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
.
test
НравитсяНравится
success
НравитсяНравится
kek
НравитсяНравится
Проверка
НравитсяНравится
dsgrdagad
НравитсяНравится