Недавно мы рассказали о том, зачем тестируют сайты и как это делают. Чаще всего в тестировании проверяют вёрстку, адаптив, работу ссылок и скриптов, поведение страницы с нестабильным интернетом. Но есть ещё одно тестирование, которое иногда включают в обычное, но чаще всего им занимаются отдельно — это нагрузочное тестирование.
Зачем нужно нагрузочное тестирование
Представим ситуацию: мы пишем внутренний софт для компании — он будет стоять на сервере в нашем здании и через него все в офисе будут бронировать себе переговорки, гостевые пропуска, отпуска и заниматься прочим планированием. Все работают в офисе, удалёнщиков почти нет, сервис заточен под внутреннее использование. Пара удалённых сотрудников иногда пользуются сервисом, чтобы забронировать отпуск.
Наступает пандемия, все расходятся и начинают работать из дома. Внезапно выясняется, что софт, который отлично работал много лет внутри компании, стал глючить. При этом пользоваться им даже из офиса стало невозможно.
Главное, что изменилось в нашем сценарии, — это точка входа, откуда пользователь попадает в сервис: из офиса или из дома. Соответственно, изменилось количество тех, кто пытается пользоваться сервисом снаружи, — нагрузка на эту часть выросла во много раз.
Если бы в компании провели нагрузочное тестирование, то смогли бы заранее исправить слабые места в коде и подготовить сервис к таким ситуациям.
Что такое нагрузочное тестирование
Нагрузочное тестирование — это способ выявить слабые места при повышении нагрузки на сервис. В зависимости от целей тестирования, моделируют разные ситуации:
- количество пользователей растёт плавно, но каждую минуту;
- количество пользователей растёт резко и непредсказуемо;
- пришло много пользователей с медленным интернетом;
- поступило много запросов с одного IP-адреса;
- все пользователи выбрали одну и ту же услугу;
- случился наплыв новых пользователей, которые пытаются зарегистрироваться.
Проще говоря, нагрузочное тестирование — это когда мы даём какую-то нагрузку и смотрим, как наше приложение с ней справляется.
Цели и задачи
Так как под нагрузкой можно понимать разное, то перед проверкой тестировщики договариваются, что именно они будут тестировать. Вот что может быть целями нагрузочного тестирования:
- посмотреть расход памяти и нагрузку процессора;
- измерить среднее время отклика сайта, если посетителей станет в 10 раз больше;
- проверить, не перегреется ли сервер, если им постоянно будут пользоваться все зарегистрированные пользователи;
- проверить время отклика базы данных при постоянном росте количества запросов;
- посмотреть, что будет, если все пользователи одновременно начнут загружать на сервер объёмные видеофайлы;
- убедиться, что сайт не ляжет, если на него зайдёт 3 миллиона человек одновременно.
Идея в том, что вариантов, что проверять, — много, но выбрать нужно что-то конкретное, одно или несколько. Нельзя сразу проверить всё — для этого нужны разные инструменты и разные тесты.
Платформа тестирования
Нагрузочное тестирование редко проводят на рабочем сервере — если в итоге сервер не справится с нагрузкой, то все пользователи останутся без сервиса. Вместо этого тестировщики собирают окружение или платформу, максимально похожую на настоящую. Это значит:
- такой же сервер (или с полностью одинаковыми характеристиками);
- такая же скорость интернета;
- такая же база данных;
- такие же настройки софта.
Иногда бывает так, что на тестовом стенде всё хорошо, а в жизни всё падает после тысячи посетителей. Это значит, что тестировщики не учли какой-то параметр, из-за которого всё сломалось.
Инструменты
Инженеры по тестированию выбирают нужные инструменты исходя из задачи: смотря какую нагрузку нужно смоделировать и что измерять. При этом есть несколько инструментов, которыми пользуются многие тестировщики.
JMeter — открытый и бесплатный инструмент для проведения нагрузочного тестирования. Он позволяет моделировать нагрузку по большинству интернет-протоколов, поддерживает виртуальную авторизацию на сайтах, а если чего-то не хватает, можно установить плагин.
Grafana — помогает следить за нужными метриками. Например, нам нужно понять, сколько пользователей генерирует, допустим, 1000 запросов в секунду, чтобы соотнести их со своей нагрузкой. Для этого мы с помощью Grafana виртуально переводим запросы в пользователей.
Яндекс Танк. Самописная система тестирования Яндекса, которой компания иногда пользуется для проверки своих продуктов. Написана на Python, можно использовать и моделировать различные сценарии нагрузки, есть встроенный мониторинг серверов. Не всем подходит, потому что работает только в UNIX-консолях, но иногда решает задачу лучше всех.
Отчёты — что мы получили в итоге после тестирования
Когда нагрузочное тестирование закончилось, инженеры отдают результаты разработчикам и администраторам систем отчёты — что показало тестирование и справился ли сервис с нагрузкой.
На основе этого отчёта разработчики будут думать, как и что им поправить, чтобы улучшить результаты тестирования. Возможно, тесты укажут на наличие скрытых багов, которые пропустили юнит-тестировщики, или станет понятно, что нужно поменять алгоритм распределения памяти. В любом случае как только разработчики скажут, что всё готово, сервис снова отправится на нагрузочное тестирование. И так каждый раз, пока тест не покажет, что все показатели в пределах нормы.
Что дальше
В следующий раз займёмся практикой — простестируем наш учебный сервер под нагрузкой и посмотрим, с чем он справится, а с чем нет.