TL;DR

  • JMeter — бесплатный open-source инструмент для нагрузочного тестирования API, веб-приложений и БД
  • Ключевые концепции: Test Plan → Thread Group (пользователи) → Samplers (запросы) → Listeners (результаты)
  • Начни с записи HTTP-запросов, затем параметризуй и добавь assertions
  • Используй CLI-режим для реальных тестов — GUI только для дизайна
  • Распределённое тестирование масштабируется до тысяч одновременных пользователей

Идеально для: QA-инженеров, DevOps, разработчиков, тестирующих производительность API Пропусти, если: Нужно реальное браузерное тестирование (используй k6 или Playwright) Время чтения: 20 минут

Твой API обрабатывает 100 запросов в секунду в разработке. В продакшене — 10,000. Время ответа вырастает до 30 секунд. Пользователи уходят с сайта.

Нагрузочное тестирование ловит эти проблемы до пользователей. JMeter — самый популярный инструмент для этого — бесплатный, мощный и проверенный миллионами.

Этот туториал учит JMeter от установки до распределённого тестирования — всё, что нужно для поиска узких мест производительности.

Что такое Apache JMeter?

JMeter — это open-source инструмент для нагрузочного тестирования, написанный на Java. Он симулирует множество пользователей, отправляющих запросы, чтобы измерить производительность систем под нагрузкой.

Что может тестировать JMeter:

  • Веб-приложения (HTTP/HTTPS)
  • REST и SOAP API
  • Базы данных (JDBC)
  • FTP-серверы
  • Очереди сообщений (JMS)
  • Почтовые серверы (SMTP, POP3)

Почему JMeter:

  • Бесплатный и open-source — без лицензионных затрат
  • GUI для дизайна тестов — визуальное создание тестов
  • Поддержка протоколов — HTTP, JDBC, JMS, FTP и другие
  • Расширяемый — плагины для дополнительных функций
  • Распределённое тестирование — масштабирование на несколько машин
  • Интеграция с CI/CD — выполнение из командной строки

Установка

Предварительные требования

JMeter требует Java 8 или выше.

# Проверить версию Java
java -version

# Если не установлена, установить OpenJDK
# macOS
brew install openjdk

# Ubuntu/Debian
sudo apt install openjdk-11-jdk

Установка JMeter

# Скачать последнюю версию
wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz

# Распаковать
tar -xzf apache-jmeter-5.6.3.tgz

# Запустить JMeter GUI
cd apache-jmeter-5.6.3/bin
./jmeter.sh    # Linux/macOS
jmeter.bat     # Windows

Концепции JMeter

Иерархия тест-плана

Test Plan
├── Thread Group (Пользователи)
│   ├── Sampler (HTTP Request)
│   │   ├── Config Element (Headers, Cookies)
│   │   ├── Pre-Processor (Модификация до отправки)
│   │   └── Post-Processor (Извлечение из ответа)
│   ├── Assertion (Проверка ответа)
│   └── Timer (Задержка между запросами)
├── Listener (Просмотр результатов)
└── Config Element (Глобальные настройки)

Ключевые компоненты

Thread Group — Симулирует пользователей

Number of Threads: 100        # Одновременные пользователи
Ramp-Up Period: 60 seconds    # Время запуска всех пользователей
Loop Count: 10                # Итерации на пользователя

Sampler — Отправляет запросы (HTTP, JDBC и т.д.)

Listener — Собирает и отображает результаты

Assertion — Валидирует ответы

Timer — Добавляет задержки между запросами

Создание первого теста

Шаг 1: Создание Test Plan

  1. Открыть JMeter
  2. ПКМ на Test Plan → Add → Threads → Thread Group
  3. Настроить Thread Group:
    • Number of Threads: 10
    • Ramp-Up Period: 10
    • Loop Count: 5

Шаг 2: Добавление HTTP Request

  1. ПКМ на Thread Group → Add → Sampler → HTTP Request
  2. Настроить:
    • Protocol: https
    • Server Name: jsonplaceholder.typicode.com
    • Path: /posts/1
    • Method: GET

Шаг 3: Добавление Listeners

  1. ПКМ на Thread Group → Add → Listener → View Results Tree
  2. Add → Listener → Summary Report
  3. Add → Listener → Response Time Graph

Шаг 4: Запуск теста

  1. Нажать зелёную кнопку Start
  2. Просмотреть результаты в listeners
  3. Сохранить тест-план (.jmx файл)

Переменные и параметризация

User Defined Variables

ПКМ на Test Plan → Add → Config Element → User Defined Variables

Name        | Value
------------|---------------------------
base_url    | https://api.example.com
api_version | v2
timeout     | 30000

Использование в запросах: ${base_url}/${api_version}/users

CSV Data Set Config

Для data-driven тестирования с несколькими пользователями.

Создать users.csv:

