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] ------------------------------------------------------------------------
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.
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
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.
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
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.
Vérifiez que (pour jUnit - 4.12 et Eclipse surefire plugin)
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>
Découvert si vous préfixez un test avec 'Résumé', il sera également ignoré par défaut.
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.
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>
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.
/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.
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.
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).
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>
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>
...
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>
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>
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.
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>
<!-- ... -->
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>
Un autre problème facilement négligé - Assurez-vous que le fichier de votre classe a l'extension .Java
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>
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>
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>
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>