С появлением Web 2.0 сайты стали интерактивными — они научились узнавать своих посетителей и подстраиваться под их ожидания, а пользователи, в свою очередь, стали требовательнее к сайтам, ожидая, что их будут понимать с полуслова и адекватный запросам результат будет получен мгновенно. Все это привело к колоссальному росту нагрузки на веб-серверы и ужесточению требований к уровню их обслуживания — любые промедление или ошибка в работе сайта приводят к потере посетителей. Работоспособность сайта стала критически важной для большинства современных компаний, а цена просчета в оценке его реальной производительности значительно увеличилась. Все это делает актуальным нагрузочное тестирование.

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

Продукты для нагрузочного тестирования можно разбить на три класса: бесплатные; корпоративные, обладающие всей мыслимой функциональностью; недорогие универсальные. К первой категории относится такой продукт, как Jmeter [1], который, несмотря на свободное распространение, может потребовать высокой стоимости владения, включая привлечение дорогостоящих специалистов. Кроме того, у продукта отсутствует поддержка, а процесс создания теста занимает слишком много времени. Ко второй группе можно отнести продукты HP LoadRunner, IBM Rational Performance Tester [2] и Borland Silk Performer, позволяющие автоматизировать процесс нагрузочного тестирования, ускорив и значительно повысив его качество. Например, функциональность LoadRunner удовлетворит даже самого привередливого тестировщика — в продукте имеется практически все для проведения разного рода тестирования, однако стоимость его запредельно высока, а освоение требует времени на изучение всех возможностей. К третьей группе можно отнести такие продукты, как PureLoad [1], NeoLoad и WAPT, которые легко устанавливаются и настраиваются для выполнения нагрузочного тестирования веб-приложений, работающих под управлением любой ОС.

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

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

Автопараметризация. При создании современных веб-сайтов все большее распространение приобретает методология гибкой разработки (agile) [3], когда процесс разработки делится на серию быстрых итераций, каждая из которых проходит полный цикл — от формирования требований до получения рабочей версии, реализующей данные требования. Так как в рамках данной методологии изменения в систему вносятся часто, то и нагрузочные тесты для создаваемого веб-приложения приходится постоянно изменять. Это требует от средства нагрузочного тестирования возможности быстрого создания тестового сценария.

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

Тестирование на неадекватной системе. Обычно тестирование проводится в среде, которая по какому-либо критерию отличается от рабочей (ресурсы, средства балансировки нагрузки и т. п.), поэтому распространенной проблемой является несоответствие тестовой и рабочей систем. Часто из-за недостатка ресурсов или ограничения программ нагрузочного тестирования тесты проводят на слабом оборудовании и моделируют меньшее количество пользователей, чем предполагается для рабочей системы. При этом часть подсистем — например, отвечающая за динамическое выделение ресурсов в зависимости от нагрузки, балансировщик нагрузки и т. п. — могут вообще не участвовать в тестировании. В результате может сформироваться неадекватная оценка производительности тестируемой системы, а часть проблем может быть вообще не выявлена. Часто при тестировании не учитывается географическое распределение нагрузки, которая обычно имеет большой разброс по скоростям соединения пользователей и временам отклика. Однако в рабочей системе это может приводить к специфичным проблемам — например, медлительные пользователи могут требовать больше ресурсов сервера (соединение открыто дольше, расходуется больше памяти на хранение данных и т. д.). Все эти особенности должны учитываться при разработке тестов, средства тестирования должны позволять создавать нагрузку, эквивалентную рабочей, а тестовая система по производительности должна быть равна рабочей и использовать те же подсистемы.

Тестирование в облаках. Современные высоконагруженные сайты — это распределенные системы, которые часто располагаются в облаках. Для тестирования подобных сайтов необходимы сравнимые по мощности ресурсы, поэтому нагрузочное тестирование также целесообразно проводить в облаках [4]. Находясь в облаке, можно проводить тестирование как из-за пределов охраняемого периметра веб-сайта, так и изнутри. Это, в частности, позволяет определить влияние межсетевого экрана и балансировщика нагрузки на производительность системы.

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

Сегодня на рынке имеется ряд универсальных достаточно простых средств нагрузочного тестирования, позволяющих большинству разработчиков и тестировщиков создавать надежные сайты. В качестве примера можно назвать семейство продуктов WAPT, возможности которых типичны для решений данного класса. Эти системы позволяют организовать как локальное тестирование при небольших нагрузках до 2 тыс. виртуальных пользователей, так и распределенное — с моделированием высоких нагрузок. Кроме того, в семействе имеются средства для тестирования в облаках и из облаков. Продукты можно использовать для тестирования любого веб-приложения, работающего с протоколом HTTP(S), исключая некоторые проприетарные протоколы (например, RTMP).

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

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

Для создания распределенной нагрузки имеется «рабочее место» для запуска тестов и агентов, создающих нагрузку. Агенты могут располагаться в любом месте — для их работы необходимы доступ к тестируемому сайту и связь с «рабочим местом» пользователя. Все это позволяет масштабировать и распределять нагрузку, моделируя работу необходимого количества пользователей. Можно также менять индивидуальную скорость виртуального пользователя, что позволяет имитировать, например, работу медлительных пользователей, обращающихся к приложению из сетей 3G.

В продуктах такого типа должны быть также средства размещения в публичном облаке, например Amazon. Учитывая, что ЦОД Amazon располагаются по всему миру, это позволит выбрать наиболее удобное место для тестирования и организации географически распределенной нагрузки.

Для повышения качества тестирования в системе должен быть организован мониторинг производительности веб-серверов, например через протоколы WMI и SNMP. Во время выполнения теста с помощью встроенных счетчиков производительности можно отслеживать нагрузку на процессор, оценивать использование памяти, дисковой и сетевой подсистем любого сервера, входящего в состав сайта, а через ODBC можно получать специфические для баз данных счетчики производительности.

***

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

Литература

  1. Сергей Рогов, Дмитрий Намиот. Тестирование производительности Web-серверов // Открытые системы.СУБД. — 2002. — № 12. — С. 55–64. URL: http://www.osp.ru/os/2002/12/182266 (дата обращения: 20.10.2014).
  2. Петр Можаев. Средства автоматизированного тестирования // Открытые системы.СУБД. — 2009. — № 3. — С. 38–41. URL: http://www.osp.ru/os/2009/03/8161608 (дата обращения: 20.10.2014).
  3. Наталья Дубова. Платформы разработки // Открытые системы.СУБД. — 2006. — № 1. — С. 18–24. URL: http://www.osp.ru/os/2006/01/380740 (дата обращения: 20.10.2014).
  4. Наталья Ефимцева. Тестирование облачных сервисов // Открытые системы.СУБД. — 2012. — № 5. — С. 46–51. URL: http://www.osp.ru/os/2012/05/13016242 (дата обращения: 20.10.2014).

Сергей Леонов (sergei@softlogica.net) — сотрудник компании SoftLogica (Новосибирск).