Comment exécuter des cas de test JUnit à partir de la ligne de commande

333

Je voudrais exécuter des cas de test JUnit à partir de la ligne de commande. Comment puis-je faire ceci?

KK.
la source
question similaire sur android junit: stackoverflow.com/q/11144466/611007
n611x007
documents Android: exécution de tests sur un appareil ou un émulateur (à partir de la ligne de commande). ( via andreea.sandu)
n611x007
Réponse pour JUnit 5 sur stackoverflow.com/a/52373592/1431016
Sormuras
javac -cp "junit-4.12.jar; hamcrest-core-1.3.jar;." Tests.javatravaillé pour moi. Notez le point final - c'est important!
parsecer le

Réponses:

274

Pour JUnit 5.x, c'est:

java -jar junit-platform-console-standalone-<version>.jar <Options>

Trouvez un bref résumé sur https://stackoverflow.com/a/52373592/1431016 et tous les détails sur https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher

Pour JUnit 4.X, c'est vraiment:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

Mais si vous utilisez JUnit 3.X, notez que le nom de la classe est différent:

java -cp .:/usr/share/java/junit.jar junit.textui.TestRunner [test class name]

Vous devrez peut-être ajouter d'autres fichiers JAR ou répertoires avec vos fichiers de classe au chemin de classe et les séparer avec des points-virgules (Windows) ou des deux-points (UNIX / Linux). Cela dépend de votre environnement.

Edit: j'ai ajouté le répertoire actuel comme exemple. Cela dépend de votre environnement et de la façon dont vous construisez votre application (peut être bin / ou build / ou même my_application.jar, etc.). Remarque Java 6+ prend en charge les globes dans classpath, vous pouvez faire:

