La Force de JUnit pour exécuter un cas de test à un moment
J'ai une situation problématique avec certains assez avancé de tests unitaires (à l'aide de PowerMock de se moquer et de JUnit 4.5). Sans entrer dans trop de détails, le premier cas de test d'une classe de test est toujours une réussite, mais toute la suite des cas de test dans la même classe de test échoue. Cependant, si je sélectionne uniquement l'exécution de cas de test à 5 sur 10, par exemple, il va passer. Si tous les tests passent au moment d'être exécuté individuellement. Est-il de toute façon à force de JUnit pour exécuter un cas de test à un moment? J'appelle JUnit d'une fourmi-script.
Je suis conscient du problème de charge des cas de test, mais je ne peux pas montrer pourquoi c'est. Il n'y a pas enregistré les variables à travers le cas de test, donc rien à faire à @Avant d'annotation. C'est pourquoi je suis à la recherche d'une solution d'urgence comme le fait de forcer JUnit pour effectuer des tests individuellement.
Non, c'est JUnit 4.5.
Merci de modifier ces informations dans votre question, afin que chacun puisse le lire.
"Il n'y a pas enregistré les variables à travers les cas de test" êtes-vous sûr de cela? Quid des variables statiques?
Comment fonctionne exactement un test échoue, c'est à dire de quoi avez-vous tester?
OriginalL'auteur Ciryon | 2009-02-13
Vous devez vous connecter pour publier un commentaire.
Votre problème n'est pas que JUnit exécute tous les tests à la fois, votre problème est que vous ne voyez pas pourquoi un test échoue. Solutions:
Exemple:
OriginalL'auteur
Je suis conscient de toutes les recommandations, mais pour enfin répondre à votre question ici est une façon simple d'obtenir ce que vous voulez. Juste mettre ce code à l'intérieur de votre cas de test:
Avec cela, aucun test ne permet de démarrer jusqu'à ce que le verrou est acquis, et une seule serrure peut être acquis à un moment.
OriginalL'auteur hariseldon78
Il semble que vos cas de test sont dépendants, c'est: de l'exécution de cas-X affecte l'exécution de cas-Y. un Tel système de test doit être évitée (par exemple: il n'y a pas de garantie sur l'ordre de JUnit va lancer votre cas).
Vous devez restructurer le cas pour les rendre indépendants les uns des autres. À de nombreuses reprises l'utilisation de @Before et @Après méthodes peuvent vous aider à démêler ces dépendances.
Je suis conscient du problème de charge des cas de test, mais je ne peux pas montrer pourquoi c'est. Il n'y a pas enregistré les variables à travers le cas de test, donc rien à faire à @Avant d'annotation. C'est pourquoi je suis à la recherche d'une solution d'urgence comme le fait de forcer JUnit pour effectuer des tests individuellement.
La dépendance a de nombreux visages: Bases de données, des fichiers, des propriétés du système, etc. Vous devriez réduire votre suite à deux tendances contradictoires tests. Commenter le code dans un test jusqu'à ce qu'ils réussissent. Ensuite, décommentez et faire la même chose dans le deuxième essai. Cela vous donnera quelques idées sur la cause de votre problème.
"Il n'y a pas enregistré les variables à travers les cas de test" êtes-vous sûr de cela? Quid des variables statiques?
OriginalL'auteur Itay Maman
Félicitations. Vous avez trouvé un bug. 😉
Si les tests ne "devraient" pas d'effet uns des autres, alors vous pourriez avoir découvert une situation où votre code peut entrer dans un état rompu. Essayez d'ajouter affirme et la journalisation de figure où le code qui va mal. Vous pouvez même avoir besoin pour exécuter les tests dans un débogueur et vérifier votre code de valeurs internes d'après le premier test.
OriginalL'auteur Chris Nava
Excusez-moi si je n'ai pas de répondre directement à votre question, mais ce n'est pas votre problème exactement ce cas de test.setUp() et des cas de test.tearDown() sont censés résoudre? Ce sont des méthodes que le framework JUnit sera toujours appeler avant et après chaque cas de test, et sont généralement utilisés pour vous assurer de commencer chaque cas de test dans le même état.
Voir aussi la JavaDoc pour les cas de test.
OriginalL'auteur lindelof
Vous devriez vérifier l'ensemble de votre base de code qu'il n'y a pas de variables statiques qui se réfèrent à mutable état. Idéalement, le programme ne devrait avoir aucun statique mutable état (ou, au moins, ils devraient être documentées comme je l'ai fait ici). En outre, vous devriez être très prudent au sujet de nettoyage jusqu'à ce que vous écrivez, si les tests d'écriture sur le système de fichiers ou de base de données. Sinon, exécuter les tests peuvent avoir des fuites de certains effets secondaires, ce qui rend difficile de faire les tests indépendants et reproductible.
Maven et Ant contenir un "forkmode" paramètre pour l'exécution des tests JUnit, qui indique si chaque de la classe de test obtient sa propre JVM ou tous les tests sont exécutés dans la même JVM. Mais ils n'ont pas une option pour l'exécution de chaque méthode d'essai dans sa propre JVM.
OriginalL'auteur Esko Luontola
Le @Avant l'énoncé est sans danger, car elle est appelée pour chaque cas de test. Le @AvantClasse est dangereux, car il doit être statique.
OriginalL'auteur guerda
Il me semble que peut-être il n'est pas que vous n'êtes pas de configuration ou de démolir votre tests correctement (bien que supplémentaires de réglage/démontage peut être partie de la solution), mais peut-être que vous avez partagé de l'état dans votre code que vous n'êtes pas conscient de. Si un premier test est un paramètre statique /singleton /variable partagée qui vous ignorent, le plus tard, des tests échouent si elles ne s'attend pas à ce. Même avec les objets fantaisie, c'est très possible. Vous avez besoin de trouver cette cause. Je suis d'accord avec les autres réponses que les tests ont mis en lumière un problème qui ne doit pas être résolu en essayant d'exécuter les tests différemment.
OriginalL'auteur Peter
Votre description me montre, que vos tests unitaires dépendent les uns des autres. C'est fortement déconseillé dans les tests unitaires.
Test unitaire doit être indépendante et isolée. Vous devez être en mesure de les exécuter, à lui seul, tous (dans quel ordre, il n'a pas d'importance).
Je sais, ça ne vous aide pas. Le problème sera dans votre
@BeforeClass
ou@Before
consolidés. Il y aura des dépendances. Afin de refactoriser et essayer d'isoler le problème.Probablement votre simulacres sont créés dans votre
@BeforeClass
. Envisager de le mettre dans la@Before
déclaration. Donc il n'y a pas d'instance qui durent plus d'un cas de test.Bon, c'est fortement déconseillé.
OriginalL'auteur guerda