4.2. Нагрузочное тестирование Web-приложений

Назад: 4.1 Функциональное тестирование Web-приложений Содержание Дальше: 4.3 Тестирование Web-сервисов

TestComplete позволяет проводить нагрузочное тестирование приложений, которые для передачи данных используют протоколы HTTP, HTTPS или SOAP (т.е. в основном web-приложений). Для этого сначала записывается трафик, который генерируется при общении локального компьютера с сервером, а затем, используя записанный трафик, эмулирует действия пользователей. При этом неважно, какой браузер используется при записи, а при воспроизведении записанных скриптов можно эмулировать любой браузер.

Общая схема при создании нагрузочных тестов:

  1. Записать действия
  2. Внести изменения в записанный трафик
  3. Создать скрипты, которые будут запускать записанные действия
  4. Проанализировать результаты запуска

Прежде чем начать запись нагрузочных тестов, необходимо добавить в проект соответствующий элемент HTTP Load Testing. Для этого щелкнем правой кнопкой мыши на имени проекта, выберем пункт меню Add – New Item и в появившемся диалоговом окне выбрать элемент HTTP Load Testing.
  
После этого в нашем проекте появится новый элемент LoadTesting с тремя дочерними элементами:

  1. Station – здесь перечислены все рабочие станции, используемые для нагрузочного тестирования (по умолчанию используется только один локальный компьютер – Master)
  2. Tasks – задачи, т.е. запросы, которые отправляются серверу, и ответы от него
  3. Tests – нагрузочные тесты. Их можно создавать как визуально в редакторе, так и в скриптах

 

Теперь запишем простой тест.

Для этого мы воспользуемся сайтом http://ya.ru/ и браузером Firefox. Перед началом записи мы откроем в Firefox только один этот сайт.
В TestComplete начнем запись (Test – Record – Record Script) и на появившейся панели Recording нажмем кнопку Record an HTTP Task.
  
При этом появится окно Specify Load Testing Test, в котором мы введем имена для нагрузочного теста и имя новой задачи.
  
После этого нажмем ОК и начнем выполнение действий, которые хотим записать для нагрузочного теста. При этом записывается только трафик, а работа с элементами управления (например, нажатия на кнопки, перемещение мыши и т.п.) игнорируются.

Для записи простого теста перейдем в браузер (где у нас уже открыт сайт ya.ru) введем в строку поиска какой-нибудь текст (например, ” testcomplete”) и нажмем кнопку Найти. Как только страница с результатами поиска полностью загрузится, остановим запись и посмотрим, что в итоге записалось.

Собственно, скрипт содержит лишь одну строку, запускающую нагрузочный тест:

function Test4()
{
  LoadTesting.Tests.TestByName(“New Test”).Execute();
}

В Tasks добавлена задача “Task 1 – ya.ru”. Если дважды щелкнуть по этой задаче, можно посмотреть ее подробности.
  
Поле Target Server позволяет задать имя сервера, на котором проводится тестирование. Это может быть полезно, например, в том случае, если запись скриптов производится на одном сервере, а запуск будет проводится на другом. В этом случае нам не придется менять имя сервера для каждого подключения, а изменить его один раз в этом поле.

В списке Connections слева мы видим список записанных подключений, то есть запросов к серверу и ответов от него. Как видно из нашего примера, запросы могут отправляться не к одному серверу, а к нескольким (например, если на сайте установлена реклама, которая берется из других источников, расположенных на других серверах). Обычно такие подключения не нужно тестировать, а потому их можно смело удалить из задачи. Для этого необходимо щелкнуть правой кнопкой по ненужному подключению и выбрать пункт Delete.

В правой части панели отображаются 2 вкладки – Request (Запрос) и Respond (Ответ). Это запросы и ответы для выбранного в списке слева подключения. Галочка Raise Events на каждой вкладке позволяет включить генерацию OnLoadTestingRequest и OnLoadTestingResponse события соответственно. По умолчанию генерация этих событий отключена в TestComplete, так как включение этого события для всех подключений может существенно замедлить выполнение скриптов.

На вкладке Request находится поле Request Method,в котором указывается использованный метод (GET или POST), запрошенная страница с параметрами (например, /yandsearch?text=testcomplete) и протокол доступа (например, HTTP/1.1). Все эти параметры можно при необходимости изменить непосредственно в задаче или из скриптов.

