1. Введение в нагрузочное тестирование: цели, виды и основные понятия
Введение в нагрузочное тестирование: цели, виды и основные понятия
Добро пожаловать на курс «Основы нагрузочного тестирования ПО». Это первая статья, в которой мы заложим фундамент для всех последующих занятий. Мы разберемся, зачем ломать приложения большим количеством запросов, какие метрики действительно важны и чем стресс-тестирование отличается от тестирования стабильности.
Что такое нагрузочное тестирование?
Представьте, что вы построили мост. Он отлично держит вес одного пешехода или даже легкового автомобиля. Но что произойдет, если на мост одновременно заедут сто грузовиков? Или если по нему будет маршировать колонна солдат в течение суток без остановки?
В разработке программного обеспечения происходит то же самое. Приложение может идеально работать на компьютере разработчика или при тестировании одним QA-инженером. Но реальный мир суров: пользователи приходят тысячами, базы данных разрастаются, а сетевые каналы забиваются.
Нагрузочное тестирование (Performance Testing) — это вид нефункционального тестирования, который проводится для определения производительности системы под определенной нагрузкой.
!Схема процесса: генераторы нагрузки отправляют запросы к системе для проверки её поведения.
Зачем это нужно?
Главная цель — не просто «уронить» сервер (хотя это тоже бывает весело), а получить ответы на конкретные вопросы:
* Скорость: Отвечает ли система достаточно быстро? * Масштабируемость: Сможет ли система обработать в 10 раз больше пользователей, если мы добавим в 10 раз больше серверов? * Стабильность: Не упадет ли приложение через 24 часа непрерывной работы? * Надежность: Что произойдет при ошибке в базе данных или отказе одного из узлов?
Основные понятия и метрики
Чтобы говорить о производительности, нам нужен общий язык. В нагрузочном тестировании всё опирается на цифры. Давайте разберем ключевые метрики.
1. RPS (Requests Per Second)
Это количество запросов, которое система обрабатывает в секунду. Это основной показатель интенсивности нагрузки.
Формула расчета проста:
Где — количество запросов в секунду, — общее количество отправленных запросов, а — время в секундах, за которое эти запросы были отправлены.
Иногда используется термин TPS (Transactions Per Second). Разница в том, что транзакция может состоять из нескольких запросов (например, «положить товар в корзину» — это одна бизнес-транзакция, но технически она может включать запросы к базе данных, сервису склада и сервису рекомендаций).
2. Время отклика (Response Time / Latency)
Это время, прошедшее с момента отправки запроса до получения ответа. Казалось бы, всё просто: чем меньше, тем лучше. Но здесь кроется главная ловушка новичков — использование среднего арифметического.
> Среднее время отклика — это «средняя температура по больнице». Оно скрывает проблемы.
Если 99 пользователей получили ответ за 1 секунду, а один пользователь — за 100 секунд, среднее будет приемлемым, но один клиент уйдет в ярости.
3. Перцентили (Percentiles)
Для объективной оценки времени отклика используют перцентили. Это понятие из математической статистики.
Обозначается как (или -й перцентиль). Например, (95-й перцентиль).
Математически это можно выразить так. Пусть у нас есть упорядоченный по возрастанию ряд значений времени отклика . Тогда — это такое значение, ниже которого находится процентов всех наблюдений.
Где — значение -го перцентиля, — функция получения значения из выборки по индексу, — процент (например, 90 или 99), а — общее количество измерений.
Простыми словами: Если мс, это значит, что 95% всех запросов выполнились быстрее или ровно за 200 миллисекунд, и только 5% пользователей ждали дольше. Это гораздо честнее, чем среднее значение.
4. Виртуальные пользователи (Virtual Users / VUsers)
Это потоки, которые эмулируют поведение реальных людей. Важно понимать разницу между RPS и виртуальными пользователями. 100 пользователей могут генерировать 1000 RPS (если они очень активны) или всего 10 RPS (если они «думают» перед каждым кликом).
Виды нагрузочного тестирования
Не вся нагрузка одинакова. В зависимости от целей, мы выбираем разные профили подачи нагрузки.
!Графическое представление профилей нагрузки для разных видов тестирования.
1. Тестирование производительности (Load Testing)
Это «обычное» нагрузочное тестирование. Мы подаем ожидаемую нагрузку (например, ту, которая планируется в продакшене) и проверяем, справляется ли система.
* Цель: Убедиться, что система соответствует требованиям (SLA). * Вопрос: «Выдержим ли мы 1000 пользователей с откликом не более 2 секунд?»
2. Стресс-тестирование (Stress Testing)
Здесь мы намеренно ищем предел прочности. Мы увеличиваем нагрузку до тех пор, пока система не сломается.
* Цель: Найти точку отказа (bottleneck) и проверить восстанавливаемость системы после сбоя. * Вопрос: «При какой нагрузке сервер упадет? И поднимется ли он сам, когда нагрузка спадет?»
3. Тестирование стабильности (Stability / Soak Testing)
Длительное тестирование под средней нагрузкой. Оно может длиться часы или даже дни.
* Цель: Найти утечки памяти (memory leaks), проблемы с переполнением диска или логов. * Вопрос: «Не деградирует ли производительность системы через 24 часа работы?»
4. Пиковое тестирование (Spike Testing)
Резкое увеличение нагрузки за короткое время и такой же резкий спад. Эмуляция ситуаций вроде «Черной пятницы» или выхода новой серии популярного сериала.
* Цель: Проверить, как система реагирует на резкие скачки и успевает ли масштабироваться (Auto-scaling).
5. Тестирование масштабируемости (Scalability Testing)
Проверка способности системы увеличивать производительность при добавлении ресурсов.
Формально эффективность масштабирования можно оценить так:
Где — эффективность, — производительность (например, в RPS), а — количество ресурсов (например, CPU или количество серверов). Индексы 1 и 2 обозначают состояния до и после масштабирования.
Инструменты
В этом курсе мы не будем привязываться к одному инструменту, но вам стоит знать основных игроков на рынке:
Заключение
Нагрузочное тестирование — это не просто запуск скрипта. Это инженерная дисциплина, требующая понимания архитектуры, математики и поведения пользователей. Сегодня мы изучили терминологию и виды тестов. В следующих статьях мы перейдем к подготовке профиля нагрузки и написанию первых скриптов.
Помните: > «Преждевременная оптимизация — корень всех зол». > — Дональд Кнут
Но отсутствие тестирования перед релизом — это корень ночных звонков от разгневанного заказчика.