500-ті помилки під час розпродажів — типова біль для e-commerce. Якщо пікове навантаження в 10 000 RPS кладе сервер, ви втрачаєте до 500 000 гривень на годину. Щоб уникнути простоїв, ми проводимо навантажувальне тестування з 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 днів залежно від складності. Вартість розраховується індивідуально після аналізу вашого проєкту.