Также на вкладке Request находятся все параметры подключения, которые также можно при необходимости менять. Например, параметр User-Agent позволяет задать, какой браузер будет использовать при эмуляции подключений.
На вкладке Response также перечислены параметры ответа от сервера и его содержимое. Например, на скриншоте ниже показан пример ответа от сервера (картинка):
  

Теперь рассмотрим нагрузочные тесты.

При записи нагрузочного теста TestComplete автоматически создал один тест (мы его назвали New Test),его параметры можно увидеть, если дважды щелкнуть на элементе проекта LoadTesting – Tests – New Test.
  
В каждом тесте может быть несколько пользователей (поле User Name), каждый из которых в свою очередь может запускать сразу несколько экземпляров нагрузочного теста (количество одновременных запусков определяется полем User Count, а задача – полем Task). Также для каждого пользователя можно указать компьютер, который будет использоваться для запуска записанного трафика (поле Workstation), браузер, который будет использоваться при эмуляции (Browser), задержка старта в миллисекундах (Start Delay), скорость подключения (Connection Speed), а также указать, необходимо ли для данного пользователя исправлять Host Field (если галочка включена, то Host Field будет заменяться на значение из поля Target Server).

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

Запуск тестов и анализ результатов

Точно так же, как мы создали нагрузочный тест для сайта ya.ru раньше в этой главе, мы создали аналогичный тест для сайта google.com, добавили в тест New Test еще одного пользователя (см. скриншот выше) и теперь готовы запустить тесты.

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

  • Load testing Log – на этой вкладке можно посмотреть различные результаты по каждому пользователю и подключению
  • Default Log – здесь отображаются все ошибки, предупреждения и сообщения по каждому подключению

Рассмотрим внимательно вкладку Load Testing Log. Здесь находятся три панели:

  1. Панель пользователей. По оси X на графике отображаются пользователи, а по оси Y – время, которое понадобилось каждому пользователю на выполнение теста. В приведенном выше примере видно, что первому пользователю понадобилось чуть больше одной секунды для выполнения теста, а последнему – 11 секунд.
    В таблице справа от графика можно посмотреть, какую задачу выполнял каждый пользователь, сколько в точности времени понадобилось каждому пользователю времени и сколько подключений они сделали за время выполнения теста. Например, из результатов, показанных выше, видно, что на выполнение запросов к Гуглу тратилось от 1 до 4 секунд, а на запросы к Яндексу – от 8 до 11 секунд.
    При выборе какой-либо строки в таблице пользователей изменяется информация на второй панели – панели подключений.
  2. Панель подключений. Здесь можно посмотреть подробную информацию по каждому подключению для пользователя, выбранного в первой панели. Информация также отображается в виде таблицы и наглядного графика.
    Например, в приведенном выше примере мы видим, что больше всего времени занимают запросы к серверу kiks.yandex.ua. Это может послужить поводом для выяснения причин такого долгого ответа от сервера, так как полученный результат существенно отличается от средних результатов запросов к другим серверам, а значит именно этот сервер может быть “слабым звеном”.
    В таблице Connections отображается очень много информации по каждому подключению (например, время, количество переданных и полученных байт, производительность и т.п.), поэтому заголовки столбцов трудно прочитать. Внимательно посмотрите, возможно некоторые из колонок вам не нужны, тогда их можно скрыть, щелкнув правой кнопкой мыши на заголовке таблице и выбрав пункт Field Chooser.
  3. Панель запросов. В этой панели можно посмотреть подробную информацию по каждому запросу выбранного подключения.

По умолчанию графики представляются в виде обычного графика, однако можно выбрать представление в виде столбчатой диаграммы (chart). Для этого надо просто выбрать соответствующую закладку на графике.
  
Затем, щелкнув правой кнопкой мыши на диаграмме, можно выбрать, какую именно информацию TestComplete должен отображать на графике.
  
Использование диаграммы вместо графика удобно тем, что при помощи щелчка мышью по какому-либо элементу графика, TestComplete автоматически подсвечивает сообтветствующую строку в таблице справа.

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

Сравнение результатов нагрузочного тестирования

Если вы хотите сравнивать результаты нагрузочного тестирования какого-то теста, вам необходимо сначала включить этот тест в группу. Для этого откройте нагрузочный тест в редакторе TestComplete и введите имя группы в поле Result Group:
  
Теперь после нескольких запусков вашего теста, вы можете сравнить полученные результаты друг с другом. Это может быть полезно, если в приложении были сделаны изменения, которые должны были ускорить работу приложения, или наоборот, сделанные изменения могли повлиять на производительность и необходимо проверить насколько сильно.

