Exécuter un test unique à partir d'une classe JUnit en utilisant la ligne de commande

95

J'essaie de trouver une approche qui me permettra d'exécuter un seul test à partir d'une classe JUnit en utilisant uniquement la ligne de commande et java.

Je peux exécuter l'ensemble des tests de la classe en utilisant ce qui suit:

java -cp .... org.junit.runner.JUnitCore org.package.classname

Ce que je veux vraiment faire, c'est quelque chose comme ça:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

ou:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

J'ai remarqué qu'il pourrait y avoir des moyens de le faire en utilisant les annotations JUnit, mais je préférerais ne pas modifier la source de mes classes de test à la main (en essayant d'automatiser cela). J'ai également vu que Maven pourrait avoir un moyen de le faire, mais si possible, j'aimerais éviter de dépendre de Maven.

Alors je me demande s'il y a un moyen de faire cela?


Points clés que je recherche:

  • Possibilité d'exécuter un seul test à partir d'une classe de test JUnit
  • Ligne de commande (en utilisant JUnit)
  • Évitez de modifier la source de test
  • Évitez d'utiliser des outils supplémentaires
Kevin Jalbert
la source
4
Cool, un autre passionné de type "Unix est mon IDE". J'aime utiliser un IDE pour un éditeur (en particulier avec le plugin vim pour NetBeans), mais je suis d'accord que les petits outils pointus qui durent "pour toujours", et peuvent être assemblés dans des configurations arbitraires, sont souvent mieux que de réapprendre constamment les fonctionnalités ésotériques d'un série de marques et versions IDE. Bien pour vous!
Roboprog
2
Vous avez dit que vous vouliez éviter les maven. Pour tous ceux qui veulent faire cela en utilisant maven
reevesy

Réponses:

79

Vous pouvez créer un runner JUnit personnalisé et simple assez facilement. En voici une qui exécutera une seule méthode de test sous la forme com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Vous pouvez l'invoquer comme ceci:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

Après un rapide coup d'œil dans la source JUnit, je suis arrivé à la même conclusion que vous que JUnit ne prend pas en charge cela de manière native. Cela n'a jamais été un problème pour moi car les IDE ont tous des intégrations JUnit personnalisées qui vous permettent d'exécuter la méthode de test sous le curseur, entre autres actions. Je n'ai jamais exécuté de tests JUnit directement depuis la ligne de commande; J'ai toujours laissé l'IDE ou l'outil de construction (Ant, Maven) s'en occuper. Surtout que le point d'entrée CLI par défaut (JUnitCore) ne produit aucune sortie de résultat autre qu'un code de sortie différent de zéro en cas d'échec du test.

REMARQUE: pour la version JUnit> = 4.9, vous avez besoin de la bibliothèque hamcrest dans classpath

Mark Peters
la source
2
En fait, il me semble me souvenir d'avoir obtenu une trace complète de la pile dans le journal lorsqu'une assertion dans un test a échoué, ainsi que le message (facultatif, une fois défini) de chaque assertion décrivant l'attente non réalisée. Merci pour le contournement.
Roboprog
48

J'utilise Maven pour construire mon projet et j'utilise le plugin SureFire maven pour exécuter des tests junit. Si vous disposez de cette configuration, vous pouvez faire:

mvn -Dtest=GreatTestClass#testMethod test

Dans cet exemple, nous exécutons simplement une méthode de test nommée "testMethod" dans la classe "GreatTestClass".

Pour plus de détails, consultez http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

Yiling Lu
la source
-2

Nous avons utilisé IntelliJ et avons passé pas mal de temps à essayer de le comprendre également.

Fondamentalement, cela implique 2 étapes:

Étape 1: Compilez la classe de test

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

Étape 2: Exécutez le test

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest

Benjamin Tan Wei Hao
la source
6
Cela exécute tous les tests de la classe, pas seulement un test.
Voleur