Полагаю, что большинство читателей знает, что понятие DevOps можно буквально расшифровать как Разработка и Сопровождение (операционная деятельность). Однако, еще одним важным элементом, который не вошел в эту аббревиатуру является тестирование. Обычно этап тестирования называют частью процесса разработки, однако по сути это отдельная, важная часть DevOps.
В DevOps тестирование — не разовая процедура, а непрерывный процесс, интегрированный в каждый этап жизненного цикла ПО. И одним, из видов тестов является нагрузочное тестирование.
Этот вид тестирования представляет собой проверку работоспособности приложения при различных видах нагрузки. Так, мы проверяем, как приложение ведет себя при средней ожидаемой нагрузке. По сути это основной режим работы системы в продуктиве и здесь важна стабильность и отсутствие сбоев.
Далее мы моделируем ситуацию, когда пользовательская активность достигает пиковых значений. Например, в дни распродаж нагрузка на приложение может существенно увеличиться, причем за небольшой интервал времени.
И наконец, мы тестируем работу приложения при длительной стабильной нагрузке. Здесь у нас уже нет каких-то резких скачков, но имеющаяся нагрузка как правило является достаточно высокой. На этом шаге важно понять, как себя будет вести приложение при продолжительной, высокой нагрузке.
На практике, тестирование имитирует действия множества виртуальных пользователей и замеряет различные ключевые показатели. Прежде всего это время отклика системы, пропускную способность (скорость обработки запросов), использование ресурсов (CPU, память, диск, сеть) и количество ошибок при росте нагрузки.
В результате данных тестов мы выявляем узкие места в нашей системе еще до выпуска релиза. Это позволяет разработчикам заранее исправить проблемы с производительностью, также избежать дорогостоящих простоев и сохранить репутацию разрабатываемого сервиса.
Помимо узких мест, с помощью нагрузочного тестирования мы можем понять, как целевая система справляется с ростом нагрузки. В частности, какое количество пользователей она выдерживает без деградации, где находятся те самые узкие места и когда требуется вертикальное или горизонтальное масштабирование. Обычно для решения проблем с масштабируемостью используют горизонтальное масштабирование. Например, если фронтенд не справляется, то всегда можно добавить еще экземпляров, в контейнеризированной среде с этим легко справится Kubernetes. Однако, зачастую горизонтального увеличения экземпляров недостаточно и в таком случае нужно масштабировать по вертикали.
Итак, мы в целом разобрались с тем, для чего нужно нагрузочное тестирование. Теперь давайте посмотрим какие есть инструменты для решения этих задач. Описания некоторых представленных характеристик продуктов взяты с ресурса.
Каждое из представленных решений должно быть доступно для покупки в России. Также важно наличие возможностей для построения отчетов, в частности тренд репортов, возможность работать с решением одновременно нескольких команд, а также субъективная оценка по удобству, данная инженерами.
Gatling
Решение Gatling предназначено для тестирования, которое позволяет имитировать динамику функционирования приложения под нагрузкой. Это мощный фреймворк для нагрузочного тестирования, отличающийся простотой в использовании, и хорошей производительностью. Благодаря распределенной архитектуре с его помощью можно легко масштабировать нагрузку на целевую систему.
Также Gatling поддерживает высокую скорость обработки запросов за счёт асинхронной и неблокирующей архитектуры. Для написания тестов пользователи могут использовать разные языки программирования, например Scala, Kotlin и Java.
Распределённое нагрузочное тестирование позволяет направить нагрузку по нескольким машинам, что помогает проводить более обширные нагрузочные тесты. После каждого теста Gatling создаёт HTML-отчёт с графиками, подробной статистикой и многими параметрами тестирования для лёгкого анализа.
В Gatling совершенно необязательно писать сценарии тестирования самостоятельно. С помощью инструмента Recorder можно создавать сценарии тестов, записывая действия на сайте или в виде потока.
Важным аспектом являются поддерживаемые инструментом тестирования протоколы. Gatling поддерживает такие протоколы, как HTTP, JMS, SSE, Web Sockets и MQTT (в платной версии).

