Инструменты тестирования Visual Studio Online, опыт использования и сравнение с ручным подходом

Эта статья продолжает цикл, начатый нашими друзьями из Лаборатории Касперского и описывает реальный опыт использования инструментов тестирования от Microsoft с рекомендациями и выводами. Автор — инженер по тестированию, Игорь Щегловитов (ins4n3 на хабре). Наши статьи, посвященные тестированию, помечены тегом #mstesting.

Введение В предыдущем посте мы рассмотрели создание инфраструктуры для облачного нагрузочного тестирования на виртуальных машинах Microsoft Azure. Теперь мы рассмотрим инструмент для нагрузочного тестирования — Visual Studio Online — и сравним его с ручным подходом.Нагрузочное тестирование с использованием Visual Studio Online позволяет автоматически создавать и конфигурировать всю необходимую инфраструктуру в облаке — разворачивая контроллер и необходимое количество агентов с определенными настройками. Результаты прогона того или иного теста всегда остаются в облачной базе VS Online, и к ним в любой момент можно получить доступ.

Раньше я не использовал данный подход по 2 м основным причинам: — инфраструктура работала нестабильно и часто падала— не было возможности снятия счетчиков производительности с нагружаемой системы, т.о. результаты тестирования ограничивались данными по пропускной способности.

В Update 3 на Visual Studio 2013 появилась возможность прямо в процессе нагрузочного тестирования динамически подгружать необходимые счетчики производительности из телеметрии Application Insights (подробнее можно прочитать здесь, однако с только для общего образования — со времени написания статьи произошло много изменений).

Мы рассмотрим настройку Application Insights для простого WCF сервиса Calculator (из предыдущей статьи), а также протестируем его на нагрузку с помощью Visual Studio Online.

[ServiceContract] public interface ICalculator { [OperationContract] int Sum (int a, int b, int timeOutInMiliseconds); } Также мы сравним новый подход с описанным в прошлом посте.Нам понадобится:

— Visual Studio Ultimate 2013 (Update 4), — Аккаунт Visual Studio Online— Одна виртуальная машина в Microsoft Azure.— Тестовые данные

Загрузить проект, использующийся в статье.(теперь хостом для WCF сервиса будет не Windows Service, a IIS).

Конфигурирование окружения Создаем через Azure консоль новую виртуальную машину (я эксперементировал на образе Windows Server 2012 R2). При создании виртуальной машины следует открыть 80й порт (HTTP).После успешного создания виртуальной машины подключаемся к ней через RDP. Для того, чтобы запустить на нашей виртуальной машине WCF HTTP сервис, следует поставить туда дополнительные компоненты (IIS и т.п.). Делается это очень просто:

Открыть Service Manager и в меню Manage выбрать Add Roles and Feature. На шаге Installation Type выбрать пункт Role-based or feature based installation. На шаге Features раскрыть список фич .NET Framework 4.5 Features => WCF Services и отметить чекбоксом HTTP Activation. Инсталлятор сам подключит остальные зависимые компоненты IIS, ASP.NET и тп. Запустить процесс установки t61qjvr953xk-__sljm-7v_8

После успешной настройки инфраструктуры следует задеплоить наш WCF сервис.Для этого:

Из папки с тестовыми данными, скопировать папку Service в произвольную директорию на виртуальной машине. Открывать консоль управления IIS (Server Manager=> Tools=> Internet Information Service (IIS)) Создать внутри дефолтового веб сайта новый Application с сервисом калькулятора 1odm0lb3sa8gy1vbdn0d4w3mz

Далее, для того, чтобы убедиться, что все работает правильно, можно прямо в браузере открыть сервис — http://localhost/applicationName/Calculator.svc

Должна открыться страничка, содержащая ссылку для генерации wsdl

lo5jcrm6j6bm8gx-5rfx86xd

Настройка Application Insights После успешной настройки виртуальной машины через портал Azure надо создать новый аккаунт Visual Studio Online (либо использовать уже созданный).Далее перейти в меню управления VS Online в браузере и кликнуть по ссылке Application Insights.

По умолчанию, если в Application Insights не добавлено ни одного приложения, то откроется страничка настройки простого теста, проверяющего доступность некого URL адреса. Это можно пропустить и нажать ссылку I want to monitor something else.После этого для дальнейшей настройки надо будете ответить на несколько простых вопросов (см. скрин)

6pah7k4k5zohz1svyat6tat0

Далее нажать Click here to show instructions.

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

19wnzsqmuqa70vomu2gcuy14l

После этого портал автоматически сгенерирует ApplicationInsights.config (конфиг файл с персональными настройками диагностики) и инсталлятор Microsoft Monitoring Agent.Далее следует скопировать ApplicationInsights.config в корневую папку сервиса Calculator на виртуальной машине и установить агент.

Обратите внимание, что во время установки надо поставить галочку

i3g0duskhzk0o8u-eme9acty

После установки следует перезапустить IIS.

