Перейти к основному содержимому

6.08. Нагрузочное и стресс-тестирование

Тестировщику Разработчику Аналитику

Нагрузочное и стресс-тестирование

что такое нагрузочное тестирование
что такое стресс-тестирование
Нагрузочное тестирование (load testing) и стресс-тестирование (stress testing) относятся к классу нефункционального тестирования, направленного на оценку поведения системы под определённой или экстремальной нагрузкой. Цель нагрузочного тестирования — определить, как система справляется с ожидаемым объёмом пользовательских запросов в штатном режиме. Стресс-тестирование, в свою очередь, проверяет устойчивость системы при условиях, выходящих за пределы нормальной эксплуатации: резкий всплеск трафика, отказ компонентов, истощение ресурсов и т.п.

Ключевые метрики, оцениваемые при таких тестах:

пропускная способность (throughput, запросов/сек);
время отклика (response time, latency);
ошибки (error rate);
потребление ресурсов (CPU, память, сеть, I/O);
масштабируемость и восстанавливаемость (recovery after failure).
Современные инструменты нагрузочного тестирования отличаются архитектурой (локальная vs распределённая), языком описания сценариев, возможностями генерации отчётов и интеграции с CI/CD-процессами.

Apache JMeter — один из самых зрелых и широко применяемых инструментов для нагрузочного тестирования. Изначально созданный для тестирования веб-приложений, он со временем обрёл поддержку множества протоколов: HTTP/HTTPS, FTP, JDBC, JMS, SOAP, REST, LDAP и др.

JMeter использует визуально-ориентированную модель построения тестовых планов: сценарий представляется в виде иерархического дерева элементов (Thread Groups, Samplers, Listeners, Timers, Assertions). Это упрощает создание сложных сценариев без написания кода, но усложняет версионный контроль и повторное использование. Для автоматизации JMeter можно запускать в CLI-режиме и интегрировать в пайплайны через Maven, Gradle или Jenkins.

Gatling — высокопроизводительный инструмент на базе Scala и Akka, ориентированный на асинхронную, неблокирующую генерацию нагрузки. В отличие от JMeter, сценарии в Gatling пишутся на Scala (или через DSL на Java/Kotlin), что обеспечивает типобезопасность, повторное использование кода и удобство версионирования.

Gatling использует модель виртуальных пользователей, каждый из которых выполняется как лёгкий актор, что позволяет генерировать десятки тысяч параллельных сессий даже на одном узле. После выполнения автоматически генерируются интерактивные HTML-отчёты с детальной статистикой по времени отклика, перцентилям, ошибкам и т.д.

Gatling интегрируется с Maven, Gradle, Jenkins и поддерживает CI/CD-ориентированный workflow. Он особенно популярен в средах, где важны воспроизводимость, точность измерений и автоматизация.

Locust — инструмент на Python, отличающийся декларативным и простым синтаксисом описания пользовательского поведения. Сценарии пишутся как обычные Python-функции с использованием асинхронных вызовов через библиотеку gevent. Это делает Locust чрезвычайно гибким: можно легко моделировать сложные цепочки запросов, использовать внешние библиотеки, генерировать данные на лету.

Locust поддерживает распределённый режим: один мастер-узел координирует несколько воркеров, что позволяет масштабировать нагрузку горизонтально. Веб-интерфейс предоставляет возможность динамически изменять число пользователей и наблюдать за метриками в реальном времени.

Ограничения: производительность уступает Gatling при очень высокой нагрузке из-за особенностей Python и gevent, но для большинства приложений достаточна.

k6 — современный инструмент с открытым ядром, написанный на Go, ориентированный на инженерные практики DevOps. Сценарии пишутся на JavaScript (ES2015+), но выполняются не в V8, а в собственном движке, что обеспечивает высокую производительность и предсказуемое потребление ресурсов.