Навантажувальне тестування API: k6, JMeter, Gatling

Уявіть: ваш мобільний додаток потрапляє в топ App Store, за ніч приходить 50 000 нових користувачів. Вранці ви бачите даунтайм бекенду — помилки 504 на всіх екранах. Без навантажувального тестування бекенд не витримає пікових сплесків від push-повідомлень або рекламної кампанії. Ми проводимо повний

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Навантажувальне тестування API: k6, JMeter, Gatling
Складний
~3-5 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Уявіть: ваш мобільний додаток потрапляє в топ 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: покрокова інструкція

  1. Підготувати тестові дані. Сформуйте CSV-файл з обліковими записами користувачів (email, password) — мінімум 100 записів.
  2. Створити сценарій. Імпортуйте модулі k6, визначте опції (stages, thresholds) та основну функцію з авторизацією та типовими запитами.
  3. Налаштувати середовище. Встановіть k6 локально або в Docker, підготуйте InfluxDB/Grafana для збору метрик.
  4. Запустити прогін. Виконайте команду k6 run script.js з потрібними параметрами.
  5. Проаналізувати результати. Вивчіть дашборди, знайдіть вузькі місця.

Досвід компанії

Ми займаємося навантажувальним тестуванням понад 5 років. Виконали більше 50 проектів для fintech, e-commerce та social media додатків. Сертифіковані фахівці з k6 та JMeter гарантують об'єктивні результати.

Терміни та вартість

Орієнтовні терміни: 3–7 днів на написання сценаріїв, прогін та звіт. Вартість одного циклу тестування розраховується індивідуально після аналізу вашої API-документації. Економія на інфраструктурі після нашої оптимізації сягає 40%.

Зв'яжіться з нами для консультації — ми безкоштовно оцінимо ваш проект. Замовте навантажувальне тестування, щоб уникнути даунтайму та втрати користувачів.