Какие основные виды тестирования производительности существуют?

Ответ

Тестирование производительности — это не один тип теста, а целое семейство, каждое из которых решает свою задачу. Основные виды:

Вид тестирования Цель Ключевой вопрос Пример сценария
Нагрузочное (Load Testing) Проверить поведение системы под ожидаемой (пиковой) нагрузкой. Выдерживает ли система планируемое количество пользователей? 1000 пользователей одновременно просматривают каталог товаров и добавляют их в корзину в течение 1 часа. Проверяются время отклика и процент ошибок.
Стресс-тестирование (Stress Testing) Найти предел производительности и точку отказа системы, а также проверить механизмы восстановления. Как система ведет себя за пределами нормальной нагрузки? Где она ломается? Постепенно увеличиваем нагрузку с 1000 до 5000 пользователей, пока сервер не начнет возвращать ошибки 5xx. Смотрим, как система восстанавливается после снятия нагрузки.
Тестирование стабильности/надежности (Soak/Endurance Testing) Обнаружить проблемы, возникающие при длительной работе под нагрузкой (утечки памяти, фрагментация, рост логов). Стабильна ли система при длительной эксплуатации? 500 пользователей непрерывно работают с приложением в течение 72 часов. Мониторим потребление памяти (RAM) и утилизацию CPU.
Тестирование масштабируемости (Scalability Testing) Определить, как увеличение ресурсов (серверов, CPU, RAM) влияет на производительность. Позволяет ли архитектура системы эффективно масштабироваться? Проводим нагрузочный тест на текущей конфигурации (2 сервера). Затем добавляем еще 2 сервера и повторяем тест. Ожидаем, что пропускная способность (throughput) увеличится почти в 2 раза.
Spike Testing (Тестирование на всплеск нагрузки) Проверить реакцию системы на резкое, кратковременное увеличение нагрузки. Как система справляется с внезапным наплывом пользователей? Нагрузка резко возрастает с 100 до 2000 пользователей за 1 минуту, затем так же резко падает.

Практический пример: конфигурация Thread Group в Apache JMeter для нагрузочного теста.

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="E-Commerce Load Test">
  <!-- Количество виртуальных пользователей (потоков) -->
  <intProp name="ThreadGroup.num_threads">1000</intProp>
  <!-- Время (в секундах) на «разгон» до полного количества пользователей -->
  <intProp name="ThreadGroup.ramp_time">300</intProp>
  <!-- Количество повторений (0 = бесконечно, пока не остановят) -->
  <intProp name="ThreadGroup.loop_count">0</intProp>
  <!-- Длительность теста (секунд) -->
  <stringProp name="ThreadGroup.duration">3600</stringProp>
</ThreadGroup>

Ключевые метрики, которые собирают во всех этих тестах: время отклика (Response Time), пропускная способность (Throughput, запр./сек), процент ошибок (Error Rate), утилизация ресурсов (CPU, RAM, I/O, Network).

Ответ 18+ 🔞

Слушай, а вот это самое тестирование производительности — это ж не какая-то одна хуйня, а целая банда родственников, и у каждого своя миссия на этом празднике жизни. Давай разбираться, пока не охуели.

Вот смотри, таблица, блядь, чтобы не запутаться:

Вид тестирования Цель Ключевой вопрос Пример сценария
Нагрузочное (Load Testing) Понять, как система себя ведёт под нормальной, ожидаемой нагрузкой. Не упадёт ли? Выдержит ли наша хрень планируемое количество юзеров, или они нам всё сломают? 1000 человек одновременно лазают по каталогу и тыкают «в корзину» целый час. Смотрим, не тормозит ли всё в пизду и сколько ошибок вылезает.
Стресс-тестирование (Stress Testing) Найти предел, где всё ебётся, и посмотреть, как система потом отходит. А что будет, если навалиться сверх нормы? Где конкретно она сломается и как потом оживёт? Плавно накручиваем нагрузку с 1000 до 5000 юзеров, пока сервера не начнут плеваться ошибками «500 Internal Server Error». Потом снимаем нагрузку и смотрим, не сдохла ли система насовсем.
Тестирование стабильности/надежности (Soak/Endurance Testing) Поймать проблемы, которые всплывают только со временем: утечки памяти, забитые логи, фрагментация — всякое такое. А не сольётся ли система через сутки-двое работы? 500 пользователей без остановки дёргают приложение 72 часа. Сидим, смотрим, не жрёт ли память как сумасшедшая и не греется ли процессор до состояния ядерного гриля.
Тестирование масштабируемости (Scalability Testing) Понять, помогает ли добавление железа (серверов, ядер, памяти) или мы просто деньги на ветер кидаем. Масштабируется ли наша архитектура, или мы упёрлись в потолок? Гоняем тест на двух серверах, запоминаем цифры. Потом добавляем ещё два и гоняем тот же тест. Если всё правильно, пропускная способность должна вырасти почти вдвое, а не остаться на том же уровне, блядь.
Spike Testing (Тестирование на всплеск нагрузки) Проверить, что будет, если нагрузка прилетит резко и нежданно, как хуй из-за угла. А справится ли система, если все пользователи вдруг одновременно решат зайти, как на распродажу? Нагрузка скачком с 100 человек взлетает до 2000 за минуту, потом так же резко падает. Смотрим, не ляжет ли всё в этот момент.

А вот, например, как это может выглядеть в Apache JMeter для нагрузочного теста. Код не трогаем, он святой:

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="E-Commerce Load Test">
  <!-- Количество виртуальных пользователей (потоков) -->
  <intProp name="ThreadGroup.num_threads">1000</intProp>
  <!-- Время (в секундах) на «разгон» до полного количества пользователей -->
  <intProp name="ThreadGroup.ramp_time">300</intProp>
  <!-- Количество повторений (0 = бесконечно, пока не остановят) -->
  <intProp name="ThreadGroup.loop_count">0</intProp>
  <!-- Длительность теста (секунд) -->
  <stringProp name="ThreadGroup.duration">3600</stringProp>
</ThreadGroup>

И во всех этих танцах с бубнами мы смотрим на одни и те же ключевые метрики, ёпта: время отклика (Response Time — сколько ждать), пропускную способность (Throughput — сколько запросов в секунду пролетает), процент ошибок (Error Rate — сколько всё-таки сломалось) и утилизацию ресурсов (CPU, RAM, I/O, Network — чтобы железо не плавилось). Вот так вот, в рот меня чих-пых.