К недостаткам данного решения можно отнести сложность подготовки тестов, особенно для тех, кто не слишком хорошо знаком с представленными языками программирования. Также у неопытных пользователей могут вызвать сложность ограниченные возможности графического интерфейса. Традиционной проблемой для многих решений является интеграция со сторонними библиотеками, не адаптированных под асинхронную модель работы Gatling.
Boomq
Еще одним решением для тестирования производительности является платформа Boomq. С помощью данного решения можно осуществлять нагрузочное тестирование в конвейере CI/CD через API. В результате такого взаимодействия можно добиться увеличения скорости тестирования в 5-10 раз.
Еще одной отличительной чертой Boomq является наличие большого количества шаблонов отчетов прямо из коробки. Помимо этого, данное решение позволяет кластеризовать генераторы нагрузки с помощью Kubernetes, в результате чего можно получить еще большее увеличение производительности при проведении тестов.
Платформа позволяет настроить алерт для уведомления о результатах тестирования. Также инструмент содержит AL-помощник для анализа всех необходимых показателей.

К недостаткам решения Boomq можно отнести требовательность к ресурсам при использовании больших нагрузок. Причиной этому является Apache JMeter, который использует Boomq для работы.
В целом данное решение подойдет для инженеров по нагрузочному тестированию, которые благодаря ИИ-генератору отчётов будут избавлены от рутинной работы по анализу и документированию результатов тестов.
Также функциональным тестировщикам пригодится концепция Low Code, позволяющая упростить написание сценариев тестирования. Ну а разработчикам Boomq позволит быстрее выявлять проблемы с производительности на ранних этапах тестирования решения.
JMeter
Apache JMeter, пожалуй является наиболее известным участником из сегодняшнего списка. Это классический инструмент для нагрузочного тестирования, известный своей функциональностью и гибкостью. Он поддерживает широкий спектр протоколов и типов нагрузки, а также имеет множество плагинов. Также, JMeter имеет большое сообщество пользователей.

Однако, когда речь заходит о распределенном тестировании, то здесь у JMeter есть ряд проблем с масштабируемостью. Так запуск сценариев на нескольких машинах требует существенных трудозатрат на настройку (синхронизацию) тестовых серверов. Кроме того, производительность распределенных тестов в JMeter ограничена техническими особенностями самого инструмента, что делает его менее привлекательным выбором для по-настоящему крупномасштабного тестирования.
К недостаткам Jmeter можно отнести высокое потребление ресурсов при масштабировании, а также ограниченные возможности для создания сложных сценариев без использования дополнительных скриптов.
Yandex Load Testing
Облачный сервис Yandex Load Testing позволяет проводить нагрузочное тестирование приложений и сервисов. При этом он охватывает полный цикл тестирования: от генерации нагрузки до анализа результатов и автоматических проверок.
Из ключевых особенностей стоит отметить функционал генерации нагрузки: сервис использует агентов для создания нагрузки на тестируемый объект. Агенты могут быть развёрнуты как в облаке Yandex Cloud, так и на внешних серверах. В качестве генераторов можно использовать Pandora и Phantom.
Здесь также используется веб интерфейс для настройки тестов, но при необходимости можно применять конфигурационные файлы. Сервис можно вызывать из инструментов непрерывной интеграции, например, GitLab CI или GitHub Actions.

К недостаткам данного сервиса можно отнести привязку к экосистеме Yandex Cloud, так как использование сервиса подразумевает интеграцию с другими сервисами Яндекса, что может быть неудобным для проектов, работающих на других облачных платформах или on-premise инфраструктурах.
Также стоит отметить высокие затраты при интенсивном использовании. Так как это облачный сервис, то его тарификация основана на продолжительности выполнения тестов и хранении результатов. При регулярных или длительных тестах расходы могут стать значительными, особенно для крупных проектов. Из-за вопросов безопасности и интеграции могут возникать сложности при тестировании систем, расположенных вне облака. Это ограничивает применение сервиса для некоторых проектов.
Вывод
Нагрузочное тестирование в DevOps — не разовая активность, а регулярный процесс, обеспечивающий уверенность в стабильности релизов, данные для обоснованных инфраструктурных решений, а также предсказуемое поведение системы при росте нагрузки.
Представленные в обзоре решения позволяют интегрировать процесс нагрузочного тестирования в конвейер CI/CD, что в свою очередь позволяет существенно ускорить процесс выпуска программного обеспечения.

Чтобы уверенно работать с нагрузочными и функциональными тестами, важно понимать не только инструменты, но и сами принципы автоматизации. Этому посвящён курс QA Automation Engineer: от Java-автотестов и ключевых паттернов до полноценного перехода в роль Automation QA.
Чтобы оставаться в курсе актуальных технологий и трендов, подписывайтесь на Telegram-канал OTUS.
