web-dev-qa-db-fra.com

Exécuter un seul test à partir d'une classe JUnit à l'aide de la ligne de commande

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 les éléments suivants:

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

Ce que je veux vraiment faire est quelque chose comme ceci:

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 moyen de le faire en utilisant des annotations JUnit, mais je préférerais ne pas modifier manuellement le source de mes classes de test (en essayant de l'automatiser). J'ai aussi vu que Maven aurait peut-être un moyen de le faire, mais si possible, j'aimerais éviter de dépendre de Maven.

Je me demande donc s'il existe un moyen de le faire?


Points clés que je recherche:

  • Possibilité d'exécuter un seul test à partir d'une classe de test JUnit
  • Ligne de commande (utilisant JUnit)
  • Évitez de modifier la source de test
  • Évitez d'utiliser des outils supplémentaires
89
Kevin Jalbert

Vous pouvez créer un coureur JUnit personnalisé et assez simple. 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 de JUnit, je suis arrivé à la même conclusion que vous: JUnit ne supporte pas cela de manière native. Cela n'a jamais été un problème pour moi puisque 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 à partir de la ligne de commande; J'ai toujours laissé soit IDE ou l'outil de construction (Ant, Maven) s'en occuper. D'autant plus que le point d'entrée par défaut de la CLI (JUnitCore) ne produit aucun résultat autre qu'un non-résultat. -zéro code de sortie en cas d'échec du test.

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

76
Mark Peters

J'utilise Maven pour construire mon projet et j'utilise le plug-in SureFire maven pour exécuter des tests Junit. Si vous avez cette configuration, alors vous pouvez faire:

mvn -Dtest=GreatTestClass#testMethod test

Dans cet exemple, nous venons d'exécuter 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

41
Yiling