Уявіть: ваш мобільний додаток потрапляє в топ App Store, за ніч приходить 50 000 нових користувачів. Вранці ви бачите даунтайм бекенду — помилки 504 на всіх екранах. Без навантажувального тестування бекенд не витримає пікових сплесків від push-повідомлень або рекламної кампанії. Ми проводимо повний цикл тестування: пишемо сценарії на k6, JMeter або Gatling, налаштовуємо профілі навантаження, аналізуємо вузькі місця і даємо рекомендації щодо оптимізації. k6 у 3 рази швидше запускає сценарії порівняно з JMeter на великих обсягах, а його сценарії компактні та легко читаються. Нижче розберемо процес на прикладі типового мобільного API.
Чому навантажувальне тестування API критичне для мобільного додатку?
Мобільний трафік відрізняється від вебу: пристрої надсилають безліч одночасних запитів, працюють у фоновому режимі, використовують непередбачувані мережеві умови. Без профілювання навантаження бекенд може не витримати пікових навантажень. Типова проблема — бекенд розрахований на середнє навантаження, а не на пікові сплески від push-повідомлень або рекламної кампанії.
Як ми обираємо інструмент?
Три основні інструменти, кожен під свою задачу:
| Інструмент | Мова сценаріїв | Сильна сторона |
|---|---|---|
| k6 | JavaScript | Сучасний, CI-friendly, низький поріг входу |
| JMeter | XML / GUI | Зрілий, багаті плагіни, visual тест-дизайн |
| Gatling | Scala / DSL | Точні метрики, зручні HTML-звіти |
Для більшості мобільних API обираємо k6 — компактні сценарії, нативна інтеграція з Grafana, запуск у Docker без JVM. Фахівці з досвідом понад 5 років налаштовують інструмент під вашу архітектуру.
Написання k6-сценарію для мобільного API
Типовий мобільний API має особливості: JWT-авторизація з коротким TTL, refresh-токени, gzip-стиснення відповідей, іноді GraphQL замість REST. Сценарій має це враховувати.
import http from 'k6/http'; import { check, sleep } from 'k6'; import { SharedArray } from 'k6/data'; // Тестовые аккаунты из CSV — не один аккаунт для всех VU const users = new SharedArray('users', () => open('./test_users.csv').split('\n').map(line => { const [email, password] = line.split(','); return { email, password }; })); export const options = { stages: [ { duration: '2m', target: 100 }, // разгон { duration: '5m', target: 500 }, // плато { duration: '2m', target: 1000 }, // пик { duration: '1m', target: 0 }, // спад ], thresholds: { http_req_duration: ['p(95)<500'], // 95% запросов < 500ms http_req_failed: ['rate<0.01'], // менее 1% ошибок }, }; export default function () { const user = users[__VU % users.length]; // Логин + получение токена const loginRes = http.post('https://api.example.com/v1/auth/login', JSON.stringify({ email: user.email, password: user.password, }), { headers: { 'Content-Type': 'application/json' }, }); check(loginRes, { 'login 200': (r) => r.status === 200, 'has token': (r) => r.json('data.access_token') !== undefined, }); const token = loginRes.json('data.access_token'); sleep(1); // имитируем поведение пользователя // Загрузка ленты const feedRes = http.get('https://api.example.com/v1/feed?page=1&limit=20', { headers: { Authorization: `Bearer ${token}` }, }); check(feedRes, { 'feed 200': (r) => r.status === 200, 'feed has items': (r) => r.json('data.items').length > 0, }); sleep(2); } Офіційна документація k6 рекомендує використовувати SharedArray для розподілу тестових даних між віртуальними користувачами.
SharedArray для користувачів — критично. Якщо всі Virtual Users використовують один акаунт, бекенд може кешувати сесію, і результати будуть некоректними.
Які профілі навантаження потрібні?
Мобільний трафік нерівномірний. Ми визначаємо чотири типові профілі:
Детальніше про профілі навантаження
| Профіль | Ціль | Тривалість | Критерій успіху |
|---|---|---|---|
| Базовий | Стабільна робота 24/7 | 1–2 години | p95 < 300 ms, error rate < 0.1% |
| Піковий | Ранковий/вечірній сплеск | 30 хвилин | p95 < 500 ms, error rate < 1% |
| Стрес-тест | Пошук точки відмови | 10–20 хвилин | error rate < 5% |
| Soak-тест | Виявлення витоків | 4–8 годин | latency не зростає |
Базовий — стабільне навантаження 24/7. Перевіряємо, що при середньому трафіку p95 < 300 ms.
Піковий — ранковий та вечірній сплеск. Ступінчасте зростання від 10% до 300% середнього за 5 хвилин.
Стрес-тест — навмисно перевищуємо розрахунковий максимум, шукаємо точку відмови. До тих пір, поки error rate не перевищить 5% або latency не зросте в 10 разів.
Soak-тест — 70% від пікового протягом 4–8 годин. Ловить витоки пам'яті на бекенді, переповнення пулу з'єднань до БД, ротацію логів.
Аналіз результатів: що шукати в метриках
k6 надсилає метрики в Grafana через InfluxDB або вбудований Prometheus remote write:
k6 run --out influxdb=http://localhost:8086/k6 scenario.js Після прогону дивимося на:
-
http_req_durationза перцентилями (p50, p90, p95, p99) -
http_req_blocked— час у черзі (високе значення = connection pool вичерпано) -
http_req_connecting— час встановлення TCP-з'єднання (високе = немає keep-alive) -
data_received— обсяг даних (неочікувано великий = немає gzip або зайві поля у відповіді)
Типові вузькі місця в мобільному API:
- N+1 запити до БД при завантаженні стрічки з вкладеними об'єктами
- Відсутність індексу на
user_id+created_atв таблиці постів - Синхронне надсилання push-повідомлень у тілі запиту замість фонової черги
Запуск у CI
- name: Run k6 load test uses: grafana/[email protected] with: filename: tests/load/api_test.js flags: --duration 5m --vus 100 env: K6_CLOUD_TOKEN: ${{ secrets.K6_CLOUD_TOKEN }} На CI запускаємо полегшений профіль (100 VU, 5 хвилин) — для базової регресії по продуктивності. Повний стрес-тест — за розкладом або перед релізом.
Що входить у роботу?
Ми надаємо повний пакет:
- Сценарії навантажувального тестування під ключ (k6/JMeter/Gatling)
- Звіт з метриками та графіками (Grafana dashboard)
- Рекомендації з оптимізації вузьких місць
- Інтеграція у ваш CI/CD (GitHub Actions, GitLab CI, Jenkins)
- Консультація команди backend-розробників за підсумками
- Гарантія на коректність сценаріїв: безкоштовна доопрацювання, якщо бекенд змінився
Як написати сценарій для k6: покрокова інструкція
- Підготувати тестові дані. Сформуйте CSV-файл з обліковими записами користувачів (email, password) — мінімум 100 записів.
- Створити сценарій. Імпортуйте модулі k6, визначте опції (stages, thresholds) та основну функцію з авторизацією та типовими запитами.
- Налаштувати середовище. Встановіть k6 локально або в Docker, підготуйте InfluxDB/Grafana для збору метрик.
- Запустити прогін. Виконайте команду
k6 run script.jsз потрібними параметрами. - Проаналізувати результати. Вивчіть дашборди, знайдіть вузькі місця.
Досвід компанії
Ми займаємося навантажувальним тестуванням понад 5 років. Виконали більше 50 проектів для fintech, e-commerce та social media додатків. Сертифіковані фахівці з k6 та JMeter гарантують об'єктивні результати.
Терміни та вартість
Орієнтовні терміни: 3–7 днів на написання сценаріїв, прогін та звіт. Вартість одного циклу тестування розраховується індивідуально після аналізу вашої API-документації. Економія на інфраструктурі після нашої оптимізації сягає 40%.
Зв'яжіться з нами для консультації — ми безкоштовно оцінимо ваш проект. Замовте навантажувальне тестування, щоб уникнути даунтайму та втрати користувачів.







