15. Распределенное тестирование

Назад: 14 TestComplete и COM Содержание Дальше: 16 Ручное тестирование

В этой главе рассматривается распределенное тестирование: возможность одновременного запуска тестов TestComplete на разных компьютерах.

В общем случае распределенное тестирование в TestComplete можно разделить на 2 типа: распределенное нагрузочное тестирование и распределенное функциональное тестирование.

Распределенное нагрузочное тестирование

О нагрузочном тестировании рассказывается в главе 4.2 Нагрузочное тестирование Web-приложений. Из-за некоторых ограничений операционной системы, TestComplete может эмулировать действия не более чем 300 пользователей с одного компьютера. Если вы хотите нагрузить свое приложение более чем тремястами соединениями, вам необходимо распределить нагрузку между несколькими компьютерами. Чтобы использовать компьютер для нагрузочного тестирования и подключать его к работе нагрузочных тестов, на этом компьютере должно быть установлено и запущено одно из приложений:

  • TestComplete
  • TestExecute
  • Load Testing Remote Agent

Обратите внимание: TestComplete, TestExecute или Remote Agent, установленные на дополнительных компьютерах, должны быть той же версии, что и TestComplete или TestExecute на основной машине!

Мы рассмотрим пример распределенного нагрузочного тестирования на примере утилиты Remote Agent (RA).

Remote Agent – это специальная утилита для эмуляции виртуальных пользователей. Скачать ее можно на портале сайта SmartBear, так же, как и TestComplete.

RA может запускаться как в обычном режиме, так и как сервисное приложение (Service). Выбор способа запуска происходит во время установки утилиты, когда появляется такое сообщение:

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

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

  • Host – это имя или IP адрес подключаемого компьютера
  • Name – имя станции, как оно будет отображаться в TestComplete-е

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

Если теперь запустить этот тест, то в результате мы увидим, что тесты для Яндекса выполнились на основной машине, а для Гугла – на дополнительной.

Если вы запускаете нагрузочные тесты из скриптов и хотите управлять использованием рабочих станций, вам необходимо модифицировать свойство Station объекта VirtualUser. В качестве примера модифицируем кусок кода из главы 4.2 Нагрузочное тестирование Web-приложений (изменения выделены полужирным):

// назначаем каждому пользователю задачу и тест
  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;

    aUsers[i].Station = LoadTesting.Stations.ItemByName(“Station1 – netbook”);

  }

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

 

Распределенное функциональное тестирование

TestComplete позволяет также распределять выполнение функциональных тестов по разным компьютерам. Это может быть полезно, например, в том случае, если запуск всех скриптов занимает слишком много времени и скрипты не успевают выполниться даже за ночь; или для запуска одних и тех же тестов на разных конфигурациях (разные операционные системы, пользователи с разным уровнем доступа и т.п.).

В распределенном функциональном тестировании используются 2 типа компьютеров: master (главный компьютер) и slave (подчиненные компьютеры). Master компьютер управляет запуском скриптов на подчиненных компьютерах.

Чтобы иметь возможность запускать скрипты на нескольких машинах, на каждой из них должен быть установлен либо TestComplete, либо TestExecute. Кроме того, в каждом проекте, который будет запускаться на slave-компьютере, должен быть добавлен элемент NetworkSuite. Чтобы добавить его, необходимо щелкнуть правой кнопкой мыши на имени проекта в дереве Project Explorer, выбрать пункт меню Add – New Item, и в открывшемся диалоговом окне выбрать Network Suite.

То же самое необходимо сделать на master-компьютере.

Теперь на master-компьютере необходимо указать компьютеры и задачи, которые будут запускаться удаленно. Для этого выполним правый щелчок на элементе Hosts и выберем пункт Add – New Item, затем в открывшемся диалоговом окне введем имя станции (оно не обязательно должно совпадать с именем компьютера). Затем выберем добавленный компьютер в списке Project Explorer и введем его параметры:

  • Address – имя или IP-адрес компьютера
  • Domain, User name, Password – параметры учетной записи компьютера, к которому будем подключаться
  • Base path – общий путь для нескольких проектов, размещенных  в одной папке slave-компьютера; этот параметр будет использоваться для формирования путей у задач (Tasks)
  • Source path – путь к папке на master-компьютере, откуда будет копироваться проект на slave-компьютер

