wake-up-neo.net

Surefire nimmt keine Junit 4-Tests auf

Aus irgendeinem Grund kann ich das Plug-In Maven 2 Surefire nicht dazu bringen, die Testklasse JUnit 4 auszuführen.

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

Wenn ich jedoch diese Klasse in JUnit-3 umwandle, z 

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

dann wird es ausgeführt. Folgendes habe ich getan:

  • verifizierte Maven-Version: Apache Maven 2.2.1 (r801777; 2009-08-06 20: 16: 01 + 0100)
  • verifizierte Surefire-Version: folgte dies Beratung
  • verifizierte Surefire-Version: Surefire-Gläser in meinem ~/.m2/repository/org/Apache/maven/surefire geprüft - alle sind entweder Version 2.4.2 oder 2.4.3
  • ein mvn dependency:tree | grep junit durchgeführt, um sicherzustellen, dass ich nur von junit Version 4.7 abhängig bin

Das Modul, bei dem ich dieses Problem habe, hat keine JUnit 3-Tests.

Gibt es noch etwas, was ich vermisse?

36
mindas

mvn -X hat mir geholfen, Folgendes zu verraten:

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

Es scheint also, dass das Problem von testng jar kam, das JUnit v3.8.1 benötigt. Obwohl Test Classpath von JUnit 4 abhängig war, war es zu spät.

Die Abhängigkeit von testng befand sich in meinem POM:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

Unmittelbar nachdem ich es kommentiert hatte, wurden Tests ausgeführt.

Gewonnene Erkenntnisse:

  • mvn dependency:tree ist nicht immer genug, mvn -X ist ein Freund.
  • surefire ist nicht für den Entwickler-Himmel gemacht (ich habe dies bei einem Bericht von JIRA-Projekten erkannt). Dies gilt insbesondere, da es keine anderen Alternativen gibt, wenn Sie Maven verwenden.

Danke an alle für Ihre Hilfe. Leider gibt es keine Möglichkeit, die Antwortpunkte zwischen Pascal und Kaleb aufzuteilen, aber Kalebs Ratschläge, mvn -X zu verwenden, halfen mir, auf den richtigen Weg zu gelangen, so dass die richtigen Antwortpunkte auf ihn zutreffen.

31
mindas

