Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save jigi-33/f2d8299967a0195a1a1399da59bf0dd7 to your computer and use it in GitHub Desktop.

Select an option

Save jigi-33/f2d8299967a0195a1a1399da59bf0dd7 to your computer and use it in GitHub Desktop.
Особенности и нюансы в тестировании производительности приложений

Важность понимания предмета при тестировании Веб-производительности

Многим тестировщикам хорошо известны такие инструменты, как JMeter, Gatling, Tsung и т.д. Хотя они довольно просты в использовании, анализ полученных результатов и выводы на их основании представляют для них некоторую сложность. Во время проведения собеседований на позицию QA инженера часто встречаются кандидаты, утверждающие, что у них есть опыт в области тестирования производительности, но, по факту, не обладающие знаниями метрик и основных понятий, с ним связанных. Поскольку основной задачей тестирования производительности является не знание инструментария, а данные, полученные с его помощью, цель этого материала - рассмотреть основные аспекты этой сферы тестирования.

тест на Производительность vs Нагрузочный тест

Одно из основных заблуждений заключается в смешивании понятий тестирования производительности и нагрузочного тестирования. Оба эти термина зачастую используются как синонимы, но совершенно точно это - разные понятия.

Цель тестирования производительности - выявить “узкие места” в системе или архитектуре. Существует выражение, что наша система является настолько быстрой, насколько быстр наш самый медленный сервис. Представим, что система состоит из различных микросервисов. У каждого существует свое время ответа или расчетная (предполагаемая) нагрузка. В таком уравнении существует даже больше переменных как, например, тип базы данных, серверов или местоположение центра обработки данных.

Пользователям приложения нужны две вещи: быстрое время ответа и высокая отказоустойчивость.

С помощью тестирования производительности мы можем выявлять эти узкие места в архитектуре и масштабировать, конфигурировать и регулировать сервисы независимо для достижения такого быстродействия конечными пользователями.

А что насчет высокой отказоустойчивости? Эта характеристика как раз на стороне нагрузочного тестирования. Проще говоря, нагрузочное тестирование - это проверка нашей системы с помощью огромного количества одновременных пользователей или подключений, которые и являются нашей нагрузкой. Это количество мы постоянно увеличиваем для достижения максимального количества задач, с которыми система может справиться. Нагрузочное испытание наиболее актуально при релизе нового сервиса, когда нужно проверить, выдержит ли он ожидаемый поток трафика. Цель этого испытания - проверка работоспособности всей системы, а не производительность отдельных её сервисов.

И хотя методы проведения нагрузочного тестирования и тестирования производительности кажутся схожими с точки зрения инструментария и техник, различия становятся более явными при анализе результатов и определении способов реагирования.

Время задержки, пропускная способность и ширина пропускания канала

Как уже было указано выше, определяющую роль в нагрузочном тестировании и тестировании производительности играет анализ результатов. Чтобы его сделать, необходимо знать основные метрики производительности. В особенности в мире сетевого взаимодействия, очень важно снимать метрики времени задержки, пропускной способности и ширины пропускания канала:

  • Время задержки (Latency) - временной интервал между запросом и ответом. Например, у вашего сервиса время задержки составляет 100ms, что означает, что такому сервису потребуется 100 миллисекунд на обработку запроса и генерирование ответа. Как правило, чем ниже время задержки, тем лучше клиентский опыт.
  • Пропускная способность (Throughput) - фактическое количество запросов (или пользователей), которое может обработать система за определенное время. В то время как время задержки говорит вам только о времени, метрика пропускной способности информирует об объеме данных, полученных и обработанных в момент времени. Важно не отделять показатели времени задержки от пропускной способности, т.к. высокий показатель времени задержки часто прямо связан с увеличением показателей метрики пропускной способности. Пропускная способность обычно измеряется в rps – (кол-во) запросов в секунду (requests per second).
  • Ширина пропускания канала (Bandwidth) - максимальное число запросов (или пользователей), которое может обработать система. В отличие от пропускной способности ширина пропускания канала измеряет максимальный объем, который может обработать приложение. В то время как ширина пропускания канала, как правило, величина постоянная (в определенный период времени), очень важно производить анализ метрик времени задержки и пропускной способности параллельно, т.к., основываясь на них, можно сделать заключение о производительности вашего приложения.
Процентили

После измерения времени задержки, одним из use-кейсов, который приходит на ум, является подсчет среднего времени задержки в определенный отрезок времени. Первые статистические данные, которые кажутся необходимыми для расчета - это расчет средне-арифметического значения. Однако, сложность состоит в том, что средне-арифметическое значение очень чувствительно к большим отклонениям. Поскольку схема времени задержки выглядит довольно равномерной с несколькими заметными всплесками, процентили являются более подходящей статистической единицей в этом случае. Если вам нужно измерить среднее время задержки сервиса, вы можете использовать медиану, которая является 50-м процентилем (p50). Но помните, что p50 также очень чувствительна к статистическим колебаниям. Наиболее используемыми величинами для измерения среднего времени ответа являются 90-й и 99-й процентили (p90 и p99). Например, если время задержки для p90 составляет 1ms, это означает, что в 90% случаев ваш сервис отвечает по истечению 1ms.

