web-dev-qa-db-fra.com

Surefire ne ramasse pas les tests Junit 4

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:

  • version Maven vérifiée: Apache Maven 2.2.1 (r801777; 2009-08-06 20: 16: 01 + 0100)
  • version Surefire vérifiée: suivie ceci conseil
  • version Surefire vérifiée: les bocaux Surefire vérifiés dans mon ~/.m2/repository/org/Apache/maven/surefire - ils sont tous dans la version 2.4.2 ou 2.4.3
  • fait un mvn dependency:tree | grep junit pour m'assurer que je ne dépend que de la version 4.7 de Junit

Le module dans lequel je rencontre ce problème ne comporte pas de tests JUnit 3.

Y a-t-il autre chose qui me manque?

36
mindas

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.
  • surefire n'est pas fait pour le paradis des développeurs (je l'ai compris en consultant les rapports du projet JIRA). Cela est d'autant plus vrai qu'il n'y a pas d'autre alternative si vous utilisez Maven.

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.

31
mindas

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>
[...]
22
Randall Hauch

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?

12
Kaleb Pederson

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".

9
Gábor Lipták

À 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.)

4
David Carboni

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.

4
James Selvakumar

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
Pascal Thivent

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:

 enter image description here  enter image description here

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
1
ashu17188

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/>
1
MadhuGujjalapudi

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

0
Andreas_D

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é. 

0
GeeMoo