Это приложение с открытым исходным кодом на Java, предназначенное для нагрузочного и стресс-тестирования.
В JMeter можно проводить нагрузочное тестирование многих типов серверов — Web — HTTP, HTTPS, SOAP, баз данных via JDBC и т.д.
Установка:
Загрузите JMeter: https://jmeter.apache.org/download_jmeter.cgi
Запустите из папки /bin в терминале:
- Для Mac: jmeter.sh
- Для Windows: .jmeter.bat
Базовые понятия JMeter
План тестирования: Описывает последовательность шагов, которые JMeter будет выполнять при запуске. Полный план тестирования (тест-план) состоит из одной или нескольких групп потоков, логических контроллеров, контроллеров генерации семплов, слушателей, таймеров, утверждений и конфигурационных элементов.
Группа потоков: Thread Group — это набор потоков, выполняющих один и тот же сценарий. Задает количество итераций в конфигурации.
Количество потоков (пользователей) : Количество виртуальных пользователей, с которыми будет проводиться тестирование.
Период нарастания (нагрузки): Ramp up period определяет количество времени, в течение которого все пользователи будут инициализированы, например за 10 миллисекунд в систему «войдет» 100 виртуальных пользователей.
Количество повторений (нагрузочного цикла): Loop Count определяет количество раз, которое будет выполняться Группа потоков.
Семплеры: Samplers указывают нам, какой тип запроса должен быть отправлен, например HTTP, HTTPS и т.д.
Латентность: Время до получения первого фрагмента информации, т.е. первого байта данных.
Время соединения: Время, необходимое для установления соединения с сервером.
Время выборки: Sample Time — время, необходимое для получения всех данных.
Выборка (Sample) — Последовательность номеров выборок.
Байты — Размер полученных данных.
Воркбенч: Workbench — это место, где можно хранить элементы, которые не используются в текущем сценарии.
Инструмент записи скриптов: HTTP(s) Test Script Recorder помогает тестировщикам записывать сценарий и затем настраивать нагрузку для каждой транзакции.
Утверждения: ассерты (assertions) проверяют результаты, полученные в дереве результатов.
Утверждение ответа: в нем мы добавляем строки и затем сравниваем их с полученными ответами.
Утверждение продолжительности: Duration Assertion проверяет, что сервер ответил в течение заданного времени.
Утверждение размера: Size assertion проверяет размер для сервера, отвечающего за период нарастания.
HTML-утверждение: HTML Assertion проверяет HTML-синтаксис ответа, полученного от сервера.
Конфигурация:
Настройка импорта CSV-сета: CSV Data Set Config используется, когда нужно загрузить в JMeter какие-то данные извне в виде CSV. Например, API требует какой-либо ID, который является переменной и может быть загружен через CSV.
Пользовательские переменные: помогает jMeter выбирать значения из заранее определенных переменных, например, если нужно провести тестирование на различных серверах, таких как Staging или Test Server.
Дефолтный HTTPS-сервер: Это сервер по умолчанию, на котором мы делаем запрос, например Staging или Test Server, чтобы не менять URL каждый раз.
Менеджер кэша HTTPS: для управления кэшем сервера.
Менеджер кукис HTTPS: для управления cookies во всех API.
Контроллеры логики: Логические контроллеры и таймеры управляют потоком транзакций, например:
- While-контроллер, в который мы передаем переменную для API, или загружаем CSV, который заменит переменную в API.
- Loop-контроллер запускает сохраненные в нем семплеры и запросы определенное количество раз, или по кругу (если установлен флажок forever).
- Выберите флажок ‘Forever’ для запуска тестов бесконечное количество раз
- Введите число циклов для запуска тестов фиксированное количество раз:
JSON Extractor: JSON-экстрактор предназначен для извлечения нужных переменных для API, например:
API /login
предоставит нам ID пользователя, который затем можем извлечь и использовать в API /getWalletOfUser
.
На скриншотах выше мы создаем while-контроллер, который передает переменные, полученные из CSV, для запуска API.
Bean shell Sampler: используется для написания скриптов на Java.
Ниже приведен пример, в котором мы используем BSS для записи данных из API в файл.
String name = vars.get(“tags”); // В ответе API будут доступны теги. f = newFileOutputStream(“/Users/ashokgarg/Desktop/tags.csv”,false); // Куда сохранять файлы p = new PrintStream(f);// Печать вывода встроенной Java-функцией this.interpreter.setOut(p); print(name.split(“,”)); // Сплит ответа из строки f.close();
Таким образом, мы получим ответ от /login api и запишем результаты в файл `tags.csv
:
Постоянный таймер: он добавляется для того, чтобы установить задержку между API-запросами на сервере; например, если он установлен на 10 с, каждый API-запрос будет ждать 10 секунд после первого.
Препроцессоры: Добавляются на уровне группы потоков, чтобы их можно было выполнить до запроса семплера, например, данные, необходимые API из БД, могут быть прописаны в препроцессоре.
Постпроцессоры: Добавляются на уровне группы потоков и выполняются после семплера. Используются для обработки данных ответа от сервера и извлечения определенных значений.
Сводный отчет:
Пропускная способность (пропуск, Throughput): отражает способность сервера справляться с большой нагрузкой. Чем выше пропускная способность, тем выше производительность сервера.
Отклонение (девиация): Используется для определения разницы между временем, затраченным на выполнение выборки, и средним временем, отведенным на ее выполнение.
Некоторые важные формулы:
endTime = lastSampleStartTime + lastSampleLoadTime startTime = firstSampleStartTime conversion = unit time conversion value Throughput = Numrequests / ((endTime - startTime)*conversion)
Быстрый практикум
Делаем следующее:
- Создайте План тестирования > Добавьте группу потоков > На уровне группы потоков добавьте количество пользователей > период нарастания > и количество циклов.
- Добавьте HTTP Cookie и Cache Manager на уровне группы потоков.
- Добавьте Sampler > Http Header Manager (значения по умолчанию, необходимые для выполнения запроса Sampler).
- Добавьте HTTP Default Request (укажите сервер, на котором вы должны тестировать).
- Добавьте JSON Extractor для получения значений из ответа и Bean Shell sampler для записи данных CSV.
- Добавьте PreProcessor и PostProcessor для управления запросами (описаны выше).
- Добавьте Listeners: a) View Result Tree b) Summary Report c) Graph Results
- Нажмите Command +E , Command +S , Command + R на Mac-машине после ввода всех вышеперечисленных запросов и проверьте Throughput и Standard Deviation.
Уточнения в случае нагрузочного и стресс-тестирования:
- Укажите количество пользователей > выполните API > войдите на тестируемый сервер с помощью команды «top command» > проверьте использование CPU и состояние CPU.
- Увеличьте количество пользователей на уровне семплера и установите счетчик циклов на 10, чтобы запросы выполнились 10 раз, и проверьте использование CPU сервера, количество хитов API и логи сервера.
- Все тестируемые API должны отдавать код ответа 200, а использование CPU сервера и состояние CPU должны быть в норме, как и раньше.
Если на вашем сервере нет активных пользователей, вы должны видеть, что % использования процессора пользователями должен быть очень низким или 0%, а % простоя процессора должен составлять 99+%.
Режим без интерфейса
JMeter иногда используется в безинтерфейсном режиме, потому что:
- Мы можем увеличить количество потоков, в отличие от GUI-режима, который иногда приводит к сбоям.
- GUI-режим не подходит для «тяжелых» сценариев, поскольку jMeter потребляет больше памяти и процессора, что может повлиять на результаты тестирования.
- Чтобы увеличить возможности jMeter, то есть получить больше запросов в секунду.
Шаги:
Сохраните файл jmx в папке >> откройте терминал >> перейдите в папку, в которой сохранен файл jmx (Java Management Extensions), и выполните следующую команду:
jmeter -n –t login.jmx -l testresults.jtl
- n: Указывает, что JMeter будет работать без интерфейса.
- -t: Имя JMX-файла, содержащего план тестирования.
- -l: Имя файла JTL (JMeter text logs) для регистрации результатов.
- -j: Имя лога выполнения JMeter
- -R: список удаленных серверов.
- H: имя хоста или IP-адрес прокси-сервера.
- -P: порт прокси-сервера.