web-dev-qa-db-fra.com

Maven ne trouve pas les tests JUnit à exécuter

J'ai un programme Maven, ça compile bien. Lorsque je lance mvn test, il n’exécute aucun test (sous l’entête TEST, on dit There are no tests to run.). 

J'ai recréé ce problème avec une configuration très simple que je vais inclure ci-dessous ainsi que la sortie sous -X.

Les tests unitaires fonctionnent bien à partir d’Eclipse (avec son paquetage Junit par défaut et quand j’inclue plutôt le fichier junit.jar téléchargé par maven). De plus, mvn test-compile crée correctement la classe sous test-classes. J'exécute ceci sur OSX 10.6.7 avec Maven 3.0.2 et Java 1.6.0_24.

Voici la structure du répertoire:

/my_program/pom.xml
/my_program/src/main/Java/ClassUnderTest.Java
/my_program/src/test/Java/ClassUnderTestTests.Java

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my_group</groupId>
    <artifactId>my_program</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>My Program</name>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ClassUnderTest.Java:

public class ClassUnderTest {

    public int functionUnderTest(int n) {
        return n;
    }

}

ClassUnderTestTests.Java:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class ClassUnderTestTests {

    private ClassUnderTest o;

    @Before
    public void setUp() {
        o = new ClassUnderTest();
    }

    @Test
    public void testFunctionUnderTest_testCase1() {
        Assert.assertEquals(1, o.functionUnderTest(1));
    }

    @Test
    public void testFunctionUnderTest_testCase2() {
        Assert.assertEquals(2, o.functionUnderTest(2));
    }
}

Fin du test mvn -X:

[DEBUG] Configuring mojo org.Apache.maven.plugins:maven-surefire-plugin:2.7.1:test from plugin realm ClassRealm[plugin>org.Apache.maven.plugins:maven-surefire-plugin:2.7.1, parent: Sun.misc.Launcher$AppClassLoader@5224ee]
[DEBUG] Configuring mojo 'org.Apache.maven.plugins:maven-surefire-plugin:2.7.1:test' with basic configurator -->
[DEBUG]   (s) basedir = /Users/aaron/Programs/my_program
[DEBUG]   (s) childDelegation = false
[DEBUG]   (s) classesDirectory = /Users/aaron/Programs/my_program/target/classes
[DEBUG]   (s) disableXmlReport = false
[DEBUG]   (s) enableAssertions = true
[DEBUG]   (s) forkMode = once
[DEBUG]   (s) junitArtifactName = junit:junit
[DEBUG]   (s) localRepository =        id: local
      url: file:///Users/aaron/.m2/repository/
   layout: none