По умолчанию ApplicationInsights.config настроен таким образом, что статистика будет собираться только с нескольких базовых счетчиков производительности. Но мы можем добавить в этот файл дополнительные счетчики — для этого их достаточно перечислить в специальном виде внутри XML секции PerformanceCounters, например:

1h-kvtby7j4xvdsw1ylrokfmaДля того, чтобы узнать правильное наименование нужных счетчиков, я рекомендую их выгрузить через утилиту perfmon. Для этого добавьте в Performance Monitor необходимые счетчики, выделите их и сохраните правой кнопкой мыши в html-формат.

d4b9v8so2s8ioh_w0ish98ef

Если открыть сохраненный файл в блокноте, то там можно посмотреть правильное наименование счетчиков вот в таком виде:

_whynd7838chb8obqx3axwbm

Запуск тестов Открыть в Visual Studio тестовый солюшин (из тестовых данных).В меню студии Team explorer подключиться к созданному аккаунту Visual Studio Online.18zge22l06c9j8w0okzj9gsqn

Далее в солюшине открыть файл Remote.testsetting и на первой же вкладке выбрать Run tests using Visual Studio Online.

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

Далее в аппконфиге проекта RemoteTestProject надо прописать правильный URI, который прослушивает WCF Service Calculator.

Теперь можно переходить к настройке нагрузочного теста.

По умолчанию нагрузочный тест будет запускаться в 250 потоков на 2х одноядерных агентах, т.е. каждый агент будет генерировать нагрузку в 125 потоков.Для увеличения количества агентов, следует использовать настройку Run Settings =>Agent Count (Total Cores). Посмотреть некоторые дополнительные настройки, а также возможные проблемы можно по ссылке.

Для подключения счетчиков производительности из Application Insights необходимо правой мышью кликнуть на Run Settings => Get Performance Data from Application Insights и выбрать интересующие счетчики.

9wv603he837wqdrgvfr_fljp

Во время запуска нагрузочных тестов Visual Studio Online начнет выделять ресурсы для агентов

21igconuwj3lvxzh326-c67qz

После того, как ресурсы будет выделены, начнется cам нагрузочный тест

1f_kte3972p84ifkninyyby5b

Счетчики производительности из Application Insights в процессе нагрузочного теста будут на вкладке Application1-zm4k8wt91bnj4k1r6vskr9n

После завершения теста отчет можно скачать и посмотреть в привычном виде

1_l63sryv5un1drpbplwhw53

Сравнение методик Для эксперимента я провел нагрузочное тестирование данного WCF сервиса с применением обоих подходов.В первом случае я развернул 2е одноядерные виртуальные машины и установил на них Агенты Visual Studio. Поставил локальный контроллер и запустил тест. В результате два агента смогли сгенерировать нагрузку примерно в 500 вызовов в секунду, при этом загрузка CPU на обоих агентах доходила до 100%, в то же время загрузка процессора на виртуальной машине с тестовым сервисом составляла примерно 15–20% (основной вклад естественно вносил процесс w3wp).

Повторил данный тест, но с применением Visual Studio Online + Application Insights (Agent total count = 2). Результат оказался идентичным первому, 2а одноядерных облачных агента генерировали непрерывную нагрузку примерно 500 запросов в секунду. Дождавшись завершения теста, я скачал отчет и обнаружил, что на виртуальных агентах CPU также был загружен на 100%

176_wbhekiijek6n9nbgw7w4j

Увеличение числа ядер агентов до 4х, показало почти линейный рост нагрузки в среднем почти до 800 запросов в секунду (загрузка сервера при этом составляла в среднем 40%).Таким образом я предположил — наш простенький WCF сервис Calculator способен выдержать нагрузку в 3000 параллельных запросов в секунду (работая на одноядерной машине) с учетом того, что мы еще в запросе передаем таймаут 1 мс.На самом деле все оказалось не так. Когда я запустил нагрузочный тест на 10 агентах (250 потоков), максимальная производительность составила примерно 1000 запросов в секунду, при этом агенты были недогружены (загрузка CPU 30%), а сервер перегружен (CPU 100%).

Я начал разбираться и переписал свой нагрузочный тест, так, чтобы увидеть рост зависимости CPU сервера от возрастающей нагрузки. Каждые 10 секунд нагрузка возрастала на 5 пользователей.

Примерно на отметке 100 пользователей наблюдается максимальную производительность ~1000 запросов в секунду, дальнейшее увеличение нагрузки приводит к быстрой деградации CPU сервера Calculator.

1jibmthwd30jk-9omfrgdm2wa

Вывод VS Online позволяет поднимать облачную инфраструктуру нагрузочного тестирования, требуемой мощности, практически переключением одной кнопки. Причем стоит отметить — эта инфраструктура ничем не уступает классической (с агентами и контроллером). Теперь о цене. Application Insights на текущий момент находится в Preview и предоставляется бесплатно. Одна минута виртуального пользователя стоит 1 копейку, т.о. нагрузочный тест 1000 виртуальных пользователей на 10 минут, обойдется вам примерно в 100 рублей (вне зависимости на одном агенте у вас генерится нагрузка или 10).

© Habrahabr.ru