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

этот вид следует из другого вопроса моего.

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

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

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

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

После сообщения Аймастреана :

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


Обновление

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

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

Ответы [ 3 ]

13 голосов
/ 03 сентября 2008

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

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

  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();
    }
}
1 голос
/ 03 сентября 2008

@ 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");
    }
});
0 голосов
/ 03 сентября 2008

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

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