web-dev-qa-db-fra.com

Exécutez tous les tests dans Junit 4

Je veux pouvoir exécuter tous les tests d'un projet par programme. Je sais qu'Eclipse a une configuration "Exécuter en tant que test JUnit" qui saisit en quelque sorte tous les tests d'un projet et les exécute. Existe-t-il un moyen pour moi de récupérer également la liste des tests par programme et de les exécuter? Ou existe-t-il un bon moyen de construire une suite de tests contenant tous les cas de test sans en énumérer manuellement chacun (tous les 700+)?

J'ai essayé l'option "Nouveau ... -> Suite de tests" dans Eclipse, mais cela semble fonctionner uniquement pour JUnit 3, identifiant les tests par leur extension à partir de TestCase

Les classes de test sont JUnit 4, donc leur seule caractéristique distinctive est l'annotation, pas de convention de dénomination, pas de sous-classe de TestCase.

Merci d'avance!

31
alexloh

Bien que cela ne résout pas vraiment votre problème immédiat, je trouve que c'est une pratique générale très utile pour créer des suites et des suites de suites, par exemple pour un package quelque chose comme PackageFooSuite etc. et assemblez à nouveau ces suites dans une ou plusieurs suites, comme ModuleFooSuite et ayez une suite de niveau supérieur, comme AllTestsSuite. De cette façon, il est facile d'exécuter tous les tests en une seule étape ainsi que les tests de sous-module pour le package sur lequel je travaille actuellement (et les tests s'exécutent plus rapidement que si je les exécutais toujours tous):

@RunWith(Suite.class)
@Suite.SuiteClasses({ PackageFooSuite.class, PackageBarSuite.class} )
public final class AllTestsSuite {} // or ModuleFooSuite, and that in AllTests
23
Fabian Steeg

Aucune des autres réponses ne l'a fait pour moi. J'ai eu 40 000 tests que je devais exécuter, donc lister manuellement chaque classe n'était pas une option.

Je l'ai fait avec ClasspathSuite . Une suite de tests qui exécute tous les cas de test Junit4 et Junit3 dans le chemin de classe est la suivante:

import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import static org.junit.extensions.cpsuite.SuiteType.*;

@RunWith(ClasspathSuite.class)
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
        /* main method not needed, but I use it to run the tests */
        public static void main(String args[]) {
                JUnitCore.runClasses(RunAllSuite.class);
        }
}

J'avais besoin de l'exécuter à partir de la ligne de commande, alors voici ce que j'ai fait:

  1. Téléchargé cp-1.2.6.jar
  2. Créez le RunAllSuite mentionné précédemment
  3. Compilez la classe, javac RunAllSuite.Java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar
  4. l'exécuter avec des tests cibles dans le chemin de classe, Java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar;path/to/runallsuite/folder;target/classes;target/test-classes RunAllSuite

Et c'est tout. Avec RunAllSuite ci-dessus, n'importe où dans votre code, vous pouvez simplement faire JUnitCore.runClasses (RunAllSuite.class), qui exécute tous les tests dans le chemin de classe. Il existe également d'autres options de configuration qui sont expliquées dans la page d'accueil de ClasspathSuite.

Notez également que la classe donnée ci-dessus n'imprime rien. Si cela est nécessaire, vous pouvez le faire

import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import org.junit.internal.TextListener;
import static org.junit.extensions.cpsuite.SuiteType.*;

@RunWith(ClasspathSuite.class)
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
        public static void main(String args[]) {
                JUnitCore junit = new JUnitCore();
                junit.addListener(new TextListener(System.out));
                junit.run(RunAllSuite.class);
        }
}
15
eis

Dans Eclipse (j'utilise 4.6.1) - Faites un clic droit sur le dossier du projet, sélectionnez "Exécuter en tant que", choisissez "Test JUnit"

Il exécutera tous les tests de ce projet. Idem pour un package.

3
Carlos Rendon

Vous pouvez le faire assez facilement depuis maven en utilisant le plugin surefire : Je nettoie/compile/installe généralement mes projets à partir de la ligne de commande avant de les comparer pour l'utilisation d'Eclipse (mvn Eclipse:clean Eclipse:eclipse) et vous pouvez définir une suite de tests dans votre pom qui répertorie tous les tests que vous souhaitez exécuter en masse à chaque fois que vous exécutez mvn install. Vous ne les appelez pas par programme, exactement, mais vous pouvez certainement les appeler en masse.

3
davek

Du haut de ma tête en utilisant Spring:

  • Implémentez un TypeFilter qui correspond aux classes avec des méthodes annotées avec @Test (n'oubliez pas de considérer les superclasses)
  • Appelez l'analyse du chemin de classe sur votre package de test le plus haut
  • Appelez le JUnitRunner avec les résultats de l'analyse

Plus d'informations sur l'analyse des chemins de classe et les filtres de type personnalisés ici

2
Axel Fontaine

Avec Eclipse Indigo (éventuellement Helios également) dans la boîte de dialogue Exécuter les configurations, vous avez maintenant la possibilité d'exécuter tous les tests dans un projet, un package ou un dossier source sélectionné.

L'article Java Unit testing with JUnit 4.x in Eclipse est également une bonne référence d'Eclipse.

1
Mookie Wilson

Je recommande également d'utiliser les annotations de JUnit Suite. Suivez le lien pour plus de détails .

0
cmcginty