Нагрузочный тест Visual Studio для имитации множества пользователей на основе данных?

StackOverflow https://stackoverflow.com//questions/12710732

Вопрос

Я пытаюсь протестировать загрузку веб-сервиса.

У меня есть простой метод, который принимает 2 параметра, которые отправляются веб-службе, и возвращает ответ, и я создал модульный тест на основе этого метода.

Потому что я хотеть потребность чтобы протестировать различные входные данные для эффективного тестирования сервиса, я настраиваю CSV с ~ 1000 строками в качестве источника данных для модульного теста.

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

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

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

...

Итак, как я могу подключить источник данных к нагрузочному тесту и заставить этот нагрузочный тест запускать каждый пользовательский экземпляр модульного теста с разными значениями?

Это было полезно?

Решение

В итоге я использовал этот ответ в качестве руководства: https://stackoverflow.com/a/7813465/237723

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

Я записал тест веб-производительности, используя эту новую форму, и создал нагрузочный тест для запуска этого WPTest.


  1. После записи теста я добавил CSV в качестве источника данных к этому тесту.

  2. Было зафиксировано 2 "Запроса":начальное ПОЛУЧЕНИЕ и последующая ПУБЛИКАЦИЯ. Убедитесь, что вы оставили их обоих!Я удалил значок.запрос на ICO, потому что его не существовало.(этих мер предосторожности можно избежать)

  3. Расширив запрос POST, я изменил свойства параметров текстового поля, которые соответствовали моим 2 входным данным веб-службы, чтобы получить их значения из соответствующего столбца в CSV.

  4. Я изменил метод доступа к источнику данных на "Не перемещать курсор автоматически" (вы должны развернуть источник данных до таблицы и отредактировать его свойства с помощью щелчка правой кнопкой мыши / F4.)

  5. Затем я создал WebTestPlugin (из связанного ответа), который вручную перемещает курсор в соответствии с запускаемым идентификатором пользователя (int).Это будет соответствовать экземпляру пользователя, который запускается нагрузочным тестом в соответствии с пошаговым планом.После создания этого класса создайте проект, а затем добавьте его в свой веб-тест производительности.


public class webtestplugin : WebTestPlugin
{
    public override void PreWebTest(object sender, PreWebTestEventArgs e)
    {
        base.PreWebTest(sender, e);
        e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);                        
    }
}

Другие советы

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


Но, ИМХО, просто не ходите туда...Исходя из моего опыта, моделирование ~ 1000 пользователей на одной машине приведет к плохой результаты, потому что тест столкнется со всевозможными ограничениями клиента - проблемами с пулом потоков, проблемами с исходящим и входящим трафиком и т.д.Я не говорю, что это невозможно преодолеть, но это достаточно запутанно, чтобы рассмотреть другой подход.

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

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

private ConcurrentBag<string> logs = new ConcurrentBag<string>();

public void GetLoad(int numberOfUsers, List<string> myParams)
{
    var users = new string[numberOfUsers];
    for (int i = 0; i < numberOfUsers; i++)
    {
        users[i] = string.Format("LoadTest{0}", i + 1);
    }

    var userThreads = new List<Thread>();
    for (int i = 0; i < numberOfUsers; i++)
    {
        int index = i;
        userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
    }

    Parallel.ForEach(userThreads, thread=>thread.Start());
    foreach (var userThread in userThreads)
    {
        userThread.Join();
    }
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
    File.AppendAllLines(outputFilename, logs);
}

На изображении показано, где нужно внести изменения.

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top