484 votes

Maven ne trouve pas de tests JUnit à exécuter

J'ai un programme maven, il se compile bien. Lorsque j'exécute mvn test il n'exécute aucun test (sous l'en-tête TESTs, il est indiqué que 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 lorsqu'elle est exécutée avec -X .

Les tests unitaires s'exécutent bien à partir d'eclipse (à la fois avec son paquetage junit par défaut et lorsque j'inclus à la place le junit.jar téléchargé par maven). De même, 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] ------------------------------------------------------------------------

2 votes

Pour les personnes qui utilisent Spring-Boot, veuillez vérifier stackoverflow.com/a/60831916/990279

0 votes

Pour moi, IntelliJ a essayé de m'aider en faisant des choses à ma place et a cassé les tests. Si j'ai la bonne dépendance pour Junit Jupiter et la bonne version du plugin SureFire, et que j'utilise la commande ALT+ENTER sur un nom de classe pour créer un test, maven ne reconnaît pas la classe de test et ne l'exécute pas. Cependant, lorsque je crée manuellement le fichier de test en respectant les conventions de nommage de Maven, il est reconnu par Maven et exécuté. Je n'ai pas encore trouvé comment inverser le processus dans lequel IntelliJ interrompt les tests.

743voto

axtavt Points 126632

Par défaut, Maven utilise les conventions d'appellation suivantes lors de la recherche de tests à exécuter :

Si votre classe de test ne respecte pas ces conventions, vous devriez la renommer ou configurer le plugin Maven Surefire d'utiliser un autre modèle pour les classes de test.

6 votes

Je trouve plus intéressant de modifier la configuration de maven. Cette convention de nommage présente un certain danger pour les utilisateurs inexpérimentés. Nommer vos testcases comme SomethingTest1, SomethingTest2 aurait pour conséquence que les tests ne seraient pas exécutés. Maven ne peut pas le faire pour des raisons de compatibilité ascendante, mais il est plus logique de rechercher les testcases dans tous les fichiers.

9 votes

Je ne le savais pas - j'avais deux cas qui se terminaient par "Tests", et maven refusait de les exécuter... j'ai changé pour "Test", et tout va bien dans la guilde des sucettes à nouveau. Merci.

1 votes

@Tobias, nommer les tests comme SomethingTest1, SomethingTest2 ne devrait pas seulement avoir pour conséquence que les tests ne soient pas exécutés, mais que la personne qui les a nommés ainsi soit également tuée ;)

107voto

Robin Ma Points 51

J'ai également constaté que le code de test unitaire devrait être placé sous le nom de src/test/java il ne pourra pas être reconnu comme classe de test si vous le placez sous le dossier principal. Par exemple.

Mauvais

/my_program/src/main/java/NotTest.java

Droit

/my_program/src/test/java/MyTest.java

3 votes

Merci ! Ceci et la mise en place de la portée de test ( <scope>test<scope> ) dans le pom.xml Le dossier l'a fait pour moi.

2 votes

J'ai rencontré ce problème, faites attention aux tests et aux essais. Le bon est test

0 votes

Merci, c'était mon problème et je l'ai résolu grâce à votre commentaire.

92voto

teyzer Points 1050

UPDATE :

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

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

En utilisant 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-le à 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

MISE À JOUR 2021

Le fournisseur junit-platform-surefire, qui a été développé à l'origine par l'équipe de JUnit, a été déprécié dans JUnit Platform 1.3 et abandonné dans 1.4. Veuillez utiliser le support natif de Maven Surefire à la place.

88voto

Jon Points 449

Une autre chose qui peut faire que Maven ne trouve pas les tests est que le packaging 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 fonctionné. Je l'ai changé en <packaging>jar</packaging> et maintenant ça marche bien.

39voto

Exterminator13 Points 894

Si vous avez créé un Spring Boot application utilisant Initialisation du printemps Les tests s'exécutent bien depuis Intellij Idea. Mais, si vous essayez d'exécuter des tests à partir d'une ligne de commande :

mvn clean test

Vous auriez pu être surpris qu'aucun test n'ait été effectué. J'ai essayé d'ajouter surefire plugin sans succès. La réponse était simple : pom.xml contenait la dépendance suivante :

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
           <exclusion>
              <groupId>org.junit.vintage</groupId>
              <artifactId>junit-vintage-engine</artifactId>
           </exclusion>
        </exclusions>
     </dependency>

L'exclusion, junit-vintage-engine est destiné à assurer la rétrocompatibilité avec le JUnit 4.x . Ainsi, les nouvelles versions de Spring Boot Initializr ne le prennent pas en charge par défaut. Après avoir supprimé l'exclusion, Maven a commencé à voir les tests du projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X