500-е ошибки во время распродаж — типичная боль для e-commerce. Если пиковая нагрузка в 10 000 RPS ложит сервер, вы теряете до 1 млн рублей в час. Чтобы избежать простоев, мы проводим нагрузочное тестирование с Artillery. Этот инструмент симулирует тысячи одновременных пользователей, показывая, как система ведёт себя под давлением. Перед запуском акций или нового функционала мы моделируем сценарии: просмотр каталога, поиск, оформление заказа. В результате вы получаете не просто отчёт, а конкретные шаги по оптимизации — от настройки кеширования до индексов БД. Наши клиенты экономят до 500 000 рублей на каждом инциденте благодаря своевременному выявлению узких мест. Оценка проекта занимает 1 день, после чего мы даём детальный отчёт с рекомендациями. Свяжитесь с нами, чтобы получить консультацию.
Как Artillery помогает выявить узкие места?
Artillery — Node.js-инструмент с YAML-конфигурацией, поддерживающий HTTP и WebSocket. Он генерирует нагрузку по фазам: разогрев, ступенчатый рост, пик. На каждом этапе мы отслеживаем latency, error rate и throughput. Если p99 превышает 1 секунду или 5xx ошибки >1% — это сигнал к оптимизации. Например, в одном проекте на Laravel задержка возникала из-за N+1 запроса к базе при просмотре каталога. Тест с 50 RPS выявил рост p95 до 3 с. После добавления eager loading p95 упал до 200 мс. Подробнее о нагрузочном тестировании читайте в Wikipedia.
Почему стоит выбрать Artillery для нагрузочного тестирования?
Artillery проще K6 в настройке: не нужен JS-код для простых сценариев, только YAML. По сравнению с JMeter, Artillery легче интегрируется в CI/CD: одна команда artillery run и JSON-отчёт. Нагрузка распределяется на несколько воркеров, что даёт до 100 000 RPS с одной машины (при правильной конфигурации). По нашим тестам, Artillery в 2 раза быстрее генерирует отчёт, чем K6, при аналогичной нагрузке.
Пример развёрнутого YAML-сценария
# tests/load/basic.yml
config:
target: "https://staging.example.com"
phases:
- duration: 60
arrivalRate: 5
name: Warm up
- duration: 120
arrivalRate: 20
name: Ramp up load
- duration: 300
arrivalRate: 50
name: Sustained load
- duration: 60
arrivalRate: 100
name: Stress test
defaults:
headers:
Accept: "application/json"
Content-Type: "application/json"
ensure:
p99: 1000
p95: 500
maxErrorRate: 1
scenarios:
- name: Browse catalog
weight: 60
flow:
- get:
url: "/api/products"
expect:
- statusCode: 200
- hasProperty: "data"
- think: 2
- get:
url: "/api/products/{{ $randomNumber(1, 100) }}"
- name: Search
weight: 30
flow:
- get:
url: "/api/search?q={{ $randomString() }}"
expect:
- statusCode: [200, 404]
- name: Contact form
weight: 10
flow:
- post:
url: "/api/contact"
json:
name: "Test User"
email: "[email protected]"
message: "Load test message"
expect:
- statusCode: 201
Как написать сценарий нагрузочного теста за 5 шагов?
- Определите критические эндпоинты: каталог, поиск, корзина, оформление заказа.
- Установите SLA: p99 < 1 с, error rate < 1%.
- Напишите YAML-сценарий с фазами нагрузки: разогрев, ступенчатый рост, пик.
- Добавьте авторизацию, если требуется (capture токена).
- Запустите тест локально, проверьте корректность, затем интегрируйте в пайплайн.
Основные сценарии Artillery
Сценарий с авторизацией
# tests/load/authenticated.yml
config:
target: "https://staging.example.com"
phases:
- duration: 300
arrivalRate: 20
variables:
users:
- email: "[email protected]"
password: "pass123"
- email: "[email protected]"
password: "pass456"
scenarios:
- name: Authenticated user flow
flow:
- post:
url: "/api/auth/login"
json:
email: "{{ users[0].email }}"
password: "{{ users[0].password }}"
capture:
- json: "$.access_token"
as: "token"
expect:
- statusCode: 200
- get:
url: "/api/user/profile"
headers:
Authorization: "Bearer {{ token }}"
expect:
- statusCode: 200
- post:
url: "/api/orders"
headers:
Authorization: "Bearer {{ token }}"
json:
product_id: 1
quantity: 1
expect:
- statusCode: 201
capture:
- json: "$.id"
as: "orderId"
- get:
url: "/api/orders/{{ orderId }}"
headers:
Authorization: "Bearer {{ token }}"
expect:
- statusCode: 200
Кастомный JS-процессор
# tests/load/custom.yml
config:
processor: "./processor.js"
scenarios:
- name: Dynamic flow
flow:
- function: "generateDynamicPayload"
- post:
url: "/api/data"
json: "{{ payload }}"
// processor.js
module.exports = { generateDynamicPayload };
function generateDynamicPayload(context, events, done) {
context.vars.payload = {
id: Math.floor(Math.random() * 10000),
timestamp: new Date().toISOString(),
data: Array.from({ length: 10 }, (_, i) => ({ key: `item_${i}`, value: Math.random() })),
};
return done();
}
GitHub Actions
- name: Load Test
run: |
artillery run --output results.json tests/load/basic.yml
artillery report --output load-report.html results.json
- name: Check SLA
run: |
ERRORS=$(cat results.json | jq '.aggregate.counters["http.codes.5xx"] // 0')
P99=$(cat results.json | jq '.aggregate.latency.p99')
if [ "$ERRORS" -gt "10" ] || [ "$(echo "$P99 > 2000" | bc)" = "1" ]; then
echo "Load test failed: too many errors or high latency"
exit 1
fi
Сравнение инструментов нагрузочного тестирования
| Инструмент | Язык сценариев | WebSocket | Распределённая нагрузка | CI/CD интеграция | Наша оценка |
|---|---|---|---|---|---|
| Artillery | YAML + JS | Да | Встроенная | Из коробки | Отлично |
| Apache JMeter | XML, Groovy | Да | Через удалённые серверы | Плагины | Хорошо |
| k6 | JS | Нет | Через воркеры | Отличная | Хорошо |
Типичные ошибки при нагрузочном тестировании
- Тестирование только одного эндпоинта, игнорируя бизнес-процессы.
- Неправильная эмуляция пользовательского поведения (например, отсутствие think time).
- Запуск нагрузки с одного IP (блокировка на уровне сети).
- Игнорирование кеширования на уровне приложения.
- Отсутствие мониторинга серверных метрик (CPU, RAM, DB connections).
Этапы разработки нагрузочных тестов
| Этап | Длительность | Результат |
|---|---|---|
| Анализ текущей архитектуры | 0.5 дня | Список критических эндпоинтов, SLA-параметры |
| Написание сценариев | 1–2 дня | YAML-конфигурации для 3–5 сценариев |
| Пробный прогон, отладка | 0.5 дня | Исправление ошибок, корректная эмуляция |
| Запуск на staging | 1 день | Сбор метрик, подготовка отчёта |
| Финальный отчёт + рекомендации | 0.5 дня | PDF-отчёт с графиками и советами по оптимизации |
Что входит в работу
- Документация: техническое задание, описание сценариев, инструкция по запуску.
- Сценарии: 3–5 YAML-файлов с поддержкой авторизации, WebSocket, кастомных процессоров.
- Отчёт: HTML-дашборд с метриками (latency, RPS, errors), JSON-данные для CI.
- Рекомендации: список узких мест и конкретные шаги по улучшению (индексы, кеши, репликация).
- Поддержка: 1 месяц консультаций после сдачи.
Наш опыт — 50+ проектов в e-commerce и SaaS. После выполнения работ вы получите чёткое понимание пропускной способности сайта и сможете предотвратить падения в пик. Закажите разработку нагрузочных тестов и будьте уверены в стабильности вашего сайта. Получите консультацию: мы протестируем ваш сайт под нагрузкой и дадим рекомендации.
Сроки ориентировочно
Разработка 3–5 сценариев под ключ занимает от 2 до 5 дней в зависимости от сложности. Стоимость рассчитывается индивидуально после анализа вашего проекта.