[DEBUG]   (f) parallelMavenExecution = false
[DEBUG]   (s) pluginArtifactMap = {org.Apache.maven.plugins:maven-surefire-plugin=org.Apache.maven.plugins:maven-surefire-plugin:maven-plugin:2.7.1:, org.Apache.maven.surefire:surefire-booter=org.Apache.maven.surefire:surefire-booter:jar:2.7.1:compile, org.Apache.maven.surefire:surefire-api=org.Apache.maven.surefire:surefire-api:jar:2.7.1:compile, org.Apache.maven.surefire:maven-surefire-common=org.Apache.maven.surefire:maven-surefire-common:jar:2.7.1:compile, org.Apache.maven.shared:maven-common-artifact-filters=org.Apache.maven.shared:maven-common-artifact-filters:jar:1.3:compile, org.codehaus.plexus:plexus-utils=org.codehaus.plexus:plexus-utils:jar:2.0.5:compile, junit:junit=junit:junit:jar:3.8.1:compile, org.Apache.maven.reporting:maven-reporting-api=org.Apache.maven.reporting:maven-reporting-api:jar:2.0.9:compile}
[DEBUG]   (s) printSummary = true
[DEBUG]   (s) project = MavenProject: my_group:my_program:1.0-SNAPSHOT @ /Users/aaron/Programs/my_program/pom.xml
[DEBUG]   (s) projectArtifactMap = {junit:junit=junit:junit:jar:4.8.1:test}
[DEBUG]   (s) redirectTestOutputToFile = false
[DEBUG]   (s) remoteRepositories = [       id: central
      url: http://repo1.maven.org/maven2
   layout: default
snapshots: [enabled => false, update => daily]
 releases: [enabled => true, update => never]
]
[DEBUG]   (s) reportFormat = brief
[DEBUG]   (s) reportsDirectory = /Users/aaron/Programs/my_program/target/surefire-reports
[DEBUG]   (s) session = org.Apache.maven.execution.MavenSession@dfbb43
[DEBUG]   (s) skip = false
[DEBUG]   (s) skipTests = false
[DEBUG]   (s) testClassesDirectory = /Users/aaron/Programs/my_program/target/test-classes
[DEBUG]   (s) testFailureIgnore = false
[DEBUG]   (s) testNGArtifactName = org.testng:testng
[DEBUG]   (s) testSourceDirectory = /Users/aaron/Programs/my_program/src/test/Java
[DEBUG]   (s) trimStackTrace = true
[DEBUG]   (s) useFile = true
[DEBUG]   (s) useManifestOnlyJar = true
[DEBUG]   (s) workingDirectory = /Users/aaron/Programs/my_program
[DEBUG] -- end configuration --
[INFO] Surefire report directory: /Users/aaron/Programs/my_program/target/surefire-reports
[DEBUG] Setting system property [user.dir]=[/Users/aaron/Programs/my_program]
[DEBUG] Setting system property [localRepository]=[/Users/aaron/.m2/repository]
[DEBUG] Setting system property [basedir]=[/Users/aaron/Programs/my_program]
[DEBUG] Using JVM: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/Java
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.Apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile)
[DEBUG]     org.Apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile)
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/Apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/Apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.Apache.maven.surefire:surefire-junit4:jar:2.7.1:test (selected for test)
[DEBUG]     org.Apache.maven.surefire:surefire-api:jar:2.7.1:test (selected for test)
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/Apache/maven/surefire/surefire-junit4/2.7.1/surefire-junit4-2.7.1.jar Scope: test
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/Apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: test
[DEBUG] Test Classpath :
[DEBUG]   /Users/aaron/Programs/my_program/target/test-classes
[DEBUG]   /Users/aaron/Programs/my_program/target/classes
[DEBUG]   /Users/aaron/.m2/repository/junit/junit/4.8.1/junit-4.8.1.jar
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.Apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile)
[DEBUG]     org.Apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile)
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/Apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/Apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile
Forking command line: /bin/sh -c cd /Users/aaron/Programs/my_program && /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/Java -jar /Users/aaron/Programs/my_program/target/surefire/surefirebooter6118081963679415631.jar /Users/aaron/Programs/my_program/target/surefire/surefire4887918564882595612tmp /Users/aaron/Programs/my_program/target/surefire/surefire9012255138269731406tmp

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.089s
[INFO] Finished at: Mon May 30 12:03:09 EDT 2011
[INFO] Final Memory: 7M/62M
[INFO] ------------------------------------------------------------------------
337
Zugwalt

Par défaut, Maven utilise les conventions de dénomination suivantes pour rechercher des tests à exécuter:

  • Test*
  • *Test
  • *TestCase

Votre classe de test ne suit pas ces conventions. Vous devez le renommer ou configurer le plugin Maven Surefire pour utiliser un autre modèle pour les classes de test.

572
axtavt

J'ai également constaté que le code de test unitaire devrait être placé dans le dossier de test, il ne peut pas être reconnu comme classe de test si vous le placez dans le dossier principal .

Faux

/my_program/src/main/Java/NotTest.Java

Droite

/my_program/src/test/Java/MyTest.Java
72
Robin Ma

Une autre chose qui peut amener Maven à ne pas trouver les tests si l'emballage du module n'est pas déclaré correctement.

Dans un cas récent, quelqu'un avait <packaging>pom</packaging> et mes tests n'ont jamais été exécutés. Je l'ai changé pour <packaging>jar</packaging> et maintenant cela fonctionne bien.

50
Jon

METTRE À JOUR:

Comme @scottyseus l'a dit dans les commentaires, à partir de Maven Surefire 2.22.0, ce qui suit suffit:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
</plugin>

