Чтобы быть уверенным, что программа нормально работает под нагрузкой, проводят два вида тестирования. Нагрузочное помогает проверить, как продукт ведет себя во время рабочих нагрузок. А стресс-тестирование — что будет, если систему перегрузить большим количеством информации.
Рассказываем, чем различаются тестирование нагрузки и стресс-тесты системы, для чего нужен каждый из этих видов и какие инструменты помогут их провести.
Нагрузочное и стресс-тестирование: отличия
Несмотря на то что понятия похожи, тем не менее эти виды тестирования — не одно и то же. Они отвечают на разные вопросы, различаются целями и инструментами проведения.
Что такое нагрузочное тестирование (load testing). Это проверка поведения системы при высоких, но тем не менее рабочих нагрузках.
Условно, если ожидается, что на сайт максимально будет заходить по 10 тысяч человек в день — примерно такую ситуацию и смоделируют при проведении нагрузочного тестирования.
Во время тестов проверяют характеристики системы при высокой нагрузке: время отклика сервера, пропускную способность, особенности использования памяти и других ресурсов.
Что такое стресс-тестирование (stress testing). В этом случае проверяют, как приложение ведет себя при нагрузках, выходящих далеко за пределы нормы.
Если взять тот же пример с сайтом, на который будет заходить по 10 тысяч человек в день — при стресс-тестировании смоделируют нагрузку на него в 100 тысяч пользователей.
Разумеется, при такой нагрузке система вряд ли будет работать в штатном режиме. Но вот где, как и в какой степени она начнет отказывать — уже выясняют во время тестирования. Позже эту информацию используют, чтобы улучшить продукт и закрыть слабые места.
Зачем нужно тестировать производительность
И нагрузочное, и стресс-тестирование относятся к одной и той же категории тестов — проверке производительности. В нее входят виды тестирования, которые призваны проверить, насколько производительной программа остается в разных ситуациях.
При этом цели у двух видов тестов разные — и причины проведения тоже.
Нагрузочное тестирование помогает:
- понять, как продукт ведет себя при ожидаемой рабочей нагрузке;
- выявить характеристики его производительности, например время ответа сервера;
- разобраться, как можно оптимизировать приложение, чтобы оно работало быстрее;
- найти предел нагрузки, за которым приложение начнет работать со сбоями;
Это тестирование нужно, чтобы оценить эффективность работы программы в нормальных условиях. А еще — ее стабильность.
Если приложение начинает отказывать еще при рабочей нагрузке, значит, оно явно нестабильно и нуждается в доработке. Но если продукт настолько «сырой», до тестирования производительности он скорее всего не дойдет и провалится еще на ранних этапах тестов.
Стресс-тестирование в свою очередь позволяет:
- найти крайний предел, за которым приложение откажет полностью;
- оценить, насколько хорошо система справляется с последствиями перегрузки, например с отказом отдельных компонентов;
- выявить «слабые места», которые отказывают в первую очередь;
- проверить способность системы восстанавливаться после сбоев и перегрузок.
При этом сценарии стресс-тестирования могут быть разными. Тестировщики могут моделировать и повышенное количество запросов к серверу, и резкое ограничение ресурсов, и многое другое.
С помощью стресс-тестирования продукт подготавливают к возможным перегрузкам в будущем, например внезапным наплывам пользователей или даже атакам злоумышленников. Тесты покажут, чего можно ожидать от приложения в каждой из таких ситуаций — и помогут заранее защитить продукт от последствий.
Другие виды тестирования производительности
Производительность системы оценивают не только с помощью нагрузочных и стресс-тестов. Есть еще несколько видов тестирования. Они применяются реже, но тем не менее важны для всесторонней проверки работы приложения:
- тестирование стабильности — помогает оценить, как программа справляется с высокой рабочей нагрузкой в течение долгого времени;
- конфигурационное тестирование — показывает, как на производительность влияют разные изменения в конфигурации продукта, например применение разных видов балансировщиков нагрузки.
Иногда выделяют еще тестирование масштабируемости — проверку, как система будет работать при масштабировании, к примеру если ее адаптируют под большее количество пользователей.
Как проводить нагрузочное тестирование и стресс-тесты
Мы не будем подробно останавливаться на всех возможных тест-кейсах — разберем только процесс в целом. Проверка нагрузки состоит из нескольких этапов, которые в принципе справедливы и для нагрузочного, и для стрессового тестирования. Разница заключается только в деталях: например, цели и используемые инструменты могут отличаться.
Изучение системы. Перед тем как начать составлять сценарии, тестировщики собирают всю возможную информацию о системе: из каких компонентов она состоит, какие термины описывают ее и так далее.
Определение целей тестирования. Специалисты формулируют, для чего будут проводить тесты и на какой вопрос собираются ответить с их помощью. Например, целью может быть определение максимальной рабочей нагрузки или поиск «слабых мест» в системе.
Разработка МНТ. Тестирование проводят по МНТ. Аббревиатура расшифровывается как «методика нагрузочного тестирования» — для каждого случая она своя. Ее разрабатывают после сбора информации и анализа целей. Например, при составлении методики описывают:
- ограничения при тестировании — что проверять не собираются, к примеру компоненты, которые уже протестировали ранее;
- правила моделирования — как и какими способами будут имитировать повышенную нагрузку, к примеру с помощью эмуляторов;
- возможные ошибки — что именно гипотетически может пойти не так в работе системы и почему;
- тестовый стенд и инструменты — какие характеристики у тестовой среды и самого продукта, а также технологий, которые будут применяться при тестах;
- требуемые характеристики — каким должен быть продукт согласно требованиям;
- этапы тестирования — как именно будет проводиться моделирование нагрузки, из каких этапов будут состоять тесты;
- перечень результатов — какую информацию удастся получить с помощью тестов и какими методами ее позже будут анализировать;
- требования к отчетности — как она будет выглядеть и что содержать, к примеру рекомендации по улучшению производительности.
Проведение тестов. На основе разработанной методики составляют тест-кейсы, настраивают среду и запускают тестирование — моделируют указанную нагрузку, смотрят на результаты и описывают их. Как правило при этом используют специальное ПО, которое способно составлять тесты, генерировать запросы к приложению и так далее.
Сбор и анализ результатов. Во время тестов специалисты собирают результаты — информацию о поведении системы при разных тест-кейсах, время отклика, данные об использовании ресурсов и другие. Иногда сбор и анализ этих данных также автоматизируют, но чтобы сделать из них выводы, как правило нужно участие человека.
Составление отчета. Полученные результаты оформляют в отчет, который после передают заказчику или отделу разработки. В документах описывают собранные данные и выводы из их анализа, а также дают рекомендации по улучшению продукта.
Инструменты нагрузочного и стресс-тестирования
Производительность тестируют с помощью специальных инструментов, которые моделируют повышенную нагрузку. Чаще всего одно и то же ПО используют и при нагрузочном, и при стрессовом тестировании. Вот несколько примеров таких программ:
- Load Runner — генерирует трафик и пользователей, заходящих в тестируемое приложение. Умеет составлять аналитические отчеты по результатам тестов;
- Apache JMeter — имеет открытый исходный код и доступен бесплатно, поэтому очень популярен. Чаще всего используется для тестирования веб-приложений;
- LoadNinja — конструирует тесты автоматически, так что пользоваться им можно без знаний программирования. Также может проводить отладку протестированного кода;
- Neoload — может моделировать до тысячи пользователей одновременно, подходит для тестирования веб-сайтов и мобильных приложений;
- Grinder — позволяет динамически менять параметры прямо в процессе тестирования. Есть консоль, через которую можно создавать и редактировать тесты;
- K6 — может тестировать веб-приложения и ПО, поддерживает инструменты CI, или непрерывной интеграции.
Некоторые инструменты доступны только платно, у других есть бесплатная версия — а часть сервисов открытые и полностью бесплатные. Многие доступны прямо из браузера: для работы с ними не понадобится устанавливать программу к себе на компьютер.
Какой сервис применяется в конкретном случае — зависит от проекта и от правил, принятых в компании. Если вы хотите потренироваться, можете начать с более популярных инструментов, доступных бесплатно, таких как Apache JMeter.
Кроме непосредственно программ для тестирования, используют и другое ПО: среды разработки, инструменты для мониторинга, сервисы перехвата и записи трафика, средства автоматизации и многое другое. И, конечно, в тестировании никуда без ПО для багтрекинга, менеджмента задач и управления процессами.
Нагрузочное и стресс-тестирование: что выбрать
Оба вида тестирования важны, хотя нагрузочное как правило проводится чаще — оно считается основным. Если вы не уверены, с чего начать, его стоит рассмотреть в первую очередь.
А в целом выбор метода тестирования зависит от задачи и целей, которые стоят перед специалистами:
- Если задача — проверить систему в условиях, приближенных к реальным, стоит выбрать нагрузочное тестирование. Оно поможет оценить производительность и эффективность программы.
- Если задача — проанализировать самые негативные сценарии, лучше подойдут стресс-тесты. Они покажут поведение системы при экстремальной нагрузке.
Выводы
- Нагрузочное и стресс-тестирование — два популярных вида тестирования производительности программы. С их помощью определяют, насколько хорошо продукт справляется с нагрузками, например большим потоком пользователей.
- Нагрузочное тестирование показывает, как приложение ведет себя при высоких, но рабочих нагрузках. Стресс-тестирование оценивает поведение системы в экстремальных условиях, выходящих за пределы нормы.
- С помощью нагрузочного тестирования определяют рабочую производительность, находят слабые места, которые стоит доработать, а также оценивают его надежность.
- Стресс-тестирование позволяет проверить, как программа справляется с нештатными ситуациями, как ведет себя при отказе части компонентов, насколько легко ее восстановить после сбоя.
- Нагрузочное тестирование проводят, если хотят проверить работу программы в условиях, приближенных к реальным. Стресс-тестирование выбирают, если планируют оценить самые негативные из возможных сценариев.