username,password,expected_name
user1,pass1,John Doe
user2,pass2,Jane Smith
user3,pass3,Bob Wilson

Добавить CSV Data Set Config:

Filename: users.csv
Variable Names: username,password,expected_name
Delimiter: ,
Recycle on EOF: True

Использование: ${username}, ${password}

Assertions

Response Assertion

Проверка, что ответ содержит ожидаемый текст.

Apply to: Main sample only
Field to Test: Response Body
Pattern Matching Rules: Contains
Patterns to Test: "success": true

JSON Assertion

Валидация структуры и значений JSON.

Assert JSON Path exists: $.data.id
Expected Value: 123

Duration Assertion

Падение, если ответ занимает слишком много времени.

Duration in milliseconds: 2000

Тестовые сценарии

Load Test

Симуляция ожидаемой продакшен-нагрузки.

Thread Group:
- Threads: 100
- Ramp-Up: 300 seconds (5 минут)
- Duration: 1800 seconds (30 минут)
- Loop Count: Forever

Цель: Проверить, что система справляется с нормальным трафиком

Stress Test

Поиск точки отказа.

Thread Group 1: 100 пользователей, 60s ramp
Thread Group 2: 200 пользователей, 60s ramp
Thread Group 3: 500 пользователей, 60s ramp
Thread Group 4: 1000 пользователей, 60s ramp

Цель: Найти, когда система деградирует/падает

Spike Test

Резкий всплеск трафика.

Thread Group:
- Threads: 1000
- Ramp-Up: 10 seconds (быстрый всплеск)
- Duration: 120 seconds

Цель: Тестирование восстановления системы от внезапной нагрузки

Запуск тестов в CLI-режиме

GUI-режим только для дизайна тестов. Реальные тесты всегда в CLI.

# Базовое выполнение CLI
jmeter -n -t test_plan.jmx -l results.jtl

# С HTML-отчётом
jmeter -n -t test_plan.jmx -l results.jtl -e -o report_folder

# С параметрами
jmeter -n -t test_plan.jmx -l results.jtl \
  -Jusers=100 \
  -Jrampup=60 \
  -Jduration=300

Распределённое тестирование

Для высокой нагрузки — распределение тестов на несколько машин.

Архитектура

┌─────────────────┐
│   Controller    │
│   (Master)      │
└────────┬────────┘
         │
    ┌────┴────┐
    │         │
┌───▼───┐ ┌───▼───┐
│Worker1│ │Worker2│
│(Slave)│ │(Slave)│
└───────┘ └───────┘

Настройка Workers

На каждой worker-машине:

cd apache-jmeter-5.6.3/bin
./jmeter-server

Запуск распределённого теста

# Запуск на всех remote hosts
jmeter -n -t test.jmx -r -l results.jtl

# Запуск на конкретных hosts
jmeter -n -t test.jmx -R worker1,worker2 -l results.jtl

JMeter с помощью ИИ

ИИ-инструменты могут помочь в создании и оптимизации JMeter-тестов.

Что ИИ делает хорошо:

  • Генерация тест-планов из API-документации
  • Создание реалистичных тестовых данных
  • Предложение паттернов assertions
  • Объяснение метрик производительности

Что всё ещё требует людей:

  • Понимание архитектуры системы
  • Установка реалистичных целей нагрузки
  • Интерпретация результатов в контексте
  • Определение приемлемых порогов

FAQ

Что такое Apache JMeter?

Apache JMeter — это бесплатный open-source инструмент для нагрузочного тестирования, написанный на Java. Он симулирует множество одновременных пользователей, отправляющих запросы к веб-приложениям, API или базам данных для измерения производительности под нагрузкой. JMeter поддерживает HTTP, HTTPS, JDBC, JMS, FTP и другие протоколы.

JMeter бесплатный?

Да, JMeter на 100% бесплатен и open-source под лицензией Apache 2.0. Нет платных уровней, enterprise-версий или ограничений функциональности. Вся функциональность, включая распределённое тестирование, плагины и отчёты, доступна всем бесплатно.

Сколько пользователей может симулировать JMeter?

Один инстанс JMeter обычно симулирует 1,000-5,000 одновременных пользователей в зависимости от аппаратных ресурсов и сложности теста. Для более высоких нагрузок JMeter поддерживает распределённое тестирование на нескольких машинах, позволяя симулировать сотни тысяч или миллионы виртуальных пользователей.

JMeter или Gatling — что лучше?

JMeter предлагает более простой GUI-подход и большую поддержку сообщества, что делает его идеальным для начинающих и быстрых тестов. Gatling обеспечивает лучшую производительность, подход code-as-tests и более чистые отчёты, лучше подходящие для CI/CD пайплайнов. Выбирай JMeter для доступности; Gatling для высокомасштабного автоматизированного тестирования.

Официальные ресурсы

Смотрите также