Разработка нагрузочных тестов для сайта (JMeter)
Apache JMeter — зрелый инструмент нагрузочного тестирования на Java. Поддерживает HTTP, HTTPS, WebSocket, JDBC, LDAP, FTP. Богатый GUI для построения тест-планов, плагины для расширения функциональности, широко используется в энтерпрайзе.
Архитектура тест-плана
Test Plan
├── Thread Group (группа пользователей)
│ ├── HTTP Request Defaults (общие настройки)
│ ├── HTTP Cookie Manager
│ ├── HTTP Header Manager
│ ├── Login Sampler (POST /api/auth/login)
│ ├── Think Time (таймер ожидания)
│ ├── Products Sampler (GET /api/products)
│ └── Assertions
├── Results Tree Listener
├── Aggregate Report Listener
└── Response Time Graph
Создание тест-плана через JMX (XML)
<!-- test-plan.jmx -->
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0">
<hashTree>
<TestPlan testname="E-commerce Load Test">
<hashTree>
<ThreadGroup testname="User Flow" enabled="true">
<stringProp name="ThreadGroup.num_threads">100</stringProp>
<stringProp name="ThreadGroup.ramp_time">60</stringProp>
<stringProp name="ThreadGroup.duration">300</stringProp>
<boolProp name="ThreadGroup.scheduler">true</boolProp>
<hashTree>
<HTTPSamplerProxy testname="Login">
<stringProp name="HTTPSampler.domain">${BASE_URL}</stringProp>
<stringProp name="HTTPSampler.path">/api/auth/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<!-- ... -->
</HTTPSamplerProxy>
</hashTree>
</ThreadGroup>
</hashTree>
</TestPlan>
</hashTree>
</jmeterTestPlan>
Запуск через командную строку (без GUI)
# Базовый запуск
jmeter -n -t test-plan.jmx \
-l results.jtl \
-e -o html-report/ \
-JBASE_URL=https://staging.example.com \
-JN_USERS=100 \
-JRAMP_UP=60
# С плагинами из командной строки
jmeter -n -t test-plan.jmx \
-Jjmeterengine.force.system.exit=true \
-l results.jtl \
-JBASE_URL=https://staging.example.com
Переменные и параметризация
# users.csv — данные тестовых пользователей
email,password
[email protected],pass123
[email protected],pass456
[email protected],pass789
В JMeter: Add → Config Element → CSV Data Set Config:
- Filename:
${__P(data_dir)}/users.csv - Variable Names:
email,password - Sharing Mode: All threads
Assertions
Response Assertion:
- Response Code: equals 200
- Response Body: contains "access_token"
Duration Assertion:
- Duration in milliseconds: <= 1000
JSON Path Assertion:
- JSON Path: $.data[0].id
- Expected Value: (не пустое)
Beanshell/Groovy Post-processor
// Groovy JSR223 PostProcessor — извлечь JWT из ответа
import groovy.json.JsonSlurper
def response = prev.getResponseDataAsString()
def json = new JsonSlurper().parseText(response)
vars.put("auth_token", json.access_token)
vars.put("user_id", json.user.id.toString())
Распределённое тестирование
# Master-slave конфигурация
# remote_hosts в jmeter.properties
remote_hosts=192.168.1.11,192.168.1.12,192.168.1.13
# Запуск на всех узлах
jmeter -n -t test-plan.jmx -r -l results.jtl
Интеграция с Grafana через InfluxDB
# jmeter.properties
backend_listener_client=kg.apc.jmeter.reporters.influxdb2.InfluxDbBackendListenerClient
# Backend Listener Config
influxDBHost: localhost
influxDBPort: 8086
influxDBToken: your-token
influxDBOrganization: myorg
influxDBBucket: jmeter
Срок реализации
Разработка тест-плана JMeter с 5–7 сценариями нагрузки: 3–6 дней.