Частота появления ошибок

При измерении показателя пропускной способности мы получаем величину объема трафика, который обрабатывается сервисом, но что можно сказать об ответах? Коды ответов сервиса (2xx, 4xx или 5xx) имеют существенное значение. По ним определяется частота появления ошибок. Цель мониторинга частоты появления ошибок - определить, какое количество (или процент) ответов сервиса составляют положительные ответы и т.п. Всегда есть доля ответов с ошибками (в том числе связанных с валидацией на клиенте - 4xx код). И если мы замечаем внезапные всплески на диаграмме частоты появления ошибок, это может говорить о неполадках сервиса.

Для эффективной отладки и масштабирования системы нужно в первую очередь понимать, что же необходимо измерить (а как - это вторично).

Особенности тестирования производительности клиентской и серверной части

тестирование Клиентской части vs тестирование Серверной части

При тестировании веб-приложений важно не путать понятие тестирования клиентской части и тестирование производительности в целом. Рассмотрим эти понятия и процесс их взаимодействия на примере классического веб-приложения.

Наилучшим решением проблем со стабильностью и сбоями в работе веб-серверов является обеспечение двухуровневой архитектуры приложения: клиентской, или Front-end, -части и серверной, или Back-end, -части.

Пользователь открывает браузер и отправляет запрос к странице сайта на Front-end сервер. Запрос принимается и запрашивается у исполнительной части веб-приложения – Back-end сервера, который хранит логику приложения, обеспечивает выполнение PHP-скриптов и генерирует HTML-страницы. Front-end принимает сформированную страницу от Back-end и в качестве ответа на запрос пользователя передает ее в браузер. Получив страницу, браузер пользователя начинает ее отображение, что сопровождается отправкой серии запросов на графический контент и CSS.

Такие запросы принимает Front-end и обрабатывает без обращений к Back-end’у.

Оценка скорости работы клиентской и серверной частей веб-приложения осуществляется двумя разными видами тестирования: для Front-end применяется тестирование клиентской части, или Client-Side Testing, а для Back-end – тестирование производительности серверной части.

Основная цель тестирования клиентской части состоит в измерении времени, необходимого браузеру, для загрузки HTML-страницы. Наиболее важными показателями здесь являются:

  • количество загружаемых данных (их объем) за ед. времени,
  • количество выполненных запросов за ед. времени.

Собрать данную статистику можно как с использованием встроенных инструментов браузера, так и с помощью специализированных инструментов и онлайн-сервисов, которые позволяют замерить необходимые показатели с учетом интересующего региона.

Помимо общего веса страницы, инструменты предоставляют детализированную информацию по каждому из компонентов. Изучив параметры запросов, можно обнаружить ряд проблем, приводящих к ухудшению скорости отображения страницы. К примеру, подгружается слишком большая картинка и Javascript, или отправляется значительное количество запросов.

Улучшить скорость отображения страницы можно с помощью уменьшения размеров, сжатия элементов (CSS, Javascript и графического контента), а также путем сокращения названий переменных и оптимизации кода страницы.

Другая необходимая проверка направлена на анализ заголовков кэширования, поскольку корректность его выполнения при повторном посещении страницы позволяет повысить скорость загрузки страницы до 80%.

Тестирование клиентской части также позволяют косвенно обнаружить ряд дефектов, например, отсутствие или некорректную работу элементов на странице.

Тестирование производительности серверной части направлено на анализ выполнения запросов и получения соответствующего запроса от Back-end.

Цели данного подвида тестирования:

  • Измерить время отклика самых важных бизнес-транзакций;
  • Определить предельный уровень допустимой нагрузки;
  • Выявить узкие места в производительности системы (ботлнеки);
  • Составить рекомендации по улучшению производительности;
  • Найти возможные дефекты, проявляющиеся только при одновременной работе большого количества пользователей.

Общие рекомендации при тестировании производительности

Создавая скрипт, нацеленный на выявление времени отклика, ограничьте количество запросов, анализируемых одним тестом. В этом случае будет проще выявить проблемы с отдельными запросами или API. Сфокусируйтесь на небольших пакетах или простых запросах на чтение, чтобы получить представление о наилучшей системной производительности. Такой тип тестирования поможет выявить базовые проблемы с конфигурацией и настройками системы.

Еще одна стратегия – концентрация на блокирующих запросах, которые ведут к заметной задержке в клиентской части приложения. По мере разработки сервиса вы легко сможете определить улучшения или ухудшения в этих "бутылочных горлышках".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment