web-dev-qa-db-fra.com

Comment exécuter les tests JUnit à partir de mon application Java?

Est-il possible d'exécuter des tests JUnit à partir de mon application Java?

Existe-t-il des frameworks de test que je peux utiliser (comme JUnit.jar?) Ou dois-je forcer pour trouver les fichiers de test, invoquer les méthodes et suivre les exceptions moi-même?

La raison pour laquelle je pose la question est que mon application nécessite beaucoup de travail pour démarrer (de nombreuses dépendances et configurations, etc.) et que l'utilisation d'un outil de test externe (comme la tâche JUnit Ant) nécessiterait beaucoup de travail de configuration.

Il est plus facile de démarrer l’application puis, dans l’application, de lancer mes tests.

Y at-il un cadre de test facile qui exécute les tests et les résultats de sortie à l'intérieur d'une application Java ou suis-je obligé d'écrire mon propre cadre?

48
corgrath

Oui, vous pouvez. Je le faisais quelques fois pour exécuter des tests de diagnostic/de fumée dans les systèmes de production. Ceci est un extrait de la partie clé du code appelant JUnit:

JUnitCore junit = new JUnitCore();
Result result = junit.run(testClasses);

NE PAS utiliser JUnit.maindans votre application, il appelle System.exit une fois les tests terminés et peut donc arrêter le processus JVM.

Vous voudrez peut-être capturer la sortie "normale" de la console de JUnit (les points et le rapport simple). Cela peut être facilement fait en enregistrant TextListener (cette classe fournit ce simple rapport).

S'il vous plaît également être conscient de plusieurs complications à l'aide de ce type de méthode:

  1. Tester n'importe quel "cadre de test", y compris un si petit, peut être déroutant. Par exemple, si vous souhaitez tester si votre "framework de test" renvoie un résultat d'échec lorsque l'un des tests échoue, vous pouvez (devriez?) Créer un exemple de test JUnit qui échoue toujours et exécuter ce test avec le "framework de test". Dans ce cas, le scénario de test qui échoue est en réalité une donnée de test et ne doit pas être exécuté comme un JUnit "normal". Pour un exemple de tels tests, vous pouvez vous référer aux tests élémentaires internes de JUnit.

  2. Si vous souhaitez préparer/afficher votre rapport personnalisé, vous devez plutôt enregistrer votre propre RunListener, car Result renvoyé par JUnit ne contient pas (directement) d'informations sur les tests réussis et la méthode de test utilisée (il est uniquement "codé en dur" dans le test Description ).

81
kopper

Comme indiqué dans JUnit FAQ :

public static void main(String args[]) {
  org.junit.runner.JUnitCore.main("junitfaq.SimpleTest");
}
13

La raison pour laquelle je demande est mon l'application nécessite beaucoup de travail pour lancez le lancement (beaucoup de dépendances et de configurations , etc.) et utilisez un outil de test externe (comme JUnit Ant task) nécessiterait beaucoup de travail pour installer.

Vous devez supprimer ces dépendances du code que vous testez. Les dépendances et les configurations sont précisément ce que vous essayez d'éviter lors de l'écriture d'un framework de test. Pour chaque test, vous devriez cibler la plus petite partie testable d'une application.

Par exemple, si vous avez besoin d’une connexion à une base de données pour exécuter un processus dans une classe que vous essayez de tester, découplez l’objet de gestion de la base de données de votre classe, transmettez-le via un constructeur ou une méthode de définition et utilisez dans votre test un outil tel que JMock (ou écrire une classe stub) pour construire un faux objet de traitement de base de données. De cette façon, vous vous assurez que les tests ne dépendent pas d'une configuration de base de données particulière et que vous testez uniquement la petite partie du code qui vous intéresse, mais pas uniquement la couche de traitement de la base de données.

Cela peut sembler beaucoup de travail au début, mais ce type de refactoring est exactement ce que votre cadre de test devrait être complet. Vous trouverez peut-être utile de vous procurer un livre sur les tests de logiciel comme référence pour dissocier vos dépendances. Cela rapportera beaucoup plus que d'essayer de démarrer JUnit à partir de votre application en cours d'exécution.

10
seanhodges

Dans JUnit 5, vous pouvez utiliser API Launcher pour cet objectif. 

    final LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
            .selectors(
                    selectPackage("path_to_folder_with_tests")
            )
            .build();

    final Launcher launcher = LauncherFactory.create();

    final boolean pathContainsTests = launcher.discover(request).containsTests()
    if (!pathContainsTests) {
        System.out.println("This path is invalid or folder doesn't consist tests");
    }

    final SummaryGeneratingListener listener = new SummaryGeneratingListener();

    launcher.execute(request, listener);

    final TestExecutionSummary summary = listener.getSummary();

    final long containersFoundCount = summary.getContainersFoundCount();
    System.out.println("containers Found Count  " + containersFoundCount);

    final long containersSkippedCount = summary.getContainersSkippedCount();
    System.out.println("containers Skipped Count  " + containersSkippedCount);

    final long testsFoundCount = summary.getTestsFoundCount();
    System.out.println("tests Found Count  " + testsFoundCount);

    final long testsSkippedCount = summary.getTestsSkippedCount();
    System.out.println("tests Skipped Count  " + testsSkippedCount);
3
makson

Selon l'API JUnit, JUnitCore dispose de plusieurs méthodes pour exécuter des tests dans Java.

Merci à Tomislav Nakic-Alfirevic de l'avoir signalé.

http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html

2
corgrath
1