Ignorer sous condition les tests dans JUnit 4

OK, l’annotation @Ignore est donc utile pour @Ignore test ne doit pas être exécuté.

Cependant, je souhaite parfois ignorer un test basé sur des informations d’exécution. Un exemple pourrait être si j’ai un test de concurrence qui doit être exécuté sur une machine avec un certain nombre de cœurs. Si ce test était exécuté sur une machine monoprocesseur, je ne pense pas qu’il serait correct de simplement passer le test (puisqu’il n’a pas été exécuté), et il ne serait certainement pas correct d’échouer le test et de casser la version .

Je veux donc pouvoir ignorer les tests à l’exécution, car cela semble être le bon résultat (puisque le framework de test permettra à la build de passer mais enregistre que les tests n’ont pas été exécutés). Je suis presque certain que l’annotation ne me donnera pas cette flexibilité, et je pense que je devrai créer manuellement la suite de tests pour la classe en question. Cependant, la documentation ne mentionne rien à ce sujet et à travers l’ API, il n’est pas clair non plus comment cela se ferait par programmation (c.-à-d. Comment créer une instance de Test ou similaire équivalente à celle créée par l’annotation @Ignore ?).

Si quelqu’un a fait quelque chose de similaire dans le passé ou a une idée claire de ce que je pourrais faire d’autre, je serais heureux d’en entendre parler.

La manière de JUnit est de le faire lors 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 une méthode @Before ou dans le test lui-même, mais pas dans une méthode @After . Si vous le faites dans le test lui-même, votre méthode @Before sera exécutée. Vous pouvez également le faire dans @BeforeClass pour empêcher l’initialisation de la classe.

Un échec d’hypothèse fait que le test est ignoré.

Edit: pour comparer avec l’annotation @RunIf de junit-ext , leur exemple de code devrait ressembler à ceci:

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

Sans compter qu’il est beaucoup plus facile de capturer et d’utiliser la connexion de la méthode Database.connect() cette façon.

Vous devriez Junit-ext projet Junit-ext . Ils ont RunIf annotation RunIf qui effectue des tests conditionnels, tels que:

 @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]

Dans JUnit 4, vous pouvez également créer une annotation pour indiquer que le test doit répondre à vos critères personnalisés, puis étendre le runner par défaut avec les vôtres et utiliser la reflection pour baser votre décision sur les critères personnalisés. Cela peut ressembler à ceci:

 public class CustomRunner extends BlockJUnit4ClassRunner { public CTRunner(Class klass) throws initializationError { super(klass); } @Override protected boolean isIgnored(FrameworkMethod child) { if(shouldIgnore()) { return true; } return super.isIgnored(child); } private boolean shouldIgnore(class) { /* some custom criteria */ } } 

Une note rapide: Assume.assumeTrue(condition) ignore les étapes restantes mais passe le test. Pour échouer au test, utilisez org.junit.Assert.fail() dans l’instruction conditionnelle. Fonctionne comme Assume.assumeTrue() mais échoue au test.