Qual é a melhor maneira de testar a unidade de vários threads?
-
09-06-2019 - |
Pergunta
isso é uma continuação de outro pergunta meu.
Basicamente, assim que eu tiver o código para acessar o arquivo (revisarei as respostas em um minuto), qual seria a melhor maneira de teste isto?
Estou pensando em criar um método que gere muitos Trabalhador de fundo's ou algo assim e diz a todos para carregar/salvar o arquivo e testar com tamanhos variados de arquivo/objeto.Em seguida, obtenha uma resposta dos threads para ver se falhou/foi bem-sucedido/fez o mundo implodir, etc.
Vocês podem oferecer alguma sugestão sobre a melhor maneira de abordar isso?Como eu disse antes, tudo isso é meio novo para mim :)
Editar
Seguindo de Ajmastrean publicar:
Estou usando um aplicativo de console para testar com Debug.Asserts :)
Atualizar
Eu originalmente rolei com o uso Trabalhador de fundo para lidar com o threading (já que estou acostumado com isso no Windows dev), logo percebi que quando estava realizando testes onde várias operações (threads) precisavam ser concluídas antes de continuar, percebi que seria um pouco complicado para faça isso.
Eu então segui Ajmastreanpost e percebi que eu realmente deveria usar o Fio classe para trabalhar com operações simultâneas.Agora irei refatorar usando este método (embora com uma abordagem diferente).
Solução
Na rede, ThreadPool
tópicos não retornarão sem configuração ManualResetEvent
ou AutoResetEvent
S.Acho isso um exagero para um método de teste rápido (sem mencionar que é meio complicado de criar, configurar e gerenciar).O trabalhador em segundo plano também é um pouco complexo com retornos de chamada e coisas assim.
Algo que descobri que funciona é
- Crie uma série de threads.
- Configure o
ThreadStart
método de cada thread. - Inicie cada tópico.
- Join em todos os threads (bloqueia o thread atual até que todos os outros threads sejam concluídos ou abortados)
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();
}
}
Outras dicas
@ajmastrean, como o resultado do teste de unidade deve ser previsível, precisamos sincronizar os threads de alguma forma.Não consigo ver uma maneira simples de fazer isso sem usar eventos.
Descobri que ThreadPool.QueueUserWorkItem me oferece uma maneira fácil de testar esses casos de uso
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");
}
});
Sua ideia deve funcionar bem.Basicamente, você só deseja gerar um monte de threads e garantir que aqueles que estão escrevendo o arquivo demorem o suficiente para fazer os leitores esperarem.Se todos os seus threads retornarem sem erros e sem bloqueios para sempre, o teste será bem-sucedido.