121 votes

JUnit : comment éviter "no runnable methods" dans les classes de test utils

Je suis passé de JUnit3.8 à JUnit4.4. J'exécute mes tests à l'aide de Ant, tous mes tests s'exécutent avec succès mais les classes utilitaires de test échouent avec l'erreur "No runnable methods". Le modèle que j'utilise est d'inclure toutes les classes avec le nom *Test* dans le dossier de test.

Je comprends que le runner ne peut pas trouver de méthode annotée avec l'attribut @Test. Mais elles ne contiennent pas cette annotation car ces classes ne sont pas des tests. Étonnamment, lorsque l'on exécute ces tests dans Eclipse, il n'y a pas de plainte concernant ces classes.

Dans JUnit3.8, ce n'était pas du tout un problème puisque ces classes utilitaires n'étendaient pas TestCase et que le runner n'essayait pas de les exécuter.

Je sais que je peux exclure ces classes spécifiques dans la cible junit dans ant script. Mais je ne veux pas modifier le fichier de construction à chaque nouvelle classe utilitaire que j'ajoute. Je peux aussi renommer les classes (mais donner de bons noms aux classes a toujours été mon plus faible talent :-) )

Existe-t-il une solution élégante pour ce problème ?

0 votes

Vos tests fonctionnent-ils dans Eclipse/NetBeans/ votre IDE préféré ?

0 votes

J'utilise eclipse. En fait, il n'y a pas de problème, mais Eclipse n'essaie pas d'exécuter ces classes. Je me demande comment ?

0 votes

Je ne sais pas si nous avons compris votre question. Veuillez relire votre question et probablement ajouter quelques informations supplémentaires.

144voto

JoelPM Points 803

Annotez vos classes utilitaires avec @Ignore. Cela permettra à JUnit de ne pas essayer de les exécuter en tant que tests.

7 votes

En fait, non, ça ne devrait pas. @Ignore sert à désactiver temporairement les tests.

2 votes

Désolé mais c'est une mauvaise idée. Vous voulez commencer à annoter votre code de production avec des annotations liées aux tests juste parce qu'elles pourraient correspondre à un modèle de test ? La bonne réponse est de corriger les noms de classe s'ils déclenchent le filtrage des tests. Et assurez-vous que le modèle ne trouve que les classes qui se terminent par Test. C'est un modèle communément accepté

0 votes

Ouais, c'est mauvais et je ne l'ai réalisé qu'après avoir contribué à un autre upvote que je ne peux pas enlever. Rendez votre classe de base abstraite, alors JUnit l'ignorera. Voir la réponse de @gmoore ci-dessous.

87voto

gmoore Points 2225

Mon cas spécifique présente le scénario suivant. Nos tests

public class VenueResourceContainerTest extends BaseTixContainerTest

tous s'étendent

BaseTixContainerTest

et JUnit a essayé d'exécuter BaseTixContainerTest. Le pauvre BaseTixContainerTest essayait juste de configurer le conteneur, de configurer le client, de commander une pizza et de se détendre... mec.

Comme mentionné précédemment, vous pouvez annoter la classe avec

@Ignore

Mais cela a conduit JUnit à signaler que ce test a été ignoré (par opposition à complètement ignoré).

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1

Ça m'a un peu irrité.

J'ai donc rendu BaseTixContainerTest abstrait, et maintenant JUnit l'ignore vraiment.

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

8 votes

Bien mieux que @Ignore

0 votes

J'ai essayé l'approche @Ignore et je me suis dit que c'était une bonne chose, puis j'ai lu cette réponse et je me suis tapé sur le front. cours !"

51voto

Jon Skeet Points 692016

En supposant que vous contrôlez le modèle utilisé pour trouver les classes de test, je vous suggère de le modifier pour qu'il corresponde aux critères suivants *Test plutôt que *Test* . De cette façon TestHelper ne seront pas appariés, mais FooTest volonté.

1 votes

Je ne pense pas que cela puisse aider, car il est passé à JUnit 4.4 et cela ne devrait pas avoir d'importance.

2 votes

Vous semblez ne pas avoir compris le sens de ma réponse. Il a un filtre de nom pour déterminer les classes à considérer comme des tests. S'il modifie le filtre, il peut facilement exclure les classes d'aide.

1 votes

Votre suggestion est valable, mais j'ai vérifié mes classes de test et certaines commencent par Test et d'autres se terminent par Test. Il n'y a pas de distinction claire entre les classes utilitaires et les vraies classes de test. Pensez-vous que la convention que vous avez suggérée soit une bonne pratique ? (c'est-à-dire que les utilitaires commencent par Test, et les tests se terminent par Test)

39voto

froh42 Points 2759

Pour empêcher JUnit d'instancier votre classe de base de test, il suffit de la rendre

public abstract class MyTestBaseClass { ... whatever... }

(@Ignore le rapporte comme ignoré ce que je réserve pour temporairement tests ignorés).

3 votes

Les runners de JUnit essaient souvent d'instancier les classes abstraites également, et échouent alors avec une erreur d'instanciation.

0 votes

Fonctionne parfaitement pour mes classes de test de base

4 votes

Cela fonctionne à cause du nom (il ne se termine pas par Test), et non à cause du modificateur abstrait. Changez le nom de la classe en MyBaseClassTest et elle essaiera de s'instancier comme mentionné par @HollyCummins (et échouera).

8voto

mc1arke Points 86

Ant est maintenant livré avec le skipNonTests qui a été conçu pour faire exactement ce que vous semblez rechercher. Il n'est pas nécessaire de changer vos classes de base en classes abstraites ou de leur ajouter des annotations.

2 votes

On dirait que le skipNonTests n'est disponible que dans ant 1.9+, ce qui est dommage, car il semble incroyablement utile. Il exclura également les superclasses de test abstraites.

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