Для сравнения результатов какой-либо группы в дереве проекта выберите пункт ProjectSuite Analysis – Project Analysis – Group Name:
  
При этом откроется окно, в котором результаты запусков теста представлены в удобном для сравнения виде:

Модификация нагрузочных тестов и задач из тестовых скриптов

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

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

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

В следующем примере мы создадим 5 виртуальных пользователей, каждому из которых назначим задачу (Task) и нагрузочный тест (Test, который также будет создан в скрипте), а затем запустим созданный нагрузочный тест, одновременно назначив ему группу (чтобы можно было сравнивать результаты прогона тестов).

function TestLoadTesting()
{
  var i;
  // Создаём новый тест
  var ti = LoadTesting.CreateTestInstance(“New Created Test”);
 
  // массив для пользователей
  var aUsers = new Array(5);
 
  // назначаем каждому пользователю задачу и тест
  for(i = 0; i < aUsers.length; i++)
  {
    aUsers[i] = LoadTesting.CreateVirtualUser(“New created user ” + i.toString());
    aUsers[i].Task = LoadTesting.HTTPTaskByName(“Task 2 – google.com”);
    aUsers[i].TestInstance = ti;
  }
 
  // запускаем нагрузочный тест
  ti.Run(“New result group”);
}

А в следующем примере мы модифицируем ранее записанную задачу для каждого пользователя таким образом, чтобы каждый из виртуальных пользователей искал не просто строку “testcomplete”, а строку “textcompleteN”, где N – порядковый номер пользователя (вместо порядкового номера можно, например, написать функцию, которая будет генерировать случайную строку по заданному образцу, мы используем пример с порядковым номером лишь для упрощения примера).

function TestLoadTesting()
{
  var i;
  var sHeader;
  // Создаём новый тест
  var ti = LoadTesting.CreateTestInstance(“New Created Test”);
 
  // массив для пользователей
  var aUsers = new Array(5);
 
  // назначаем каждому пользователю задачу и тест
  for(i = 0; i < aUsers.length; i++)
  {
    aUsers[i] = LoadTesting.CreateVirtualUser(“New created user ” + i.toString());
    aUsers[i].Task = LoadTesting.HTTPTaskByName(“Task 2 – google.com”);
    aUsers[i].TestInstance = ti;
    
    // модифицируем задачу для каждого пользователя
    sHeader = aUsers[i].Task.Connection(0).Request(0).RequestHeader;
    aUsers[i].Task.Connection(0).Request(0).RequestHeader = aqString.Replace(sHeader, “testcomplete”, “testcomplete” + i.toString());
  }
 
  // запускаем нагрузочный тест
  ti.Run(“New result group”);
}

Несколько важных замечаний по нагрузочному тестированию

  1. При записи нагрузочных тестов убедитесь, что работает только одно приложение, работающее по HTTP, HTTPS или SOAP протоколу, – то, в котором записываются тесты. Например, приложение MSN Messenger также работает по HTTP протоколу и при передаче данных может повлиять на записанные тесты. Также в настройках TestComplete можно указать списки приложений или хостов, трафик с которых TestComplete будет игнорировать (Tools – Options – Engines – HTTP Load Testing)
  2. TestComplete не может эмулировать более 300 виртуальных пользователей на одном компьютере. Если вам необходимо эмулировать большее количество виртуальных пользователей, вам придется распределить нагрузочное тестирование на несколько компьютеров. Как это сделать, рассказано в главе 15 Распределенное тестирование.
  3. Если вы тестируете приложение, написанное на ASP.NET, то некоторые элементы управления могут иметь параметры, которые постоянно меняются, а значит ответы от сервера при записи и воспроизведении будут всегда отличаться. Чтобы решить эту проблему, дважды щелкните на элементе LoadTesting в дереве проектов и добавьте эти параметры в список Auto-Updated Parameters
     
    Здесь же можно задать параметры серверов, которые используют NTLM или Kerberos типы аутентификации.
  4. Если вы используете прокси-сервер, вам необходимо указать его параметры в опциях TestComplete (Tools – Options – Engines – HTTP Load Testing)
  5. Если у вас на компьютере установлен антивирус, он может блокировать запись трафика. Обратитесь к справке TestComplete, раздел “TestComplete Network Activities – Possible Issues With Antiviruses” чтобы узнать, как решить эту проблему

 

Назад: 4.1 Функциональное тестирование Web-приложений Содержание Дальше: 4.3 Тестирование Web-сервисов