Платформа тестирования Visual Studio и консольное приложение - странные результаты - PullRequest
0 голосов
/ 18 апреля 2011

Я использую среду нагрузочного тестирования Visual Studio для нагрузочного тестирования веб-службы.

Если я сохраню свой тест простым и использую шаблон постоянной загрузки 1 пользователя с моей локальной машины, я могу генерировать 'x' запросов в секунду.

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

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

Это два разных модульных теста, которые я использую для генерации нагрузки:

//Unit test used for load testing
[TestMethod]
public void HappyReturnCase_Test()
{
    HttpWebRequest req = WebRequest.Create("http://myurl") as HttpWebRequest;
    req.Method = "GET";
    req.GetResponse().Close();
}

//Console app version  
private static void Main(string[] args)  
{  
    for (int i = 0; i < 200000; i++)  
    {
        HttpWebRequest req = WebRequest.Create("http://myurl") as HttpWebRequest;
        req.Method = "GET";
        req.GetResponse().Close();
    }
}

Может ли кто-нибудь объяснить мне, почему я вижу такое поведение?

Спасибо заранее. Kevin

Ответы [ 2 ]

0 голосов
/ 18 апреля 2011

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

Например, если у вас включены итерации теста, вы будете распределять их по всей продолжительности нагрузочного теста.Как правило, это снизит вашу частоту тестирования.Если у вас установлено 100 итераций теста, и вы выполняете тест в течение часа, а каждый тест занимает 30 секунд, из-за этого вы будете запускать на 20 тестов меньше (равномерно распределенных в течение часа).

Здесь также существует модель обратного вызова.Нагрузочные тесты поддерживают модель подключаемого модуля нагрузочного тестирования и модель подключаемого модуля запроса, поэтому модульное тестирование уступит исполнителю нагрузочного тестирования, который может быть заменен на нового виртуального пользователя;даже если тест установлен для 1 виртуального пользователя, он может не совпадать с виртуальным пользователем на протяжении всего теста.Вы будете вести отчеты и вести журнал, плюс вы можете запускать новый «контейнер» хоста приложения для вашего модульного теста и некоторых других действий.Даже если это не так, вы не проводите все свое время в контексте модульного теста.

Даже внутри модульного теста работают другие методы, такие как ClassInitialize, TestInitialize, установка таймеров и т. Д. Кроме того, используется пул потоков, даже если только для одного пользователя.См. http://blogs.msdn.com/b/billbar/archive/2007/10/12/features-and-behavior-of-load-tests-containing-unit-tests-in-vsts-2008.aspx для получения дополнительной информации о том, как модульные тесты выполняются исполнителем нагрузочного теста.Даже если вы связываете этот модульный тест с данными для запуска 100 строк данных, он, вероятно, не будет работать так же быстро, как цикл, который вы написали, но он имеет преимущество в том, что вы легко настраиваете дополнительную работу и выполняете несколько модульных тестов вместе.

Возможно, вы захотите ознакомиться с кратким справочным руководством по тестированию производительности по адресу http://vsptqrg.codeplex.com/.

Теперь при установке постоянной нагрузки на 1 пользователя не используется ни одно изПреимущества загрузки - вы взяли на себя нагрузку на пул потоков без запуска нескольких пользователей.Вы ожидаете увидеть преимущества, если увеличите количество пользователей и позволите нагрузочному тесту VS управлять этим переключением контекста за вас.Еще одним преимуществом является создание тестового набора, который вы можете легко изменить, а также сбор статистики perfmon, применение правил порогов и т. Д. В действительности вы не делаете ничего из этого в консольном приложении.

0 голосов
/ 18 апреля 2011

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

  • Какой тип сбора данных вы используете?
  • Есть ли инструментарий для кодаОхват?

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...