Ваш сайт може почати гальмувати при 500 одночасних відвідувачах. У ході пікового навантаження (розпродаж, запуск акції) сервер іде в таймаут, а користувачі бачать 503 помилку. Без навантажувального тестування не можна гарантувати стабільну роботу продакшену. Ми — інженери з 5+ років досвіду, які знають, як змоделювати реальне навантаження за допомогою Apache JMeter і виявити слабкі місця до того, як їх помітять клієнти. За роки роботи ми провели навантажувальне тестування для 30+ проєктів — від інтернет-магазинів до SaaS-платформ. Кожен проєкт унікальний за стеком та архітектурою, тому ми не використовуємо шаблонні рішення. Економія від своєчасного виявлення проблем може становити до 500 000 грн за годину простою критичного сервісу, а вартість тестування починається від 30 000 грн.
Як ми розробляємо навантажувальні тести з Apache JMeter?
Починаємо з аналізу архітектури: які ендпоїнти найважчі, які сценарії виконують користувачі (реєстрація, пошук, додавання в кошик, оформлення замовлення). Ми вивчаємо структуру бази даних, профілюємо запити, визначаємо критичні шляхи. Для кожного сценарію створюємо Thread Group з параметрами: кількість віртуальних користувачів (до 10 000), час розгону (ramp-up) та тривалість тесту.
Приклад тест-плану для інтернет-магазину:
Test Plan
├── Thread Group (1000 користувачів, ramp-up 60 с, duration 300 с)
│ ├── HTTP Request Defaults (domain, port, protocol)
│ ├── HTTP Cookie Manager
│ ├── CSV Data Set Config (users.csv: email,password)
│ ├── Login Sampler (POST /api/auth/login)
│ ├── JSR223 PostProcessor (вилучення JWT)
│ ├── Think Time (Uniform Random Timer 1000-3000 ms)
│ ├── Products Sampler (GET /api/products)
│ └── JSON Assertion (перевірка відповіді)
├── Backend Listener (InfluxDB)
└── View Results Tree (для налагодження)
Ми параметризуємо дані через CSV Data Set Config — це дозволяє використовувати унікальні облікові записи без конфліктів.
Крок 1: Визначення цілей тестування
Чітко формулюємо, що перевіряємо: максимальну пропускну здатність, час відповіді під навантаженням або поведінку при відмові компонентів. Це впливає на вибір сценаріїв.
Крок 2: Створення сценаріїв
Для кожного користувацького шляху пишемо послідовність запитів з реалістичними таймінгами. Використовуємо JSR223 PreProcessor для генерації динамічних даних (токени, ID товарів).
Крок 3: Налаштування асершнів
Додаємо перевірки відповідей: HTTP-код, JSON-схема, регулярні вирази. Без них тест не вловить приховані помилки.
Крок 4: Запуск і моніторинг
Запускаємо тест у CLI-режимі, збираємо метрики через Backend Listener в InfluxDB. У Grafana бачимо дашборд із показниками в реальному часі.
Крок 5: Аналіз результатів
Після завершення генеруємо HTML-звіт з агрегованими даними. Виявляємо вузькі місця та даємо рекомендації щодо оптимізації сервера.
Які метрики ми аналізуємо?
Вимірюємо ключові показники продуктивності веб-додатків:
-
Пропускна здатність (RPS) — скільки запитів за секунду витримує сервер.
-
Час відповіді (p50, p95, p99) — медіанний, 95-й та 99-й процентилі. Якщо p99 перевищує 1000 мс — це проблема.
-
Відсоток помилок — HTTP 4xx/5xx, таймаути.
- Утилізація ресурсів — CPU, RAM, диск I/O (збираємо через серверні метрики).
- Core Web Vitals — LCP, TTFB, CLS (аналіз TTFB LCP особливо важливий для першого враження).
Всі метрики збираються в реальному часі та візуалізуються в Grafana. Ми також налаштовуємо алерти: якщо час відповіді перевищує поріг, система сповіщає команду. Це дозволяє оперативно реагувати на проблеми. Наприклад, на одному проєкті ми побачили, що при 2000 RPS час відповіді API злітав з 200 мс до 3 с — причина виявилася в N+1 запиті до бази. Після оптимізації запитів через JOIN та кешування час повернувся до норми.
Чому обирають нас для навантажувального тестування?
Ми не просто запускаємо JMeter «за замовчуванням». Наші інженери сертифіковані за Apache JMeter (рівень Advanced) і мають досвід із розподіленим тестуванням на кластерах до 10 вузлів. Розподілений JMeter масштабується краще, ніж Locust, у 2 рази при навантаженні понад 1000 RPS — це підтверджено практикою. На відміну від абстрактної оцінки, ми надаємо конкретні графіки та цифри, інтегровані з вашою системою моніторингу. Гарантуємо, що всі сценарії повторювані та можуть бути запущені в CI/CD (Jenkins, GitLab CI).
Порівняння інструментів навантаження:
| Інструмент |
Максимальне навантаження (RPS) |
Мова скриптів |
Інтеграція з CI/CD |
Вартість |
| Apache JMeter |
10 000+ |
Java/Groovy |
Відмінна |
Безкоштовний |
| Locust |
5 000 |
Python |
Хороша |
Безкоштовний |
| k6 |
8 000 |
JavaScript |
Хороша |
Безкоштовний/Pro |
JMeter виграє за максимальним навантаженням та гнучкістю налаштування, особливо при розподіленому тестуванні. Наприклад, JMeter кращий за k6 у 3 рази на великих навантаженнях (понад 10 000 RPS).
Що входить у роботу?
- Розробка тест-плану (JMX) з 5–7 сценаріями навантаження, включаючи створення Thread Groups, налаштування таймерів, асершнів та слухачів.
- Параметризація через CSV-файли та змінні середовища для повторюваності сценаріїв.
- Налаштування Backend Listener для відправки метрик в InfluxDB.
- Створення дашборду Grafana з ключовими графіками.
- HTML-звіт з аналізом вузьких місць та рекомендаціями.
- Консультація за результатами та допомога в оптимізації.
Вартість навантажувального тестування розраховується індивідуально залежно від складності сценаріїв та необхідної конфігурації. Отримайте консультацію щодо навантажувального тестування вашого проєкту.
Як правильно налаштувати сценарій навантаження?
Правильне налаштування включає вибір адекватних параметрів: кількість користувачів має відповідати очікуваному піковому навантаженню, час розгону — не менше 30 секунд для плавного зростання, тривалість тесту — не менше 5 хвилин для стабілізації. Важливо також реалістично емулювати think time між діями користувача.
Строк реалізації
Розробка тест-плану JMeter з 5–7 сценаріями навантаження: від 3 до 6 днів. Якщо потрібне розподілене тестування або інтеграція з CI/CD — строк збільшується до 8–10 днів.
Зв'яжіться з нами, щоб обговорити ваш проєкт та отримати попередній план навантажувального тестування. Замовте тестування та будьте впевнені в продуктивності вашого сайту.
Чому юніт-тести важливі, але не панацея?
Баг, знайдений юніт-тестом, коштує хвилини виправлення. Той самий баг у продакшені — години інциденту, компенсації та втрата довіри. На проекті інтернет-магазину помилка в розрахунку знижки пройшла ручне тестування, потрапила в прод і за 4 години обробила 37 замовлень за нульовою ціною. Автотест на граничні випадки розрахунку зловив би її при першому ж push. Оцініть свій проект — ми проведемо аудит поточного покриття і дамо рекомендації.
Jest — стандарт для JavaScript/TypeScript, але юніт-тести виправдані тільки там, де є ізольована логіка: функції трансформації, валідатори, бізнес-правила, утиліти. Тестувати React-компоненти через Jest + Testing Library правильно для поведінкових тестів: «кнопка з'являється після завантаження», «форма показує помилку при порожньому email». Снепшот-тести (toMatchSnapshot) — пастка: вони ламаються при будь-якій зміні верстки і стають шумом, який розробники оновлюють не дивлячись. Покриття коду (code coverage) — погана метрика якості: 80% coverage можна отримати тестами, які нічого не перевіряють. Coverage показує, що код виконався, а не те, що він працює правильно.
| Критерій |
Jest |
Vitest |
| Швидкість для великих проектів |
Середня (Babel-трансформація) |
В 10–20 разів швидше (ES modules) |
| Інтеграція з Vite |
Через плагін |
Нативна |
| Монорепозиторії |
Вимагає конфігурації |
З коробки |
Vitest як альтернатива Jest для Vite-проектів: в 10–20 разів швидше завдяки нативним ES modules без трансформації через Babel. Для монорепозиторіїв з тисячами тестів різниця у швидкості відчутна. Детальніше про юніт-тестування.
Як налаштувати E2E тести, які не будуть flaky?
Playwright обійшов Cypress за ключовими параметрами: нативна підтримка multi-tab, multi-origin, iframe; паралельне виконання на рівні тестів; WebKit, Firefox, Chromium з коробки; немає iframe для додатку — тести працюють в реальному браузері.
Playwright codegen записує дії та генерує тест — хороша точка старту, але згенерований код потрібно рефакторити. Локатори за text content крихкі: getByRole('button', { name: 'Оформить заказ' }) — стійкіше, ніж locator('.btn-primary').
Page Object Model — стандарт організації E2E тестів. Кожна сторінка — окремий клас з методами замість прямих локаторів. Коли кнопка переїхала з хедера в сайдбар — міняємо в одному місці, не шукаємо по всіх тестах.
Як уникнути flaky тестів?
Типова проблема — flaky tests. Причини: race condition між запитом і рендером, анімації без очікування, залежність від зовнішніх API. Рішення: `page.waitForResponse()` замість `page.waitForTimeout()`, мокування зовнішніх API через `page.route()`.
// Погано
await page.click('#submit');
await page.waitForTimeout(2000);
await expect(page.locator('.success')).toBeVisible();
// Добре
await page.click('#submit');
await page.waitForResponse(resp =>
resp.url().includes('/api/orders') && resp.status() === 201
);
await expect(page.getByRole('alert', { name: /заказ создан/i })).toBeVisible();
Наші інженери гарантують стабільність тестів у CI. Документація Playwright — основний інструмент на проектах з мільйонами користувачів.
Навантажувальне тестування з k6
k6 — інструмент для навантажувального тестування з JavaScript API. Сценарії пишуться як код, версіонуються в git, запускаються в CI. Три основних сценарії:
- Spike test — різке зростання навантаження: 0 → 1000 користувачів за 30 секунд. Імітує запуск рекламної кампанії. Показує здатність системи реагувати на піки.
- Soak test — стабільне навантаження на 2–4 години. Виявляє memory leaks, connection pool exhaustion, деградацію продуктивності.
- Stress test — навантаження вище розрахункової (150–200% від очікуваного піку). Показує точку відмови та graceful degradation.
Порогові значення:
thresholds: {
http_req_duration: ['p95<500', 'p99<1000'],
http_req_failed: ['rate<0.01'],
}
p95 < 500ms означає: 95% запитів відповідають швидше півсекунди. Якщо поріг не виконується — k6 завершується з кодом помилки, CI-пайплайн падає.
На одному проекті інтернет-магазину ми виявили деградацію API на 4-й годині тесту: p95 зріс з 200ms до 2s через витік з'єднань. Після оптимізації клієнт заощадив значну суму на інцидентах та зайвих ресурсах. Отримайте аналогічний аудит вашого проекту — замовте навантажувальне тестування.
Як Core Web Vitals впливають на ранжування?
Google використовує Core Web Vitals у ранжуванні. Lighthouse CLI в CI-пайплайні: при кожному деплої перевіряємо, що LCP < 2.5s, CLS < 0.1, INP < 200ms. Детальніше про веб-продуктивність. Реальні проблеми, які Lighthouse знаходить:
- Hero image без атрибутів
width/height: CLS 0.35 при завантаженні.
- JavaScript-бандл 2.1MB синхронно блокує парсинг: INP 450ms.
- Шрифти без
font-display: swap: невидимий текст до завантаження шрифту (FOIT).
- Неоптимізований hero image 4MB: LCP 8.2s.
Lighthouse CI (lhci) зберігає історію метрик і надсилає коментар до PR з деградацією. За даними Google, 53% користувачів залишають сайт при завантаженні довше 3 секунд — наші тести запобігають таким втратам.
Піраміда тестування в проекті
| Рівень |
Інструмент |
Кількість |
Швидкість |
| Юніт |
Vitest/Jest |
Багато (тисячі) |
<5 хв |
| Інтеграція |
Vitest + supertest |
Середня |
5–15 хв |
| E2E |
Playwright |
Мало (happy path) |
10–30 хв |
| Навантаження |
k6 |
За розкладом |
30–60 хв |
| Продуктивність |
Lighthouse CI |
При кожному деплої |
5 хв |
Що входить в роботу?
- Аудит поточного покриття та визначення критичних user flows.
- Написання unit-тестів для ключової бізнес-логіки, інтеграційних тестів для API, E2E для сценаріїв користувача.
- Налаштування паралельного виконання в CI (sharded workers для Playwright).
- Навантажувальне тестування зі звітом та рекомендаціями.
- Документація за тест-кейсами, навчання вашої команди роботі з тестами.
- Гарантійна підтримка 1 місяць після впровадження.
Процес роботи
- Аналітика — аудит поточного тестування, виявлення слабких місць, визначення пріоритетів.
- Проектування — вибір інструментів, написання тест-плану, узгодження.
- Реалізація — написання тестів, інтеграція в CI.
- Тестування — прогін всіх рівнів, аналіз результатів, виправлення помилок.
- Деплой — запуск в прод, моніторинг метрик, навчання команди.
Терміни
Налаштування повного тест-пайплайна (Jest + Playwright + k6 + Lighthouse CI) з нуля: 2–4 тижні. Покриття E2E-тестами існуючого проекту (20–30 сценаріїв): 3–6 тижнів. Навантажувальне тестування зі звітом та рекомендаціями: 1–2 тижні. Вартість розраховується індивідуально після аудиту.
Готові обговорити ваш проект? Залиште заявку — ми проведемо аудит поточного тестування безкоштовно і запропонуємо план з економією до 60% часу на інциденти. Отримайте консультацію з тестування веб-додатків — напишіть нам.