2009-05-31 8 views
13

Ce post a commencé comme "Quels sont les modèles courants dans le test multi-thread unité?", Mais j'ai trouvé quelques otherdiscussions sur SO qui généralement convenu que "It is Hard (TM)" et "It Depends (TM) ". J'ai donc pensé que réduire la portée de la question serait plus utile.Quelles sont les stratégies pour tester un planificateur à l'unité?

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. Actuellement, nous faisons un wrapper léger autour de 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 chronométrer le fait que le travail a été appelé conformément à l'horaire spécifié?

+0

Avec Java 8, une meilleure mise en œuvre de l'horloge est disponible. –

Répondre

6

vous pouvez utiliser un objet enregistreur qui enregistrent 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. configure le calendrier
  3. exécuter le calendrier
+1

C'était la direction générale des pensées que j'avais. Merci d'avoir donné un nom à l'idée :). Est-ce un modèle déjà documenté? Un google rapide ne montre rien de concret. D'autre part, les suggestions de Christian sur le temps d'abstraction sont également intéressantes à explorer ... – StudioEvoque

3

un test unitaire

  • de vérifier que l'objet de l'enregistreur est "compatible" Il existe de nombreux modes de défaillance qu'un tel planificateur pourrait présenter, et chacun nécessiterait très probablement son propre cas de test. Ces cas de test sont susceptibles d'être très différents, donc "ça dépend".

    Pour tester les logiciels concurrents dans Java en général, je recommande cette présentation de JavaOne 2007: Testing Concurrent Software.

    Pour tester qu'un planificateur doit exécuter des tâches en respectant leur planning, je créerais une abstraction du temps lui-même. J'ai fait quelque chose de similaire dans un de mes projets, où j'ai une interface Time ou Clock. L'implémentation par défaut sera MillisecondTime, mais lors des tests, je la remplacerai par un TickTime. Cette implémentation permettra à mon test unitaire de contrôler quand le temps avance et de combien. De cette façon, vous pouvez écrire un test où un travail doit être exécuté une fois toutes les 10 ticks. Ensuite, votre test avance simplement le compteur de ticks et vérifie que les jobs fonctionnent correctement.

  • 4

    Une chose à retenir également est que vous n'avez pas besoin de tester cette minuterie. Vous pouvez écrire une version fictive de Timer (en étendant la classe ou en utilisant EasyMock) qui vérifie simplement que vous l'appelez correctement, peut-être même en remplaçant suffisamment que vous n'avez pas besoin de threads du tout. Dans ce cas, cela peut représenter plus de travail que nécessaire si votre tâche d'écoute dispose de suffisamment de rappels pour suivre le planificateur.

    L'autre point important à retenir est que lors du test du planificateur, utilisez des tâches personnalisées qui suivent le fonctionnement du planificateur; Lorsque vous testez des tâches planifiées, appelez les rappels directement et non via 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.

    1

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

    • exécutez le même code plusieurs fois sous charge, certains bogues apparaissent seulement occasionnellement, mais peuvent apparaître de manière cohérente si elle est répétée.
    • Stockez les résultats de différents threads/travaux dans une collection telle que 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 arbitraires laid)

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

    Questions connexes