Das Surefire-Plugin ermittelt anhand des Klassenpfads, welcher JUnit-Anbieter verwendet werden soll. Wenn der Klassenpfad mehrere JUnit-Versionen enthält, können Sie entweder den Klassenpfad so korrigieren, dass er nur eine JUnit-Version für den Klassenpfad enthält (wie oben beschrieben), oder Sie können explizit angeben, welchen Provider Sie verwenden möchten. Wenn Sie beispielsweise Folgendes in Ihrem (übergeordneten) POM angeben, wird der neueste Anbieter verwendet (z. B. "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>
[...]

Beachten Sie jedoch, dass Surefire 2.7 die Art und Weise geändert hat, in der festgelegt wird, welche Komponententestklassen ausgeführt werden.Das neue Verhalten bei der Verwendung von Surefire 2.7 (oder höher) mit JUnit 4 besteht darin, dass Tests ohne @Test-Annotation automatisch übersprungen werden.Dies kann von Vorteil sein, wenn Sie nur JUnit 4-Komponententests haben. Wenn Sie jedoch eine Kombination aus JUnit 3- und 4-Komponententests haben, funktioniert die Verwendung des Providers "surefire-junit47" nicht ordnungsgemäß. In solchen Fällen empfiehlt es sich, den Anbieter "surefire-junit4" explizit auszuwählen:

[...]
<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

Ich weiß nicht, was Sie mit "nicht ausführen" meinen, aber hilft es, explizit die von maven-surefire-plugin verwendeten Include-Werte festzulegen?

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

Bietet das Ausführen von maven mit dem Flag -X nützliche Informationen?

12
Kaleb Pederson

Eine weitere mögliche Ursache kann dieser Fehler sein (mit "wird nicht behoben"): https://issues.Apache.org/jira/browse/SUREFIRE-587

Kurze Zusammenfassung: Tests, die TestCase erweitern (aber keine Annotationen verwenden), werden nicht übernommen, wenn ihr Name nicht mit "Test" endet.

9
Gábor Lipták

Zum Vorteil von Googlers war das Problem, als ich dieses Problem hatte, darauf zurückzuführen, dass ich eine PowerMock-Abhängigkeit mit eingeschlossen hatte, die TestNG in Mitleidenschaft gezogen hatte, sodass SureFire keine [TestNG] -Tests feststellen konnte.

Ich habe die m2Eclipse-Registerkarte "Abhängigkeitshierarchie" des POM-Editors verwendet, um die Abhängigkeit zu ermitteln, und mit der rechten Maustaste darauf geklickt, um einen Ausschluss zu generieren (siehe XML unten).

Der Vollständigkeit halber (und für diejenigen, die nicht m2Eclipse verwenden) ist hier die XML, die die Abhängigkeit ausschließt - ich bin nur auf diese Funktion von Maven gestoßen, indem ich diese Tags automatisch generiert habe: 

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

(In meinem Fall war der Ausschluss von "powermock-module-testng" ausreichend, Sie können TestNG jedoch direkt ausschließen, wenn er von einem anderen Ort kommt.)

4
David Carboni

Für einige arme Leute da draußen, die sich fragen, warum Maven keine JUnit-Tests abholt. 

Ich habe sowohl JUnit als auch TestNG als Abhängigkeiten. Ich möchte jedoch, dass FailSafe meine Funktionstests mit TestNG und Surefire ausführt, um meine Unit-Tests mit JUnit auszuführen.

Ich fand jedoch, dass surefire versucht hatte, meine Unit-Tests mit TestNG auszuführen, und fand nichts, was ausgeführt werden konnte. Meine JUnit-Tests wurden übersprungen. 

Später stieß ich auf diese Maven-Ausgabe und konfigurierte surefire, um nur "JUnit" -Tests wie folgt auszuführen:

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

Hoffe das hilft jemandem.

4

Die Überprüfung, die Sie durchgeführt haben, ist gut, vor allem wenn Sie prüfen, ob Sie Version 2.3 oder höher des Surefire-Plugins verwenden (standardmäßig erhalten Sie Version 2.4.3 mit maven 2.1 super POM , damit dies in Ordnung ist). und prüfen, ob Sie die junit-3.8.1.jar-Abhängigkeit nicht transaktiv ziehen. 

Nun, um zu bestätigen, dass dies kein "globales Problem" ist (ich glaube nicht, TBH), könnten Sie ein Projekt von Grund auf erstellen, indem Sie beispielsweise Folgendes ausführen: 

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

Aktualisieren Sie dann die Junit-Abhängigkeit:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
  <scope>test</scope>
</dependency>

Und konfigurieren Sie die Compiler-Ebene für 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>

Setzen Sie schließlich Ihren SimpleTest.Java neben AppTest.Java und führen Sie mvn test aus.

Wenn mvn test für dieses Projekt gut funktioniert (und ich erwarte, dass es problemlos läuft), könnten Sie Ihre Frage bitte mit der von Ihnen verwendeten POM-Konfiguration aktualisieren (von dem Projekt, bei dem Probleme auftreten)?

1
Pascal Thivent

1.) Fügen Sie das folgende surefire-Plugin in pom.xml ein

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

2.) Das Surefire-Plugin wählt standardmäßig die Testklasse aus dem Paket: - src/test/Java/....

Gehen Sie zum Build-Pfad und fügen Sie den Testordner wie folgt in den Klassenpfad ein:

 enter image description here  enter image description here

3.) Gehen Sie zu -> Ausführen als -> 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

Eine kleine Änderung hat mir komisch geholfen !!!

Ich habe den Klassennamen von MyClass Test in Test MyClass geändert Diese Idee hatte ich, nachdem meine übergeordnete POM.xml-Zeile darunter stand

<test.include.pattern> **/Test*.Java <test.include.pattern/>
1

Haben Sie Ihr Maven-Compile-Plugin für die richtige Compiler-Ebene konfiguriert, z.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

Andernfalls hat Maven Probleme mit Anmerkungen

0
Andreas_D

Hatte ein ähnliches Problem beim Versuch, Integrationstests auszuführen. Ich hatte eine alte Version des surefire-Plugins, das TestNG und nicht jUnit ausführen wollte. Ich habe die Versionsnummer im Pom auf 2.20 geändert und es hat funktioniert. 

0
GeeMoo