411 votes

Ignorer les tests conditionnellement dans JUnit 4

OK, donc le @Ignore d'annotation est bon pour le marquage d'un cas de test ne devrait pas être exécuté.

Cependant, parfois, j'ai envie d'ignorer un test basé sur les informations d'exécution. Un exemple pourrait être: si j'ai une simultanéité de test qui doit être exécuté sur une machine avec un certain nombre de cœurs. Si ce test ont été effectués sur une machine monoprocesseur, je ne pense pas qu'il serait juste de juste de passer le test (car il n'a pas été exécuté), et il n'aurait pas droit à l'échec du test et de briser la construction.

Donc, je veux être capable d'ignorer les tests lors de l'exécution, comme cela semble être le bon résultat (depuis le framework de test permettra la construction de passe mais également d'enregistrer que les tests n'étaient pas courir). Je suis assez sûr que l'annotation ne me donne pas cette souplesse, et que vous pensez que je vais avoir besoin de créer manuellement la suite de test pour la classe en question. Toutefois, la documentation ne mentionne rien à ce sujet et à la recherche par le biais de l' API, il n'est également pas clair comment cela pourrait être fait par programmation (c'est à dire comment faire par programmation à créer une instance d' Test ou similaire qui est équivalent à celui créé par l' @Ignore d'annotation?).

Si quelqu'un a fait quelque chose de semblable dans le passé, ou a une brillante idée de comment je pourrais aller à ce sujet, je serais heureux d'en entendre parler.

545voto

Yishai Points 42417

JUnit façon est de le faire au moment de l'exécution est - org.junit.Assume.

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

Vous pouvez le faire dans un @Avant la méthode ou dans le test lui-même, mais pas dans un @Après la méthode. Si vous le faites dans le test lui-même, de votre méthode @before allez vous faire.

Une hypothèse échec, le test pour être ignoré.

Edit: À comparer avec la @RunIf d'annotation à partir d'junit-ext, leur exemple de code devrait ressembler à ceci:

@Test
public void calculateTotalSalary() {
     assumeThat(Database.connect(), is(notNull()));
    //test code below.
 }

Pour ne pas mentionner qu'il est beaucoup plus facile à capturer et utiliser la connexion de l' Database.connect() méthode de cette façon.

53voto

notnoop Points 30218

Vous devriez vérifier Junit-ext project. Ils ont RunIf annotation qui effectue des tests conditionnels, comme:

 @Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null
   }
}
 

[Exemple de code tiré de leur tutoriel]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X