Question

Ce poste a commencé comme « Quels sont certains modèles communs dans les tests unitaires du code multi-thread? », Mais je l'ai trouvé un peu discussions href="https://stackoverflow.com/questions/352695/best-way-to-run-multi-threaded-nunit-tests"> sur SO qui généralement admis qu ' "il est difficile (TM)" et "It Depends (TM)". Donc, je pensais que la réduction de la portée de la question serait plus utile.

Contexte : Nous mettons en place un programmateur simple qui vous donne un moyen d'enregistrer callbacks lors du démarrage et l'arrêt de travail et bien sûr configurer la fréquence de la planification. , Nous actuellement un emballage léger autour java.util.Timer.

Aspects :

  • Je ne l'ai pas trouvé un moyen de tester ce planificateur en se basant sur les interfaces publiques seulement (quelque chose comme addJob(jobSchedule, jobArgs,jobListener), removeJob(jobId)).

  • Comment puis-je chronométré le fait que le travail a été appelé selon le calendrier spécifié?

Était-ce utile?

La solution

vous pouvez utiliser un enregistrement qui objet enregistreur l'ordre, les horaires et d'autres choses utiles dans chaque test unitaire de votre planificateur. Le test est simple:

  1. créer un objet enregistreur
  2. configurer le planning
  3. exécuter un test unitaire
  4. vérifier que l'objet de l'enregistreur est « compatible » avec le calendrier

Autres conseils

Une chose aussi à retenir est que vous n'avez pas besoin de tester qui fonctionne minuterie. Vous pouvez écrire une version maquette de la minuterie (en étendant la classe ou en utilisant EasyMock ) qui vérifie simplement que vous appellent correctement, peut-être même remplacer assez que vous n'avez pas besoin du tout fils. Dans ce cas, qui pourrait être plus de travail que nécessaire si votre auditeur d'emploi a assez callbacks pour suivre le planificateur.

L'autre chose importante à retenir est que lors du test du planificateur, utilisez des travaux personnalisés qui permettent de suivre comment le planificateur fonctionne; lors du test de travaux programmés, appelez directement les callbacks et non par le planificateur. Vous pouvez avoir un test d'intégration de niveau supérieur qui vérifie les deux ensemble, en fonction du système.

Il existe de nombreux modes de défaillance qu'un tel planificateur pourrait exposer, et chacun aurait probablement besoin de ses propres cas de test. Ces cas de test sont susceptibles d'être très différent, donc « ça dépend ».

Pour tester le logiciel concurrent en Java en général, je recommande cette présentation de JavaOne 2007: Test simultané du logiciel .

Pour les tests qu'un planificateur doit exécuter des tâches précises en fonction de leur emploi du temps, je créerais une abstraction du temps lui-même. Je l'ai fait quelque chose de semblable dans l'un de mes projets, où j'ai un temps ou de l'interface de l'horloge. La mise en œuvre par défaut sera MillisecondTime, mais au cours des essais je vais le mettre avec un Déf. Cette mise en œuvre permettra à mon test unitaire pour contrôler lorsque le temps avance et combien.

De cette façon, vous pouvez écrire un test où un travail est programmé pour exécuter une fois tous les 10 tiques. Ensuite, votre test avance que le compteur de la tique et vérifie pour vous assurer que les travaux sont exécutés à tiques correctes.

Un couple de façons de tester du code concurrent.

  • exécuter le même code plusieurs fois sous charge, quelques bugs apparaissent uniquement de temps en temps, mais peut apparaître constamment si elle est effectuée de façon répétée.
  • Stocker les résultats des différents fils / emplois dans une collection par exemple un BlockingQueue. Cela vous permettra de vérifier les résultats dans le thread courant et l'arrivée en temps opportun (sans déclarations de sommeil arbitraire laid)

Si vous trouvez des tests difficiles concurrency considérer refactorisation vos objets / composants pour les rendre plus faciles à tester.

Si les délégués du planificateur à un Executor ou ExecutorService pour exécuter les tâches, vous pouvez utiliser l'injection de dépendance pour éliminer une dépendance directe du type de Executor et utiliser un simple et unique Executor filetée pour tester la plupart des fonctionnalités de votre planificateur sans la complication de vraiment multi-thread code. Une fois que vous avez obtenu ces tests auriez débogués, vous pouvez déplacer le plus dur, mais maintenant considérablement réduit en amplitude, tâche de sécurité des threads de test.

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