Lors de l'utilisation de JUnit 5, j'ai rencontré le même problème. Maven Surefire a besoin d’un plugin pour exécuter les tests JUnit 5. Ajoutez ceci à notre pom.xml:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.2.0-M1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.2.0-M1</version>
        </dependency>
    </dependencies>
</plugin>

Source: https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

28
teyzer

Vérifiez également si votre répertoire de classes de test (par exemple, src/test/Java) correspond au répertoire répertorié dans la propriété <testSourceDirectory> dans votre pom.xml sous la propriété <build>. Cela m'a pris du temps pour le trouver.

26
t3rmin41

Vérifiez que (pour jUnit - 4.12 et Eclipse surefire plugin)

  1. Ajoutez la version requise de jUnit dans POM.xml dans les dépendances. Do Maven -> Mettez à jour le projet pour voir les fichiers JAR requis exportés dans le projet.
  2. La classe de test se trouve dans le dossier src/test/Java et les sous-répertoires de ce dossier (ou le dossier de base peut être spécifié dans POM dans config testSourceDirectory). Le nom de la classe doit avoir le mot "Test".
  3. La méthode de test dans la classe de test doit avoir l'annotation @Test
9
Mitra

Maven n'exécutera pas vos tests si le projet a <packaging>pom</packaging>

Vous devez définir l'emballage sur jar (ou sur un autre type d'artefact Java) pour l'exécution des tests: <packaging>jar</packaging>

9
robjwilkins

Découvert si vous préfixez un test avec 'Résumé', il sera également ignoré par défaut.

8
user1016765

Si vous avez une application Java/Groovy partagée et que vous n'avez que des tests unitaires Groovy, Maven ne trouvera aucun test. Cela peut être corrigé en ajoutant un test unitaire sous src/test/Java.

4
bruce szalwinski

J'avais aussi un problème similaire, après avoir exploré, que la dépendance au test provoquait ce problème. Après avoir enlevé la dépendance testng de pom (comme je n'en ai plus besoin), cela a commencé à bien fonctionner pour moi.

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8</version>
        <scope>test</scope>
    </dependency>
3
rajesh madhavan

Beaucoup de ces réponses m'ont été très utiles dans le passé, mais j'aimerais ajouter un scénario supplémentaire qui m'a coûté du temps, car cela pourrait aider d'autres à l'avenir:

Assurez-vous que les classes et méthodes de test sont publiques.  

Mon problème était que j'utilisais une fonction de génération automatique de classes/méthodes de test de mon IDE (IntelliJ) et que, pour une raison quelconque, il les créait en tant que paquet privé. Je trouve cela plus facile à manquer que l'on pourrait s'y attendre.

2
João Matos
/my_program/src/test/Java/ClassUnderTestTests.Java

devrait être 

/my_program/src/test/Java/ClassUnderTestTest.Java

Le Maven trouve ces fins Test ou commence par Test pour s'exécuter automatiquement.

Cependant, vous pouvez utiliser 

mvn surefire:test -Dtest=ClassUnderTestTests.Java 

pour exécuter vos tests.

2
Boris Z.

Une autre raison pour ne pas exécuter les cas de test m’est arrivée: j’avais une propriété nommée "test" à des fins complètement différentes, mais elle interférait avec le plugin surefire. Ainsi, s'il vous plaît vérifier vos POMs pour:

<properties>
  <test>.... </test>
  ...
</properties>

et l'enlever.

1
Rusi Popov

Un autre conseil (en plus des réponses précédentes):

Dans Eclipse, accédez à Propriétés de votre projet> cliquez sur Run/Debug Settings

"Cette page vous permet de gérer les configurations de lancement avec la ressource actuellement sélectionnée."

Vous pouvez y ajouter (Nouveau ...) ou supprimer (Supprimer) les tests JU (JUnit) de votre projet (sous le dossier src/test/Java ou le cours).

1
datv

J'ai fait face au même problème, il a résolu par le changement ci-dessous dans pom.xml

<build>
    <testSourceDirectory>test</testSourceDirectory>

...

changé en: 

<build>
    <testSourceDirectory>${project.basedir}/src/test/Java</testSourceDirectory>
1
ShayneR

Si votre nom de classe de test ne respecte pas la convention d'appellation standard (comme souligné par @axtavt ci-dessus), vous devez ajouter le nom de modèle/classe dans le pom.xml pour que Maven puisse choisir le test

