Каков наилучший способ модульного тестирования из нескольких потоков?
-
09-06-2019 - |
Вопрос
это как бы вытекает из другого вопрос из моих.
В принципе, как только у меня будет код для доступа к файлу (я рассмотрю ответы там через минуту), что было бы лучшим способом тест это?
Я подумываю о создании метода, который просто порождает множество Фоновый работник's или что-то в этом роде и сообщает им всем загрузить / сохранить файл и протестировать с различными размерами файла / объекта.Затем получите ответ от потоков, чтобы узнать, удалось ли это / преуспело / привело к взрыву мира и т.д.
Можете ли вы, ребята, предложить какие-либо предложения о наилучшем подходе к этому?Как я уже говорил, для меня все это в некотором роде ново :)
Редактировать
Следующие аджмастреан Публикация:
Я использую консольное приложение для тестирования с помощью Debug.Утверждает :)
Обновить
Изначально я работал с использованием Фоновый работник чтобы разобраться с потоковой обработкой (поскольку я привык к этому с Windows dev), я вскоре понял, что когда я выполнял тесты, в которых требовалось завершить несколько операций (потоков), прежде чем продолжить, я понял, что будет немного сложнее заставить его сделать это.
Затем я продолжил аджмастреанопубликовал этот пост и понял, что мне действительно следует использовать Нитки класс для работы с параллельными операциями.Теперь я проведу рефакторинг, используя этот метод (хотя и с другим подходом).
Решение
В .NET, ThreadPool
потоки не вернутся без настройки ManualResetEvent
ы или AutoResetEvent
s.Я нахожу это излишеством для быстрого метода тестирования (не говоря уже о том, что его довольно сложно создавать, настраивать и управлять).Фоновый рабочий процесс также немного сложен с обратными вызовами и тому подобным.
Кое-что, что я нашел, что работает, это
- Создайте массив потоков.
- Настройка
ThreadStart
метод каждого потока. - Запустите каждый поток.
- Объединение во всех потоках (блокирует текущий поток до тех пор, пока все остальные потоки не завершатся или не будут прерваны)
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");
}
});
Ваша идея должна сработать нормально.По сути, вы просто хотите создать кучу потоков и убедиться, что тем, кто записывает файл, требуется достаточно времени, чтобы сделать это, чтобы действительно заставить читателей ждать.Если все ваши потоки возвращаются без ошибок и без блокировки навсегда, то тест завершен успешно.