Каков наилучший способ модульного тестирования из нескольких потоков?

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

Вопрос

это как бы вытекает из другого вопрос из моих.

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

Я подумываю о создании метода, который просто порождает множество Фоновый работник's или что-то в этом роде и сообщает им всем загрузить / сохранить файл и протестировать с различными размерами файла / объекта.Затем получите ответ от потоков, чтобы узнать, удалось ли это / преуспело / привело к взрыву мира и т.д.

Можете ли вы, ребята, предложить какие-либо предложения о наилучшем подходе к этому?Как я уже говорил, для меня все это в некотором роде ново :)

Редактировать

Следующие аджмастреан Публикация:

Я использую консольное приложение для тестирования с помощью Debug.Утверждает :)


Обновить

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

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

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

Решение

В .NET, ThreadPool потоки не вернутся без настройки ManualResetEventы или AutoResetEvents.Я нахожу это излишеством для быстрого метода тестирования (не говоря уже о том, что его довольно сложно создавать, настраивать и управлять).Фоновый рабочий процесс также немного сложен с обратными вызовами и тому подобным.

Кое-что, что я нашел, что работает, это

  1. Создайте массив потоков.
  2. Настройка ThreadStart метод каждого потока.
  3. Запустите каждый поток.
  4. Объединение во всех потоках (блокирует текущий поток до тех пор, пока все остальные потоки не завершатся или не будут прерваны)
public static void MultiThreadedTest()
{
    Thread[] threads = new Thread[count];

    for (int i = 0; i < threads.Length; i++)
    {
        threads[i] = new Thread(DoSomeWork());
    }

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    foreach(Thread thread in threads)
    {
        thread.Join();
    }
}

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

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

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

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});

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

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