...
<build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/*_UT.Java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build> 
...
1
Saikat

Si vous avez écrit vos tests dans JUnit 4 et ajouté des dépendances JUnit 5 au plugin surefire, vos tests ne seront pas exécutés.

Dans ce cas, commentez simplement les dépendances JUnit 5 de surefire plugin:

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <!--<dependencies>-->
                <!--<dependency>-->
                    <!--<groupId>org.junit.platform</groupId>-->
                    <!--<artifactId>junit-platform-surefire-provider</artifactId>-->
                    <!--<version>1.0.0</version>-->
                <!--</dependency>-->
                <!--<dependency>-->
                    <!--<groupId>org.junit.jupiter</groupId>-->
                    <!--<artifactId>junit-jupiter-engine</artifactId>-->
                    <!--<version>${junit.version}</version>-->
                <!--</dependency>-->
            <!--</dependencies>-->
        </plugin>
1
youhans

Dans mon cas, nous sommes en train de migrer une application multimodule vers Spring Boot. Malheureusement, Maven n’a plus exécuté tous les tests dans les modules. La dénomination des classes de test n'a pas changé, nous suivons les conventions de dénomination.

À la fin, cela a aidé lorsque j'ai ajouté la dépendance surefire-junit47 au plugin maven-surefire-plugin. Mais je ne pouvais pas expliquer pourquoi, c’était des essais et des erreurs:

<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<dependencies>
  <dependency>
    <groupId>org.Apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>${maven-surefire-plugin.version}</version>
  </dependency>
</dependencies>
0
Michael Hegner

Un tel problème peut survenir lorsque vous utilisez le plugin surfire 3.x.x + avec JUnit5 et annotez par erreur la classe de test avec l'annotation @Test de JUnit4.

Utilisez: org.junit.jupiter.api.Test (JUnit5) au lieu de org.junit.Test (Junit4)

NOTE: cela pourrait être difficile à remarquer car le IDE pourrait l'exécuter sans problèmes comme le test JUnit4.

0
walkeros

La suite a bien fonctionné pour moi dans Junit 5

https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.0</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.0</version>
        </plugin>
    </plugins>
</build>
<!-- ... -->
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.4.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.4.0</version>
        <scope>test</scope>
    </dependency>
    <!-- ... -->
</dependencies>
<!-- ... -->
0
A. S. Ranjan

Au cas où quelqu'un aurait cherché et je ne l'aurais pas résolu, j'avais une bibliothèque pour différents tests:

<dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${org.junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>

Quand j'ai installé Junit, tout a fonctionné, j'espère et j'aide ceci:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
0
Hizmarck

Un autre problème facilement négligé - Assurez-vous que le fichier de votre classe a l'extension .Java

0
Mark W

j'ai utilisé en utilisant ce code

<sourceDirectory>src_controller</sourceDirectory>
  <testSourceDirectory>src_test</testSourceDirectory>

sur mon fichier pom.xml, assurez-vous simplement que le fichier testng est spécifique

<suiteXmlFile>/Users/mac/xxx/xxx/xx.xxxx.xx/xxx.restassured.xx/testng.xml</suiteXmlFile>
0
Prasetyo Budi

junitArtifactName pourrait également être le cas si la JUnit utilisée n'est pas la norme (junit:junit) mais par exemple ...

<dependency>
    <groupId>org.Eclipse.orbit</groupId>
    <artifactId>org.junit</artifactId>
    <version>4.11.0</version>
    <type>bundle</type>
    <scope>test</scope>
</dependency>
0
Tuomas Kiviaho

Voici le code exact que j'ai dû ajouter à mon fichier pom.xml:

    <build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.2.0-M1</version>
                </dependency>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.2.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

Et voici mes dépendances:

    <dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easytesting</groupId>
        <artifactId>fest-assert-core</artifactId>
        <version>2.0M10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-surefire-provider</artifactId>
        <version>1.2.0-M1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0-M1</version>
    </dependency>
</dependencies>
0
anon58192932

Dans mon cas, il ajoutait le moteur junit-vintage-engine qui le rend compatible avec les versions plus anciennes des tests JUnit et peut les exécuter. Comme j'utilise JUnit 5.

<dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
</dependency>
0
Duc Tran