Quelle est la meilleure façon de tester unitairement à partir de plusieurs threads ?
-
09-06-2019 - |
Question
ce genre de chose fait suite à un autre question à moi.
Fondamentalement, une fois que j'ai le code pour accéder au fichier (j'examinerai les réponses dans une minute), quelle serait la meilleure façon de test il?
Je pense créer une méthode qui génère beaucoup de Travailleur d'arrière-planou quelque chose du genre et leur dit à tous de charger/enregistrer le fichier et de tester avec différentes tailles de fichiers/objets.Ensuite, obtenez une réponse des discussions pour voir si cela a échoué/réussi/fait imploser le monde, etc.
Pouvez-vous proposer des suggestions sur la meilleure façon d’aborder cela ?Comme je l'ai déjà dit, tout cela est un peu nouveau pour moi :)
Modifier
Suivant celui d'Ajmastrean poste:
J'utilise une application console pour tester avec Debug.Asserts :)
Mise à jour
Au départ, j'avais utilisé Travailleur d'arrière-plan pour gérer le threading (puisque je suis habitué à cela depuis le développement Windows), j'ai vite réalisé que lorsque j'effectuais des tests où plusieurs opérations (threads) devaient être terminées avant de continuer, j'ai réalisé que ce serait un peu un hack pour faites-le faire ça.
J'ai ensuite suivi ajmastréenet j'ai réalisé que je devrais vraiment utiliser le Fil classe pour travailler avec des opérations simultanées.Je vais maintenant refactoriser en utilisant cette méthode (bien qu'une approche différente).
La solution
Dans .NET, ThreadPool
les discussions ne reviendront pas sans configuration ManualResetEvent
s ou AutoResetEvent
s.Je trouve cela excessif pour une méthode de test rapide (sans parler du genre de complexité à créer, définir et gérer).Le travailleur d'arrière-plan est également un peu complexe avec les rappels et autres.
Quelque chose que j'ai trouvé et qui fonctionne est
- Créez un tableau de fils de discussion.
- Configurez le
ThreadStart
méthode de chaque thread. - Démarrez chaque fil.
- Rejoindre tous les threads (bloque le thread actuel jusqu'à ce que tous les autres threads soient terminés ou abandonnés)
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();
}
}
Autres conseils
@ajmastrean, puisque le résultat du test unitaire doit être prévisible, nous devons synchroniser les threads d'une manière ou d'une autre.Je ne vois pas de moyen simple de le faire sans utiliser d'événements.
J'ai trouvé que ThreadPool.QueueUserWorkItem me donne un moyen simple de tester de tels cas d'utilisation
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");
}
});
Votre idée devrait bien fonctionner.Fondamentalement, vous voulez simplement générer un tas de threads et vous assurer que ceux qui écrivent le fichier prennent suffisamment de temps pour le faire pour faire attendre les lecteurs.Si tous vos threads reviennent sans erreur et sans blocage permanent, alors le test réussit.