Нагрузочное тестирование API мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Нагрузочное тестирование API мобильного приложения
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Нагрузочное тестирование API мобильного приложения

Мобильное приложение с 10 000 активных пользователей в пике — это не то же самое, что 10 000 одновременных HTTP-запросов. Но близко. Экраны загружаются параллельно, фоновая синхронизация WorkManager и BGTaskScheduler работает независимо от пользовательских действий, push-уведомление может одновременно поднять тысячи пользователей в приложение. Без нагрузочного тестирования API бэкенд ломается в самый неудобный момент.

Выбор инструмента

Три основных варианта, каждый со своей нишей:

Инструмент Язык сценариев Сильная сторона
k6 JavaScript Современный, CI-friendly, низкий порог входа
JMeter XML / GUI Зрелый, богатые плагины, visual тест-дизайн
Gatling Scala / DSL Точные метрики, удобные HTML-отчёты

Для большинства мобильных API выбираем k6 — компактные сценарии, нативная интеграция с Grafana, запуск в Docker без JVM.

Написание 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);
}

SharedArray для пользователей — критично. Если все Virtual Users используют один аккаунт, бэкенд может кэшировать сессию и результаты будут некорректными.

Профили нагрузки для мобильных приложений

Мобильный трафик неравномерен. Три типичных профиля:

Базовый — стабильная нагрузка 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 минут) — для базовой регрессии по производительности. Полный стресс-тест — по расписанию или перед релизом.

Сроки

3–5 дней — написание сценариев для основных эндпоинтов, настройка профилей нагрузки, первый прогон, анализ результатов и отчёт с рекомендациями. Стоимость рассчитывается индивидуально после изучения API-документации.