Comment faire pour exécuter la simultanéité de l'unité de test?
Comment utiliser junit pour exécuter la simultanéité de test?
Disons que j'ai une classe
public class MessageBoard
{
public synchronized void postMessage(String message)
{
....
}
public void updateMessage(Long id, String message)
{
....
}
}
Je wan pour tester de multiples accès à ce postMessage simultanément.
Tous les conseils sur ce point? Je tiens à exécuter ce genre de simultanéité de test à l'encontre de tous mes fonctions de définition (ou de toute méthode qui consiste à créer/mettre à jour/supprimer l'opération).
Vous devez vous connecter pour publier un commentaire.
Malheureusement, je ne crois pas que vous pouvez définitivement prouver que votre code est thread-safe en utilisant le temps de le tester. Vous pouvez lancer autant de threads que vous le souhaitez contre elle, et il peut/ne peut pas passer en fonction sur le calendrier.
Peut-être vous devriez regarder quelques les outils d'analyse statique, comme PMD, qui peut déterminer la façon dont vous utilisez la synchronisation et d'identifier les problèmes d'utilisation.
Je vous conseille d'utiliser MultithreadedTC - Écrit par la simultanéité maître lui-même Le Projet De Loi Pugh (et Nat Ayewah). Citation de leur vue d'ensemble:
Ce cadre permet de façon déterministe de test de tous les fils de l'entrelacement dans des essais séparés
Vous ne pouvez prouver la présence concomitante de bugs, pas de leur absence.
Cependant, vous pouvez écrire un test spécialisé coureur qui engendre plusieurs threads et appelle ensuite votre @Test annoté méthodes.
Dans .NET, il existe des outils comme TypeMock Racer ou Microsoft ÉCHECS qui sont conçus spécifiquement pour les tests unitaires de la simultanéité. Ces outils non seulement trouver le multithreading bugs comme des blocages, mais aussi vous donner l'ensemble des fil entrelace que reproduire les erreurs.
J'imagine que il y a quelque chose de similaire pour le monde Java.
Cours d'exécution simultanément peut conduire à des résultats inattendus. Par exemple, je viens de découvrir, que, si mon Test de suite avec 200 tests de passe lors de l'exécution, un par un, il ne parvient pas pour l'exécution en simultané, j'ai creusé, et il n'était pas un thread de problème de sécurité, mais un test selon un autre, ce qui est une mauvaise chose et je pourrais résoudre le problème.
Mycila travail sur JUnit ConcurrentJunitRunner et ConcurrentSuite est très intéressant. L'article semble un peu obsolète par rapport à la dernière version GA, dans mes exemples, je vais vous montrer la mise à jour de l'utilisation.
L'annotation d'une classe de test comme suit causer à exécuter des méthodes d'essai simultanément, avec un niveau de simultanéité de 6:
Vous pouvez également exécuter toutes les classes de test en parallèle:
La Maven dependency est:
Je suis actuellement étudiant comment exécuter des méthodes plusieurs fois et en même temps avec ce package. Il peut être possible déjà, si quelqu'un a un exemple, laissez-moi savoir, en dessous de mon homebrewed solution.
Comme d'autres l'ont noté, c'est vrai que vous ne pouvez jamais être sûr de savoir si une simultanéité bug allait venir ou pas, mais avec des dizaines de milliers ou centaines de milliers d'exécutions, avec une simultanéité de, dire 16, la statistique est de votre côté.
Essayez de regarder ActiveTestSuite qui est livré avec JUnit. Il peut en même temps de lancer plusieurs tests JUnit:
Ci-dessus fonctionnera de la même classe de test JUnit 5 fois en paralèlle. Si vous voulait les variations dans vos parallèle des tests, il suffit de créer une classe différente.
Dans votre exemple, la méthode postMessage() est synchronisé, afin de ne pas voir réellement des effets secondaires de la concurrence au sein d'une même VM, mais vous pourriez être en mesure d'évaluer les performances de la version synchronisée.
Vous aurez besoin pour exécuter plusieurs copies du programme de test en même temps dans les différentes machines virtuelles. Vous pouvez utiliser
Si vous ne pouvez pas obtenir votre framework de test pour le faire, vous pouvez lancer certains VMs de votre auto.
Le processus générateur des choses est une douleur, avec des sentiers et autres joyeusetés, mais ici, c'est le général de l'esquisse:
J'ai l'habitude de faire quelque chose comme cela pour la simple filetée tests, comme les autres ont publié, le test n'est pas une preuve de l'exactitude, mais il secoue idiot de bugs dans la pratique. Il permet de tester pendant un long moment sous une variété de conditions différentes, parfois des bogues de simultanéité prendre un certain temps à se manifester dans un test.
Tests de simultanéité des bugs, c'est impossible; vous ne vous contentez pas avoir à valider les paires d'entrées/sorties, mais vous devez valider l'état dans des situations qui peuvent ou peuvent ne pas se produire lors de vos tests. Malheureusement, JUnit n'est pas équipé pour le faire.
Vous pouvez utiliser le programme tempus fugit bibliothèque pour exécuter des méthodes d'essai en parallèle et à plusieurs reprises pour simuler un test de charge type d'environnement. Bien qu'un précédent commentaire souligne que la méthode post est syncrhonised et donc protégé, membres associés ou méthodes peuvent être impliqués, et qui eux-mêmes ne sont pas protégés, de sorte que son possible qu'une charge /soak test de type pourrait attraper ces. Je vous suggère de vous installer un assez gros grains /de bout en bout comme test pour vous donner la meilleure chance d'attraper des trous de boucle.
Voir JUnit, la section intégration de la la documentation.
BTW, j'ai un développeur sur ce projet 🙂
TestNG en charge de la simultanéité des tests en Java. Cette l'article décrit comment il peut être utilisé et il y a des docs sur le testng site.
Vous ne savez pas si vous pouvez faire le même test dans le même temps,
La meilleure approche consiste à utiliser des tests de système pour faire sauter votre code avec des demandes pour voir si il tombe. Utilisez ensuite l'unité de test pour vérifier la logique de l'exactitude. La façon dont je voudrais cette approche est de créer un proxy pour l'appel asynchrone et l'ont fait de manière synchrone en cours de test.
Cependant, si vous vouliez faire cela à un autre niveau que l'installation complète et complète de l'environnement, vous pourriez le faire dans junit par la création de votre objet dans un thread séparé, puis de créer beaucoup de threads que le feu les demandes de votre objet et de bloquer le thread principal jusqu'à la fin. Cette approche peut faire des tests échouer par intermittence si vous n'avez pas l'obtenir.
Vous pouvez également essayer HavaRunner. Il exécute les tests en parallèle par défaut.