Тестирование производительности: виды тестов, метрики и советы от профессионалов |
05.09.2017 11:39 |
Сегодня, когда рост вычислительных мощностей снизился, а объемы обрабатываемых данных, количества пользователей и запросов к системам продолжают расти, вопросы производительности и ее тестирования широко обсуждаются в профессиональной среде. В данной статье команда по тестированию производительности A1QA освещает основные виды тестов и рассказывает, что нужно учесть при их выполнении для получения релевантных результатов. Перед вами самые распространенные виды тестирования производительности. 1. Стресс-тестирование (Stress Test) Этот тест проводится первым. Нагрузка постепенно увеличивается до тех пор, пока приложение не перестанет работать корректно. В конце теста фиксируется количество пользователей, которое приложение выдерживало, соответствуя требованиям производительности, и сколько выдержать не смогло. Первое значение и будет пределом производительности вашего приложения. Часто этот вид тестирования проводится, если заказчик предвидит резкое увеличение нагрузки на систему. Например, для e-commerce это могут быть дни распродаж. 2. Нагрузочный тест (Load Test) Нагрузка на систему подается на протяжении 4-8 часов. В это время собираются метрики производительности: количество запросов в секунду, транзакций в секунду, время отклика от сервера, процент ошибок в ответах, утилизация аппаратных ресурсов и т д. Собранные метрики проходят проверку на соответствие заданным требованиям. В результате получаем ответ на вопрос: соответствует ли система требованиям производительности? Также на выходе имеем локализацию узких мест в производительности приложения и дефектов, подробное профилирование всех компонентов системы и утилизацию аппаратных ресурсов под целевой нагрузкой.
Данный вид тестирования помогает сделать прогноз относительно работоспособности приложения. Форма подаваемой нагрузки та же, что и при нагрузочном тестировании. Задача теста – узнать, какое влияние окажет увеличение объема данных на систему. Таким образом, можем найти ответ на вопрос: как изменится производительность приложения спустя X лет, если аудитория приложения вырастет в Y раз?
Продолжительность нагрузки может варьироваться в зависимости от целей и возможностей проекта, доходя до семи дней и более. В результате получаем представление о том, как изменится производительность системы в течение длительного периода времени под нагрузкой, например, в течение недели. Снизится ли уровень производительности? Способно ли приложение выдерживать стабильную нагрузку без критических сбоев?
Профиль нагрузки тот же, что и при нагрузочном тестировании. Что получаем в результате? Ответы на следующие вопросы:
О видах тестирования поговорили, теперь коснемся такого важного аспекта их проведения как нагрузка. Подаваемая нагрузка Нагрузка во время тестов должна базироваться исключительно на основе реального поведения пользователей. Только в таком случае вы сможете получить результат, соответствующий реальной производительности системы. Запуск любых других форм нагрузки – это пустая трата ресурсов и времени. Для защиты от ошибок в поведении скриптов мы настоятельно рекомендуем дважды проверять сетевой трафик, который генерируют нагрузочные скрипты и реальные пользователи. Структура запросов и ответов всегда должна быть идентичной. Чтобы избежать неожиданных проблем во время запуска тестов, генераторы нагрузки необходимо располагать как можно ближе к тестовому окружению. Например, нагрузка на окружение подается равной 1000 пользователей, а действительная нагрузка во время теста составляет только 200 пользователей. Разница обусловлена «узким местом» в сети между клиентами и сервером. В этом случае вы не сможете получить точную информацию о времени отклика и оценить производительность системы в целом. Так, например, во время теста вы получили среднее время отклика равное 10 секундам, но лишь транспортировка пакета от клиента к серверу и обратно занимало 9.5 секунд, а формирование ответа уложилось в 0.5 секунды. Сервер способен оперативно обрабатывать запросы, но мы его не догрузили из-за сетевых условий. При правильном подходе мы тестируем производительность системы, а не сети. Для этого тестовое окружение и генератор должны быть расположены в одной локальной сети. В таком случае мы избежим проблемы производительности сети и будем уверены в том, что время отклика соответствует реальной производительности приложения. Какие же метрики собираются во время тестирования производительности? Время отклика измеряется с момента отправки запроса к серверу до получения последнего байта от сервера. Запросы в секунду. Клиентское приложение формирует HTTP-запрос и отправляет его на сервер. Серверное ПО данный запрос обрабатывает, формирует ответ и передает его обратно клиенту. Общее число запросов в секунду и есть интересующая нас метрика. Транзакции в секунду. Пользовательские транзакции – это последовательность действий пользователя в интерфейсе. Сравнивая реальное время прохождения транзакции с ожидаемой (или количество транзакций в секунду), вы сможете сделать вывод о том, насколько успешной системой было пройдено нагрузочное тестирование. Число виртуальных пользователей в единицу времени также позволяет выяснить, отвечает ли производительность приложения заявленным требованиям. Если вы все делаете правильно и ваши сценарии максимально приближены к поведению пользователя, то один виртуальный пользователь будет равен одному реальному пользователю. Процент ошибок рассчитывается как отношение невалидных ответов к валидным за промежуток времени. Желаемые показатели данных метрик указываются в требованиях к программному обеспечению. Но это в идеале. Если эти данные не прописаны, руководитель команды по тестированию должен прояснить этот момент с заказчиком. Советы для тестировщиков и аналитиков по тестированию производительности
Итак, мы рассказали, в чем состоит разница между различными тестами производительности и на какие вопросы они помогают ответить; какие метрики позволяют сравнивать ожидаемый и реальный уровень производительности. Надеемся, данная информация будет вам полезной и поможет в работе. |