
Тестирование — неотъемлемая составляющая разработки программного обеспечения. Независимо от того, насколько хорошо вы пишете код или насколько тщательно продуманным может быть первоначальный процесс тестирования, всегда есть вероятность, что что-то может ускользнуть.
Вот почему нагрузочное тестирование так важно. Кроме коммерческих инструментов, также доступны варианты с открытым исходным кодом.
В этом руководстве рассмотрим:
- Важность нагрузочного тестирования; 
- Лучшие бесплатные инструменты с открытым исходным кодом для нагрузочного и стресс-тестирования; 
- Ключевые особенности каждого из инструментов. 
Что такое нагрузочное тестирование?
Нагрузочное тестирование — это подсемейство тестирования производительности, которое включает одновременное взаимодействие с приложением большого количества пользователей. Это делается для того, чтобы узнать, может ли системная инфраструктура справиться с нагрузкой без ущерба для функциональности или с допустимым снижением производительности.
Нагрузочное тестирование используется, чтобы определить:
- Является ли время отклика, возвращаемое критическими действиями в приложении, приемлемым в соответствие со спецификацией, требованиями или KPI? 
- Правильно ли ведет себя бизнес-функционал при большой нагрузке? 
- Рассчитана ли инфраструктура на масштабирование в условиях стресс-теста? 
Проведение тестирования производительности может оказать значительное влияние на степень удовлетворенности клиентов продуктом. Если производительность приложения не соответствует ожиданиям клиентов или соглашениям о гарантированном уровне обслуживания, клиенты, вполне возможно, перейдут к вашему конкуренту. И инструменты, используемые в процессе тестирования, играют здесь не последнюю роль.
Список лучших инструментов нагрузочного тестирования на 2022 год
1. JMeter
JMeter — пожалуй, самый популярный open-source инструмент, помогающий измерять время загрузки.
Apache JMeter позиционирует себя как Java-приложение, разработанное специально для проведения нагрузочного тестирования с возможностью измерять производительность приложения и времени отклика.
JMeter был создан как open-source альтернатива LoadRunner и обладает множеством сложных функций. Это Java-приложение вида «толстый клиент», которое управляется в значительной степени кликами мышки — что бывает несколько необычно, но инструмент достаточно мощный. Кроме того, в JMeter доступны все функции, необходимые для проведения нагрузочного тестирования.
Преимущества
- Возможность проводить тестирование производительности для множества технологий с использованием ряда протоколов, таких как Java Objects, Web HTTP/HTTPS, SOAP и Rest Services, FTP, базы данных с JDBC. 
- Хорошая IDE, которую можно использовать для записи, сборки и отладки тестов производительности. 
- Начиная с JMeter 3.1, языком программирования по умолчанию является Groovy. 
- Это один из самых популярных инструментов нагрузочного тестирования. 
- Можно использовать для тестирования производительности мобильных приложений. 
- Используя jmeter-java-dsl, можно писать тесты производительности на Java и пользоваться автодополнением IDE и встроенной документацией. 
В настоящее время у него более 6k звезд на GitHub.
Минусы
Хотя JMeter является одним из наиболее популярных инструментов нагрузочного тестирования, у него есть и слабые места.
Например, JMeter может быть немного сложно масштабировать для большого распределенного теста, особенно если нужно настроить для взаимодействия друг с другом много машин. Также имеется ряд проблем с организацией больших тестов.
Вот где вам может помочь инструмент с открытым исходным кодом от BlazeMeter — Taurus.
2. Taurus
Технически Taurus не относится к инструментам нагрузочного тестирования, он действует скорее как оболочка для других решений, которая скрывает сложность выполнения тестов производительности.
Сила Taurus заключается в том, что он позволяет писать тесты в YAML.
На самом деле вы можете описать полноценный сценарий примерно в десяти строках текста, что позволит коллегам описывать тесты в файле YAML или JSON. YAML — это человекочитабельный формат, который позволяет описать тест в простом текстовом файле.
Это большой шаг вперед по сравнению с тем, как раньше приходилось использовать множество специфичных инструментов для измерения времени загрузки.
Преимущества
- Вышеописанная особенность также должна позволить участвовать в тестах производительности большему количеству специалистов. Кроме того, поскольку тестовые примеры написаны на YAML, тесты становятся намного читабельнее, что упрощает проверку кода. 
- Taurus гораздо эффективнее встраивает тестирование производительности в пайплайн CI/CD. 
- Taurus предоставляет уровень абстракции поверх JMeter и некоторых других инструментов, таких как Locust, Gatling, Grinder и Selenium. 
В настоящее время у него 1.7k звезд на GitHub.
3. Locust
Locust — это простой в использовании распределенный инструмент для нагрузочного тестирования, который помогает фиксировать время отклика. Итак, какие скриптовые языки он использует? Лучший — это Python. Он используется для тестирования производительности веб-сайтов и других приложений.
Locust vs. JMeter
Такие инструменты, как JMeter, основаны на архитектуре на основе потоков, которая потребляет много ресурсов. С другой стороны, Locust использует подход, основанный на событиях, который использует меньше ресурсов.
Рахул Соланки (Rahul Solanki), технический руководитель BlueConch Technologies, как-то в нашем разговоре упомянул, что он сравнивал Locust с JMeter и обнаружил, что Locust отнимает примерно на 70 процентов меньше ресурсов.
Если вы знакомы с термином «генераторы нагрузки», Locust использует термин «рой» — в том смысле как если бы вы насылали рой саранчи для того, чтобы нагрузить сайт (прим. переводчика: игра слов, в англ. “swarm of locusts”).
Для каждого из экземпляров Locust можно определить желаемое поведение. Это также дает возможность отслеживать процесс нагрузки в веб-интерфейсе в реальном времени.
Преимущества
- Возможность создавать тестовые сценарии с использованием Python 
- Можно легко масштабировать количество пользователей, которых нужно эмулировать 
- Приятный интерфейс 
- Расширяемый 
- Подходит для тестирования API 
Минусы
Поскольку это относительно новый инструмент, у него гораздо меньше плагинов, чем у JMeter.
В настоящее время у него 15.7k звезд на GitHub.
4. Fiddler с BlackWidow и Watcher
В списке инструментов повышения производительности веб-сайта это может показаться странной комбинацией.
Но эксперт по производительности Тодд ДеКапуа (Todd DeCapua) на предыдущей конференции PerfGuild рекомендовал использовать Fiddler с Watcher и BlackWidow для создания решения быстрого запуска автоматизированного тестирования производительности.
Fiddler предоставляет множество возможностей, но, вероятно, лучше всего его следует описать как средство захвата сетевых пакетов.
Хотя Fiddler нельзя отнести к решениям для нагрузочного тестирования, с его помощью можно отлаживать проблемы с веб-сайтом, а с помощью одного из его многочисленных расширений можно сделать еще больше.
Преимущества
- Устранение неполадок с веб-приложением 
- Тестирование безопасности 
- Оценка производительности 
- Отладка веб-трафика с большинства компьютеров и устройств 
- Множество функций интеграции 
- Удобен для поиска узких мест производительности 
- Fiddler уже является довольно популярным инструментом среди разработчиков. Многие используют его для отладки, чтобы просмотреть HTTP-запросы, которые их компьютер отправляет сервису или веб-сайту. 
Watcher — это надстройка безопасности для Fiddler, которая позволяет быстро получить результаты тестирования на уязвимости в безопасности. BlackWidow — это веб-краулер, который дает возможность направить его на веб-адрес, а затем детализировать результаты.
Эти три инструмента, работая вместе, могут помочь получить новый взгляд на приложение, а также дать результаты, которые иначе невозможно было бы получить быстро.
Тодд продемонстрировал этот подход на прошлой онлайн-конференции PerfGuild.
5. nGrinder
На странице nGrinder на GitHub написано, что он был разработан как решение для повышения производительности на уровне предприятия. Он был разработан, чтобы упростить процесс стресс-тестирования и предоставить тестировщикам платформу, позволяющую создавать, выполнять и отслеживать тесты.
Преимущества
- Можно писать свои тесты, используя Jython или Groovy, чтобы создать тестовые сценарии и создать нагрузку на JVM с помощью нескольких агентов. 
- Он может расширять тесты с помощью клиентских библиотек, таких как jar и py. 
- Позволяет отслеживать состояние генерации нагрузки агентов производительности. 
- Заботится об автоматическом сборе результатов тестов с распределенных агентов после тестов 
В настоящее время у него 1.3k звезд на GitHub.
6. The Grinder
The Grinder — это фреймворк на основе Java. Он предоставляет простые в создании и использовании распределенные решения для тестирования, использующие множество машин-генераторов нагрузки для регистрации времени отклика конечных пользователей, что позволяет не беспокоиться о каких-либо ограничениях виртуальных пользователей.
Преимущества
- Можно выполнять нагрузочное тестирование в любой системе с Java API 
- Хорошая консоль с графическим интерфейсом 
- Автоматически обрабатывает управление клиентскими подключениями и файлами cookie 
7. Gatling
Gatling — это инструмент для стресс-тестирования, разработанный на Scala, Akka и Netty.
Этот современный подход к архитектуре позволяет тестировать и измерять комплексную эффективность приложения и легко масштабировать сквозную производительность виртуальных пользователей, а также с легкостью масштабировать виртуальных пользователей.
Преимущества:
- У него простой, но мощный DSL 
- Его легко расширить 
- Если вы знакомы со Scala, то это лучший инструмент для нагрузочного тестирования. 
- Есть инструмент для записи сценариев. 
- Позволяет использовать стратегию shift left в тестировании производительности. 
В настоящее время у него 5.1k звезд на GitHub.
Чтобы узнать больше о Gatling, ознакомьтесь с докладом основателя Gatling Стефана Ланделла (Stephane Landelle) PerfGuildsession.
8. k6
k6 — это open-source инструмент нагрузочного тестирования для проверки производительности серверной инфраструктуры.
k6 подходит для использования, когда нужно начать включать тестирование производительности в пайплайны непрерывной интеграции.
k6 создан с использованием Go и JavaScript и хорошо интегрируется в рабочий процесс.
Преимущества
- Простой и понятный api для сценариев 
- Обеспечивает распределенное и облачное исполнение 
- Отличная возможность оркестрации REST API 
В настоящее время у него 11.7k звезд на GitHub.
9. Tsung
Tsung — это многопротокольный инструмент распределенного нагрузочного тестирования с открытым исходным кодом.
Преимущества:
- Может контролировать CPU, память и сетевой трафик клиента 
- Имеет HTTP-рекордер 
- Включает HTML-отчеты и графики 
- Имеет поддержку таких протоколов, как HTTP, XMPP, LDAP и т. д. 
В настоящее время у него 2.1k звезд на GitHub.
10. Siege
Siege — это утилита командной строки для нагрузочного тестирования и измерения скорости работы для http. Он был разработан, чтобы помочь разработчикам измерять производительность работы своего кода.
Преимущества
- Поддерживает базовую аутентификацию, файлы cookie, протоколы HTTP, HTTPS и FTP. 
- Позволяет пользователям подключаться к серверу с настраиваемым количеством имитируемых клиентов. Эти клиенты ставят сервер «в осаду» (прим переводчика: игра слов от англ. “under siege”). 
- Отлично подходит в качестве простого инструмента «грубой силы» для тестирования производительности. 
В настоящее время у него 4k звезд на GitHub.
11. Bees with Machine Guns
Созданный командой разработчиков чикагского медиа Chicago Tribune, это, вероятно, один из самых крутых инструментов тестирования производительности в этом списке.
Bees with Machine Guns описывает себя как утилиту для вооружения (создания) множества пчел (микроэкземпляров Amazon EC2) для атаки (нагрузочного теста) целей (веб-приложений).
Этот инструмент нагрузочного или объемного тестирования может помочь быстро протестировать сайт под нагрузкой, чтобы проверить его способность справляться с высоким трафиком.
В настоящее время у него 6k звезд на GitHub.
LoadRunner, как правило, является одним из наиболее распространенных инструментов нагрузочного тестирования, но многие из этих open-source инструментов могут предоставить большую часть необходимой функциональности. Кроме того, большинство протоколов этих инструментов можно использовать для тестирования производительности как веб-приложений, так и веб-сервисов.
12. Fortio
Fortio — классная библиотека для нагрузочного тестирования, инструмент командной строки, продвинутый эхо-сервер и веб-интерфейс на go (golang).
Этот инструмент позволяет указать заданную загрузку в запросах в секунду и записывать гистограммы задержки и другую полезную статистику.
Плюсы
- Быстрый 
- Небольшой размер (Docker-образ 3 МБ, минимум зависимостей) 
- Многократно используемый 
- Встраиваемая библиотека go 
- Может записывать гистограммы задержки и другую ценную статистику. 
В настоящее время у него 1.8k звезд на GitHub.
13. puppeteer-webperf
В большинстве современных приложений, использующих тяжеловесные интерфейсы на JavaScript, потребность в измерении производительности на стороне клиента как никогда высока.
Не игнорируйте производительность интерфейса.
Можно использовать Puppeteer WebPerf для сбора статистики веб-производительности, такой как трассировка загрузки страницы, получение трассировки инструментов разработчика со снимками экрана, получение показателей производительности во время выполнения и многое другое.
Чтобы узнать об этом больше, ознакомьтесь с моим полным руководством по тестированию производительности фронтенда.
В настоящее время у Puppeteer WebPerf 1.4k звезд на GitHub.
14. Flood Element
Хотите проверить реальную загрузку браузера?
The Flood создал это open-source решение, чтобы дать возможность имитировать поведение пользователей с помощью нагрузочного тестирования с настоящим браузером.
Element — это Playwright с открытым исходным кодом, который использует инструмент нагрузочного тестирования на основе браузера.
Тестовые сценарии создаются с помощью Typescript.
Плюсы
- Можно использовать его для проверки веб-приложения с включением таких же действий, какие совершают пользователи, когда открывают браузер и взаимодействуют с элементами страниц. 
- Такой подход может помочь найти проблемы с производительностью, с которыми сталкиваются пользователи. 
- Он написан как сценарий для функционального тестирования, но с помощью Flood можно быстро запускать сценарии нагрузочного тестирования на любом количестве узлов в облаке. 
- Это один из немногих open-source инструментов, который позволяет проводить тестирование производительности с использованием реальных браузеров, чтобы более точно имитировать взаимодействие реальных пользователей с приложением. 
Читайте об этом в моей статье «Тестирование производительности на уровне браузера с использованием Element».
В настоящее время у него 204 звезды на GitHub.
15. Artillery.io
Artillery.io — это open-source приложение для создания нагрузочных тестов, премиум-версия которого предлагает возможность имитации нагрузки от тысяч пользователей.
- задержка 
- запросы в секунду 
- параллелизм 
- фиксация среднего времени отклика 
- и пропускная способность. 
Преимущества:
- Позволяет создавать пиковые нагрузки для бэкенда для проверки стабильности и надежности. 
- Имеет возможность добавлять собственную логику, публиковать и предварительно тестировать сценарии с использованием JavaScript, который может добавить в свою очередь широкий спектр модулей NPM. 
- Поддерживает несколько протоколов, включая HTTP, Web Socket, Socket.IO, Kinesis и HLS. 
Всех желающих приглашаем на открытое занятие «Стенды для нагрузочного тестирования». На этом вебинаре обсудим, какие стенды можно использовать для нагрузочного тестирования и их особенности. Регистрация открыта по ссылке.
Комментарии (4)
 - mSnus05.11.2022 04:39- Я попробовал использовать JMeter, понял, что для меня он как большинство Апачевских софтин (кроме Апача))) слишком заумный, без GUI с этим разобраться невозможно, и слишком много времени уходит на настройку. - В противоположность ему Locust очень прост и понятен, делает то, что от него попросишь, рисует графики в GUI, управляется из командной строки, пишет отчёты в CSV. Один недостаток - надо немного усилий, чтобы он не на одном ядре исполнялся, а параллелился на все доступные. Но и это довольно просто устроить. 
 - AdminVPS05.11.2022 15:00- Для нагрузочного тестирования сайтов рекомендуем loaddy.com, если нужно просто выполнить стресс тест сайта. Аналог siege, только с удобным интерфейсом. 
 - begemot_sun06.11.2022 22:01- Аналог TSUNG, только более современный - это MZBench 
 https://github.com/satori-com/mzbench
 Позволяет описать сценарий для моделирования нагрузки, запустить сценарий на облаке и отслеживать основные внешние параметры QoS. Путем некоторго "хакинга", можно подключить внутренние метрики сервиса и тогда это может иметь более информативный вид.
 К сожалению, проект более мёртв, чем жив.
 
           
 
WondeRu
Мы с Jmeter делали распределенные нагрузки со всего земного шарика (aws во всех зонах), работало великолепно. Делали через копирование ami, но сейчас бы сделали через ansible. Так что зря это добавлено в недостатки
нет Танка https://github.com/yandex/yandex-tank