Pour une raison quelconque, je ne peux pas obtenir le plugin Maven 2 Surefire pour exécuter la classe de test JUnit 4.
public class SimpleTest {
@org.junit.Test
public void simple() {
System.out.println("foo");
}
}
Cependant, si je change cette classe pour qu'elle soit comme JUnit-3, telle que
public class SimpleTest extends junit.framework.TestCase {
public void testBar() {
System.out.println("bar");
}
@org.junit.Test
public void simple() {
System.out.println("foo");
}
}
alors il est exécuté. Voici ce que j'ai fait:
~/.m2/repository/org/Apache/maven/surefire
- ils sont tous dans la version 2.4.2 ou 2.4.3mvn dependency:tree | grep junit
pour m'assurer que je ne dépend que de la version 4.7 de JunitLe module dans lequel je rencontre ce problème ne comporte pas de tests JUnit 3.
Y a-t-il autre chose qui me manque?
mvn -X
m'a aidé à révéler ce qui suit:
...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] org.Apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG] org.Apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/Apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/Apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG] junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.Apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG] org.Apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG] org.Apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG] org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG] org.Apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG] org.Apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG] org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG] junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG] org.Apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG] /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar
Il semble donc que le problème venait de testng
jar nécessitant JUnit v3.8.1. Même si Test Classpath
dépendait de JUnit 4, il était trop tard.
La dépendance testng
était située dans mon POM:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.8</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
Immédiatement après avoir commenté, des tests ont commencé à s'exécuter.
Leçons apprises:
mvn dependency:tree
n'est pas toujours suffisant, mvn -X
est un ami.Merci à tous pour votre aide. Malheureusement, il n’ya aucun moyen de diviser les points de réponse entre Pascal et Kaleb, mais le conseil de Kaleb d’utiliser mvn -X
m’a aidé à aller sur la bonne voie, alors les points de réponse corrects lui reviennent.
Le plug-in Surefire détermine quel fournisseur JUnit doit être utilisé en fonction du classpath. S'il existe plusieurs versions de JUnit sur le chemin d'accès aux classes, vous pouvez corriger le chemin d'accès aux classes afin de n'avoir qu'une seule version de JUnit sur le chemin d'accès aux classes (comme indiqué ci-dessus) ou spécifier explicitement le fournisseur à utiliser. Par exemple, en spécifiant les éléments suivants dans votre force POM (parent) à l'aide du fournisseur le plus récent (par exemple, "surefire-junit47"):
[...]
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<dependencies>
<!-- Force using the latest JUnit 47 provider -->
<dependency>
<groupId>org.Apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.8</version>
</dependency>
</dependencies>
[...]
Notez cependant que Surefire 2.7 a changé la façon dont il détermine les classes de tests unitaires à exécuter.Le nouveau comportement lors de l'utilisation de Surefire 2.7 (ou version ultérieure) avec JUnit 4 est que tout test sans annotation @Test sera automatiquement ignoré.Cela peut être très bien si vous avez juste des tests unitaires JUnit 4, mais si vous combinez des tests unitaires JUnit 3 et 4, l'utilisation du fournisseur "surefire-junit47" ne fonctionnera pas correctement. Dans ce cas, il est préférable de choisir explicitement le fournisseur "surefire-junit4":
[...]
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<dependencies>
<dependency>
<groupId>org.Apache.maven.surefire</groupId>
<!-- Use the older JUnit 4 provider -->
<artifactId>surefire-junit4</artifactId>
<version>2.8</version>
</dependency>
</dependencies>
[...]
Je ne sais pas ce que vous entendez par "ne peut pas exécuter", mais est-il utile de définir explicitement les inclusions utilisées par le maven-surefire-plugin
?
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<includes>
<include>**/*Test.Java</include>
</includes>
</configuration>
</plugin>
En outre, l'exécution de maven avec l'indicateur -X
fournit-elle des informations utiles?
Une autre cause possible peut être ce bogue (fermé par «ne résoudra pas»): https://issues.Apache.org/jira/browse/SUREFIRE-587
Résumé succinct: Les tests prolongeant TestCase (mais n'utilisant pas d'annotations) ne seront pas repris si leur nom ne se termine pas par "Test".
À l’avantage de Googlers, lorsque j’ai eu ce problème, c’est parce que j’avais inclus une dépendance PowerMock qui entraînait TestNG, ce qui empêchait SureFire de détecter les tests [TestNG].
J'ai utilisé l'onglet m2Eclipse "Hiérarchie des dépendances" de l'éditeur POM pour rechercher la dépendance et j'ai cliqué avec le bouton droit de la souris pour générer une exclusion (voir XML ci-dessous).
Pour être complet (et pour ceux qui n'utilisent pas m2Eclipse), voici le code XML qui exclut la dépendance - je ne suis tombé sur cette fonctionnalité de Maven en voyant ces balises automatiquement générées:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-mockito-release-full</artifactId>
<version>1.4.9</version>
<classifier>full</classifier>
<exclusions>
<exclusion>
<artifactId>powermock-module-testng</artifactId>
<groupId>org.powermock</groupId>
</exclusion>
</exclusions>
</dependency>
(Dans mon cas, l'exclusion de "powermock-module-testng" était suffisante, mais vous pouvez exclure TestNG directement s'il provient d'un autre endroit.)
Pour une pauvre âme qui se demande pourquoi Maven ne répond pas aux tests JUnit.
J'ai à la fois JUnit et TestNG en tant que dépendances. Mais je veux un système sécurisé pour exécuter mes tests fonctionnels à l’aide de TestNG et surefire pour exécuter mes tests unitaires à l’aide de JUnit.
Cependant, j’ai trouvé que Surefire tentait d’exécuter mes tests unitaires à l’aide de TestNG et que rien ne s’exécutait. Mes tests JUnit ont été ignorés.
Plus tard, je suis tombé sur ce problème Maven et ai configuré Surefire pour n'exécuter que des tests "JUnit" comme ceci:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<properties>
<property>
<name>junit</name>
<value>true</value>
</property>
</properties>
</configuration>
</plugin>
J'espère que ça aide quelqu'un.
La vérification que vous avez faite est bonne, en particulier si vous utilisez la version 2.3+ du plugin surefire (par défaut, vous obtiendrez la version 2.4.3 avec maven 2.1 super POM , donc ça devrait aller). et en vérifiant que vous ne tirez pas la dépendance junit-3.8.1.jar
de manière transitoire.
Maintenant, juste pour valider qu'il ne s'agit pas d'un "problème global" (je ne pense pas que TBH), pourriez-vous créer un projet à partir de rien, par exemple en exécutant:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase
Puis mettez à jour la dépendance Junit:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
Et configurez le niveau de compilateur pour 1.5+
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
Enfin, placez votre SimpleTest.Java
à côté de AppTest.Java
et exécutez mvn test
.
Si exécuter mvn test
fonctionne correctement pour ce projet (et j'espère qu'il s'exécutera sans problème), pourriez-vous mettre à jour votre question avec la configuration POM que vous utilisez (depuis que le projet a des problèmes)?
1.) Inclure le plugin surefire suivant dans pom.xml
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
</configuration>
</plugin>
2.) Par défaut, le plugin surefire prend la classe Test du package: - src/test/Java/....
Allez donc à Build Path et incluez le dossier de test dans classpath comme ci-dessous:
3.) Aller à -> Run As -> Maven Test
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081
s - in com.bnym.dcm.api.controller.AccountControllerTest
[INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s -
in com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD SUCCESS
Un petit changement m'a aidé drôlement !!!
J'ai changé le nom de la classe de MyClass Test à Test MyClass, J'ai eu cette idée après avoir constaté que mon parent POM.xml contient la ligne ci-dessous.
<test.include.pattern> **/Test*.Java <test.include.pattern/>
Avez-vous configuré votre plug-in maven-compile-plugin pour le niveau de compilateur correct, tel que:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
Sinon, Maven aura des problèmes avec les annotations
Avait un problème similaire en essayant d'exécuter des tests d'intégration. J'avais une ancienne version du plugin surefire qui essayait de lancer TestNG et non jUnit. J'ai changé le numéro de version dans le pom à 2.20 et cela a fonctionné.