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).

Était-ce utile?

La solution

Dans .NET, ThreadPool les discussions ne reviendront pas sans configuration ManualResetEvents ou AutoResetEvents.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

  1. Créez un tableau de fils de discussion.
  2. Configurez le ThreadStart méthode de chaque thread.
  3. Démarrez chaque fil.
  4. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top