java -cp lib/*.jar:/usr/share/java/junit.jar ...

J'espère que ça aide. Écrivez des tests! :-)

lzap
la source
@Izap Une idée pour déterminer par programme si un test utilise JUnit4 ou JUnit3?
Goaler444
2
Class.forName je suppose. Cela fait des années que je programmais en Java pour la dernière fois ...
lzap 11/11/13
et si vous utilisez android?
n611x007
1
La documentation de l'argument "-cp" (c'est-à-dire le CLASSPATH) est ici (Java 7, Unix) et ici (Tutoriel) et ici (Java 8, Unix) et ici (Java 8, Windows) . Apparemment, les caractères génériques dans le chemin de classe sont désormais pris en charge.
David Tonhofer
1
Downvote. Pour JUnit 4.x, ce n'est pas correct. Vos instructions indiquent "Impossible de trouver la classe: [nom de la classe de test]" Même lorsque [nom de la classe de test] se trouve dans le chemin de classe.
Philip Rego
117

Chemin Maven

Si vous utilisez Maven, vous pouvez exécuter la commande suivante pour exécuter tous vos cas de test:

mvn clean test

Ou vous pouvez exécuter un test particulier comme ci-dessous

mvn clean test -Dtest=your.package.TestClassName
mvn clean test -Dtest=your.package.TestClassName#particularMethod

Si vous souhaitez voir la trace de la pile (le cas échéant) dans la console au lieu des fichiers de rapport dans le dossier target \ surefire-reports, définissez la propriété utilisateur surefire.useFile sur false. Par exemple:

mvn clean test -Dtest=your.package.TestClassName -Dsurefire.useFile=false

Façon Gradle

Si vous utilisez Gradle, vous pouvez exécuter la commande suivante pour exécuter tous vos cas de test:

gradle test

Ou vous pouvez exécuter un test particulier comme ci-dessous

gradle test --tests your.package.TestClassName
gradle test --tests your.package.TestClassName.particularMethod

Si vous souhaitez plus d'informations, vous pouvez envisager des options telles que --stacktrace, ou --info ou --debug.

Par exemple, lorsque vous exécutez Gradle avec le niveau d'enregistrement d'informations --info, il vous montrera le résultat de chaque test pendant leur exécution. S'il y a une exception, il vous montrera la trace de la pile, indiquant le problème.

gradle test --info

Si vous souhaitez voir les résultats globaux du test, vous pouvez par exemple ouvrir le rapport dans le navigateur (ouvrez-le à l'aide de Google Chrome dans Ubuntu):

google-chrome build/reports/tests/index.html

Fourmi façon

Une fois que vous avez configuré votre fichier de génération Ant build.xml, vous pouvez exécuter vos cas de test JUnit à partir de la ligne de commande comme ci-dessous:

ant -f build.xml <Your JUnit test target name>

Vous pouvez suivre le lien ci-dessous pour en savoir plus sur la configuration des tests JUnit dans le fichier de génération Ant: https://ant.apache.org/manual/Tasks/junit.html

Voie normale

Si vous n'utilisez pas Maven, Gradle ou Ant, vous pouvez suivre la procédure suivante:

Tout d'abord, vous devez compiler vos cas de test. Par exemple (sous Linux):

javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/TestClassName.java

Exécutez ensuite vos cas de test. Par exemple:

java -cp /absolute/path/for/compiled/classes:/absolute/path/to/junit-4.12.jar:/absolute/path/to/hamcrest-core-1.3.jar org.junit.runner.JUnitCore your.package.TestClassName
Yuci
la source
1
J'aime que cette réponse ait des exemples pour plusieurs technologies, bravo!
Josie Thompson
qu'en est-il des tests groovy utilisant la dernière approche?
midori
1
Insigne d'or bien mérité;)
Eric Duminil
Merci pour la version pour gradle! Gloire!
Ady
52

La réponse donnée par @lzap est une bonne solution. Cependant, je voudrais ajouter que vous devriez ajouter. dans le chemin d'accès aux classes, afin que votre répertoire actuel ne soit pas ignoré, ce qui entraînera la suppression de vos propres classes. Cela m'est arrivé sur certaines plateformes. Une version mise à jour pour JUnit 4.x serait donc:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]
rand_acs
la source
1
est-ce censé être un point-virgule?
panny
14
@panny c'est un point-virgule sous Windows. Sur un environnement n * nix (au moins OSX et toutes les distributions Linux que j'ai utilisées), vous utilisez deux points.
rand_acs
1
@rand_acs le nom de la classe de test doit-il être le nom de classe entièrement classé?
Goaler444
1
@ Goaler444 Oui, j'utilise toujours le nom complet, avec tous les espaces de noms spécifiés.
rand_acs
22

Assurez-vous que JUnit.jar se trouve dans votre chemin de classe, puis appelez le programme d'exécution de ligne de commande à partir de la console

java org.junit.runner.JUnitCore [nom de la classe de test]

Référence: junit FAQ

Gishu
la source
4
vous devez également configurer le reste du chemin de classe de votre projet.
Thilo
Cela donne simplement "Impossible de trouver la classe: [nom de la classe de test]" même lorsque [nom de la classe de test] est dans le chemin de classe.
Philip Rego
19

Avec JUnit 4.12, ce qui suit ne fonctionnait pas pour moi:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

Apparemment , à partir de JUnit 4.11, vous devriez également inclure hamcrest-core.jardans votre chemin de classe:

java -cp .:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar org.junit.runner.JUnitCore [test class name]
Stefan van den Akker
la source
Eu le même problème avec JUnit 4.12. Je suis venu avec une solution similaire, mais cela n'a pas fonctionné pour moi, car je n'ai pas pu charger JUnitCore. J'ai essentiellement basculé vers JUnit 4.8.2 car il ne nécessite pas d'inclure hamcrest-core.jar dans le chemin de classe.
Vladimir Nazarenko
Confirmé que cela doit être fait avec JUnit 4.12. +1.
rayryeng
Cela a fonctionné pour moi:java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [test class name]
Raffi Khatchadourian
11

Dans les fenêtres, c'est

java -cp .;/path/junit.jar org.junit.runner.JUnitCore TestClass [nom de la classe de test sans extension .class]

par exemple: c:\>java -cp .;f:/libraries/junit-4.8.2 org.junit.runner.JUnitCore TestSample1 TestSample2 ... et ainsi de suite, si l'on a plus d'une classe de test.

-cp représente le chemin de classe et le point (.) représente le chemin de classe existant tandis que le point-virgule (;) ajoute le pot supplémentaire donné au chemin de classe, comme dans l'exemple ci-dessus junit-4.8.2 est maintenant disponible dans classpath pour exécuter la classe JUnitCore qui ici, nous avons utilisé pour exécuter nos classes de test.

L'instruction de ligne de commande ci-dessus vous aide à exécuter des tests junit (version 4+) à partir de l'invite de commande (c'est-à-dire MSDos).

Remarque: JUnitCore est une façade pour exécuter des tests de junit, cette façade est incluse dans 4+ versions de junit.

garçon voyou
la source
Veuillez expliquer votre réponse très brièvement.
Mohit Jain
Je ne vous ai pas demandé d'être bref. J'ai demandé à ajouter quelques explications (au moins une brève explication). Il est recommandé d'expliquer le fonctionnement de votre réponse. Les lecteurs peuvent le comprendre, l'aimer, le voter.
Mohit Jain
donc si j'avais un pot de test supplémentaire ET le pot de vanille junit, je dois avoir les deux dans la commande java -cp pour que quoi que ce soit fonctionne réellement? Existe-t-il un moyen de mettre tout cela dans une ligne de commande afin que je n'aie pas à taper autant de choses?
Ungeheuer
5

En fait, vous pouvez également faire du test Junit un pot exécutable et appeler le pot exécutable en tant que java -jar

Indraneel
la source
2
Dans Eclipse, faites un clic droit sur votre projet JUnit -> Cliquez sur Exporter -> Choisissez Java-> Fichier Jar exécutable
Indraneel
4

Si votre projet est basé sur Maven, vous pouvez exécuter toutes les méthodes de test de la classe de test CustomTest qui appartient au module 'my-module' en utilisant la commande suivante:

mvn clean test -pl :my-module -Dtest=CustomTest

Ou exécutez une seule méthode de test myMethod à partir de la classe de test CustomTest à l'aide de la commande suivante:

mvn clean test -pl :my-module -Dtest=CustomTest#myMethod

Pour cette capacité, vous avez besoin du plug-in Maven Surefire v.2.7.3 + et Junit 4. Plus de détails sont ici: http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


la source
4

Personnellement, j'utiliserais le runner Maven surefire JUnit pour le faire.

djangofan
la source
-1

Si votre projet est basé sur une fourmi, vous devriez pouvoir faire quelque chose comme ça depuis la console:

ant test

Si cela ne fonctionne pas, mais que votre projet est basé sur des fourmis, vous pouvez exécuter ant -ppour répertorier les principales cibles du projet.

cherouvim
la source
2
le Q n'a rien à voir avec la fourmi
accuya
3
C'est pourquoi j'ai dit "si votre projet est basé sur les fourmis". Notez également que l'OP peut ne pas connaître la fourmi.
cherouvim
J'ai eu ce dillema, les fichiers de tests unitaires n'étaient pas dans le dossier marqué comme source par éclipse. Ce projet utilise ant pour construire, c'était la bonne façon d'exécuter ces tests JUnit.
Andrzej Rehmann