Тестирование производительности
Тестирование производительности охватывает все тесты, которые измеряют скорость, стабильность и масштабируемость приложения. Это один из самых важных видов нефункциональных тестов и гарантирует, что программное обеспечение остаётся производительным и стабильным под реальной нагрузкой.
Суть вопроса
- Тестирование производительности измеряет скорость, стабильность и масштабируемость.
- Виды: нагрузочное, стресс-тестирование, тестирование скачков нагрузки, тестирование выносливости, объёмное тестирование, тестирование масштабируемости.
- Метрики: время ответа, пропускная способность, частота ошибок, использование ресурсов.
- Инструменты: k6, JMeter, Gatling, Locust.
- Тестирование производительности входит в Performance Engineering.
Что такое тестирование производительности и зачем оно нужно?
Тестирование производительности проверяет, как приложение ведёт себя под разной нагрузкой. Оно отвечает на вопросы: насколько быстро реагирует система? сколько запросов в секунду она обрабатывает? насколько она стабильна на протяжении длительного времени? какие ресурсы при этом потребляются?
Типичные цели тестирования производительности:
- Обеспечить пользовательский опыт: длительные времена загрузки отпугивают пользователей и снижают коэффициент конверсии.
- Найти узкие места: базы данных, API и алгоритмы часто становятся причиной проблем с производительностью.
- Проверить SLA: согласованные времена ответа и доступность должны соблюдаться.
- Планировать ёмкость: сколько пользователей может обработать система? когда требуется масштабирование?
- Проверить стабильность: работает ли система длительное время без утечек ресурсов?
Виды тестов производительности
Load Testing
Нагрузочное тестирование проверяет поведение системы под ожидаемой, реалистичной нагрузкой. Оно показывает, работает ли система стабильно и быстро в нормальном режиме. Например: 1000 одновременных пользователей, время ответа менее 500 мс.
Stress Testing
Стресс-тестирование превосходит ожидаемую нагрузку. Оно выявляет пределы системы и показывает, как она реагирует на перегрузку. Например: постепенное увеличение нагрузки, пока система не сломается.
Spike Testing
Тестирование скачков нагрузки создаёт очень быстрые, экстремальные пики нагрузки. Оно имитирует, например, внезапный наплыв пользователей в начале распродажи. Показывает, как хорошо система переносит резкие изменения нагрузки.
Endurance Testing (Soak Testing)
Тестирование выносливости запускает приложение под постоянной нагрузкой в течение длительного периода. Помогает выявить утечки ресурсов: растущее потребление памяти, утечки соединений, переполнение логов.
Volume Testing
Объёмное тестирование проверяет систему с большими объёмами данных. Проверяет, остаётся ли база данных и приложение производительными с миллионами записей.
Scalability Testing
Тестирование масштабируемости проверяет, насколько хорошо система масштабируется при добавлении дополнительных ресурсов. Показывает, улучшает ли горизонтальное или вертикальное масштабирование производительность.
Важные метрики
Время ответа
Время ответа это длительность от момента запроса до получения полного ответа. Часто анализируется как среднее значение, медиана или процентиль. 95-й процентиль особенно важен, так как показывает, насколько медленны запросы для большинства пользователей.
Пропускная способность
Пропускная способность показывает, сколько запросов или транзакций система может обработать за определённый период. Измеряется в запросах в секунду или транзакциях в минуту.
Частота ошибок
Частота ошибок это доля запросов, которые не были успешно обработаны. Внезапный скачок указывает на узкое место.
Использование ресурсов
Использование ресурсов включает загрузку CPU, оперативную память, пропускную способность сети и дисковый ввод-вывод. Помогает определить причину проблем с производительностью.
Одновременные пользователи
Одновременные пользователи это активные пользователи, которые одновременно отправляют запросы. Они являются основой профилей нагрузки.
Практический пример
Следующий пример показывает типичный план тестирования производительности для веб-приложения. Он демонстрирует, как различные виды тестов производительности работают вместе и как метрики и цели взаимодействуют.
Цели:
- Время ответа менее 200 мс
- 95-й процентиль менее 500 мс
- Частота ошибок менее 0,1 процента
- Пропускная способность 1000 запросов в секунду
Тесты:
- Нагрузочное тестирование при нормальной нагрузке
- Стресс-тестирование до предела
- Тестирование выносливости в течение 24 часов
Почему эти тесты?
- Нагрузочное тестирование: проверяет, достигает ли система целей при ожидаемой нагрузке в 1000 запросов в секунду. Это обычный режим работы.
- Стресс-тестирование: выявляет предел системы. Что происходит при 2000 или 5000 запросов в секунду? при какой нагрузке начинает расти частота ошибок?
- Тестирование выносливости: работает ли система стабильно под нагрузкой спустя 24 часа? есть ли утечки памяти или соединений?
Метрики собираются непрерывно во время теста и сравниваются с целями. Отклонения анализируются и служат основой для оптимизации.
Важные инструменты
k6
k6 это современный инструмент с открытым исходным кодом для тестирования производительности, разработанный Grafana Labs. Тесты пишутся на JavaScript и могут быть интегрированы в CI/CD-пайплайны.
Apache JMeter
JMeter один из самых известных инструментов для тестирования производительности. Предоставляет графический интерфейс и поддерживает множество протоколов: HTTP, SOAP, JDBC и JMS.
Gatling
Gatling это мощный инструмент, тесты в котором пишут на Scala, Kotlin или Java. Отличается высокой производительностью генератора нагрузки.
Locust
Locust это инструмент на основе Python с простым созданием скриптов. Хорошо подходит для команд, которые уже используют Python.
Преимущества и недостатки
| Преимущества | Недостатки |
|---|---|
| Улучшенный пользовательский опыт за счёт оптимизированного времени ответа | Сложная подготовка тестовой среды |
| Раннее выявление узких мест | Требуется реалистичная среда |
| Проверка SLA и планирование ёмкости | Затраты на подготовку тестовых данных и сценариев |
| Объективное измерение производительности | Инструменты и инфраструктура требуют затрат |
| Снижение времени простоя в production | Интерпретация результатов требует опыта |
| Основа для принятия решений о масштабировании | Тесты должны повторяться регулярно |
Best Practices
- Определить цели: установить чёткие SLA и метрики перед началом тестирования.
- Среда, близкая к production: тестовая среда должна быть похожа на production.
- Реалистичные тестовые данные: использовать анонимизированные данные из production.
- Мониторинг: собирать метрики сервера и приложения во время теста.
- Регулярное повторение: запускать тесты производительности при каждом значимом изменении.
- Интеграция в CI/CD: автоматически выполнять тесты при релизах.
- Анализировать узкие места: не только измерять, но и выявлять причины проблем.
Ключевые моменты для подготовки
- Performance Testing: обобщающий термин для тестов, которые измеряют скорость, стабильность и масштабируемость.
- Load Testing: тестирование при ожидаемой, реалистичной нагрузке.
- Stress Testing: тестирование сверх ожидаемого диапазона нагрузки.
- Spike Testing: имитация внезапных экстремальных скачков нагрузки.
- Endurance Testing: продолжительный тест для обнаружения утечек ресурсов.
- Volume Testing: тестирование с большими объёмами данных.
- Scalability Testing: тестирование масштабируемости при добавлении ресурсов.
- Важные метрики: время отклика, пропускная способность, частота ошибок, использование ресурсов, количество одновременных пользователей.
- Процентили: 95-й процентиль более информативен, чем среднее значение.
- Основные инструменты: k6, JMeter, Gatling, Locust.
- SLA: соглашение об уровне обслуживания с согласованными целями производительности.
- Performance Engineering: комплексный подход к производительности, выходящий за рамки тестирования.
- Задержка: время между запросом и первым ответом.
Основные источники
Часто задаваемые вопросы
Что такое Performance Testing?
Performance Testing – это обобщающий термин для тестов, которые измеряют скорость, стабильность и масштабируемость приложения. Он гарантирует, что программное обеспечение остаётся быстродействующим при реальной нагрузке.
Что такое Load Testing?
Load Testing проверяет поведение приложения при ожидаемой, реалистичной нагрузке. Он показывает, работает ли система стабильно и быстро в нормальных условиях.
Что такое Stress Testing?
Stress Testing превышает ожидаемую нагрузку и находит пределы системы. Он показывает, как система ведёт себя при перегрузке и когда она выходит из строя.
Что такое Spike Testing?
Spike Testing создаёт внезапные, экстремальные скачки нагрузки. Например, он имитирует наплыв посетителей в интернет-магазин в начале распродажи и проверяет, как система это выдерживает.
Что такое Endurance Testing?
Endurance Testing запускает приложение на длительный период при постоянной нагрузке. Он предназначен для обнаружения утечек ресурсов, таких как рост памяти или утечки соединений.
Какие метрики производительности существуют?
Важные метрики – это время отклика, пропускная способность, частота ошибок, использование ресурсов и количество одновременных пользователей. Они помогают объективно оценить производительность.
Что такое 95-й процентиль?
95-й процентиль означает, что 95% запросов быстрее этого значения. Он более информативен, чем среднее значение, потому что игнорирует выбросы.
Что такое масштабируемость?
Масштабируемость – это способность системы справляться с растущей нагрузкой, добавляя ресурсы. Различают горизонтальное масштабирование (добавление серверов) и вертикальное (усиление существующего сервера).
Что такое Volume Testing?
Volume Testing проверяет систему с большими объёмами данных. Он показывает, остаётся ли база данных и приложение быстродействующими при миллионах записей.
Какие инструменты есть для Performance Testing?
Популярные инструменты – k6, Apache JMeter, Gatling и Locust. k6 и Locust основаны на скриптах, JMeter предоставляет графический интерфейс.
Что такое узкое место производительности?
Узкое место производительности – это компонент, который ограничивает общую скорость приложения, например медленная база данных или неоптимизированный алгоритм.
Что такое задержка?
Задержка – это время между запросом и первым ответом. Она является важным показателем пользовательского опыта.
Что такое SLA?
SLA, или Service Level Agreement, – это соглашение с определёнными целями производительности, такими как время отклика, доступность и пропускная способность.
Почему важен Performance Monitoring?
Performance Monitoring предоставляет реальные данные о производительности из боевого окружения и помогает рано обнаружить узкие места и деградацию производительности.
Что такое Performance Engineering?
Performance Engineering – это комплексный подход к производительности, выходящий за рамки тестирования, включающий архитектуру, дизайн и постоянный мониторинг.
Что такое Scalability Testing?
Scalability Testing проверяет, насколько хорошо система масштабируется при добавлении ресурсов. Он показывает, улучшает ли горизонтальное или вертикальное масштабирование производительность.
Какова разница между горизонтальным и вертикальным масштабированием?
Вертикальное масштабирование увеличивает ресурсы одного сервера, например CPU и RAM. Горизонтальное масштабирование добавляет дополнительные серверы и распределяет нагрузку.
Что такое пропускная способность?
Пропускная способность – это количество запросов или транзакций, которые система может обработать за определённый период. Она измеряется в запросах в секунду.
Какова разница между Performance Testing и Load Testing?
Performance Testing – это обобщающий термин. Load Testing – это конкретный тип Performance Testing, который проверяет систему при ожидаемой нагрузке.
Когда следует проводить Performance Tests?
Performance Tests следует проводить перед релизами, при изменении архитектуры, при проблемах с производительностью или перед ожидаемыми скачками трафика.
Продолжение пути обучения Software Testing
Следующий материал в пути обучения Software Testing посвящен Security Testing — как Security Testing выявляет уязвимости безопасности.