Из всех перечисленных параметров обязательным является только имя компьютера. Параметры учетной записи по умолчанию берутся с текущего компьютера; Base path может быть опущен и использоваться полные пути к проектам; Source Path может быть также опущен, если проект находится на удаленной машине.

Теперь добавим задачи. Прежде всего необходимо добавить Job. Job – это просто средство для упорядочивания задач (Tasks). В каждом элементе Job может быть несколько задач. Задача же, в свою очередь, содержит всю информацию о запускаемом тесте (имя проекта или функции, компьютер, на котором эта задача будет запускаться, приложение, которое будет использоваться на удаленной машине для запуска и т.д. Процесс добавления Job-ов и задач аналогичен процессу добавления Host-ов, рассмотренному выше. В итоге в нашем проекте добавляется задача, которую можно запустить на удаленном компьютере:

Можно запустить задачу прямо из редактора TestComplete, щелкнув по Job-е правой кнопкой мыши и выбрав пункт Run…

При этом TestComplete будет отображать ход текущих операций, производимых на удаленных компьютерах.

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

NetworkSuite.Run(true);

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

Здесь, однако, есть особенность. Если выполнение скрипта на master-компьютере завершится раньше, чем выполнение удаленных скриптов, то и выполнение скриптов на удаленных машинах тоже будет завершено. Это можно легко продемонстрировать следующим примером:

function TestNetworkSuite()

{

  NetworkSuite.Run(false);

  aqUtils.Delay(1000);

  Log.Message(“Done”);

}

При этом на удаленном скрипте используем задержку в 10 секунд:

aqUtils.Delay(10000);

 

Если запустить этот скрипт, то задержка 10 секунд на удаленном компьютере так и не дойдет до конца, удаленный TestComplete будет завершен раньше.

Чтобы избежать этой ситуации, в TestComplete предусмотрены точки синхронизации (SynchPoints). Точки синхронизации – это просто элементы, которые позволяют приостанавливать выполнение скриптов, которые по каким-либо причинам выполняются быстрее, до тех пор, пока этой же точки не достигнут другие скрипты. Как только все скрипты достигнут данной точки, выполнение на всех компьютерах продолжится. Таким образом, чтобы избежать проблемы, описанной выше, достаточно во всех проектах (включая master) добавить точку синхронизации (в нашем случае это “SynchPoint1”) и модифицировать скрипты таким образом, чтобы в конце выполнения ожидалась синхронизация. Делается это с помощью метода Synchronize:

function TestNetworkSuite()

{

  NetworkSuite.Run(false);

  aqUtils.Delay(1000);

  Log.Message(“Done”);

  NetworkSuite.Synchronize(“SynchPoint1″);

}

И то же самое на удаленной машине:

function TestNetworkSuite()

{

  Log.Message(“This function is ran on remote PC”);

  aqUtils.Delay(10000);

  NetworkSuite.Synchronize(“SynchPoint1″);

}

Еще одной важной особенностью распределенного тестирования является использование NetworkSuite Project Variables, т.е. переменных, которые доступны для всех запущенных скриптов, как на master, так и на slave-машинах. Добавлять и изменять эти переменные можно, дважды щелкнув на элементе NetworkSuite в Project Explorer. Эти переменные бывают двух типов:

  • Persistent – сохраняют свои значения между запусками скриптов
  • Temporary – заново инициализируются при каждом запуске

Если вам необходимо обмениваться данными между скриптами на разных компьютерах, воспользуйтесь NetworkSuite Project Variables. Подробное описание по работе с ними есть в справочной системе TestComplete, раздел «Network Suite Variables».

Назад: 14 TestComplete и COM Содержание Дальше: 16 Ручное тестирование