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

Коли мобільний застосунок стикається з піковим навантаженням, бекенд може не витримати, і користувачі бачать помилки замість екранів. Ми проводимо навантажувальне тестування API за допомогою k6, JMeter та Gatling, виявляючи вузькі місця та готуючи систему до сплесків трафіку. Наша команда реалізує проєкт під ключ — від розробки сценаріїв до аналізу результатів і рекомендацій, забезпечуючи стабільну роботу вашого сервісу.

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

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

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

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

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

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

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

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

  • Розробка мобільного додатка для компанії FEEDME
    Розробка мобільного додатка для компанії FEEDME
    1009
  • Розробка мобільного додатку для компанії XOOMER
    Розробка мобільного додатку для компанії XOOMER
    902
  • Розробка мобільного додатку для компанії RHL
    Розробка мобільного додатку для компанії RHL
    1331
  • Розробка мобільного додатку для компанії ZIPPY
    Розробка мобільного додатку для компанії ZIPPY
    1179
  • Розробка мобільного додатку для компанії Affhome
    Розробка мобільного додатку для компанії Affhome
    1106
  • Розробка мобільного додатку для компанії FLAVORS
    Розробка мобільного додатку для компанії FLAVORS
    713