it-swarm.com.de

Maven findet keine JUnit-Tests zum Ausführen

Ich habe ein Maven-Programm, es kompiliert gut. Wenn ich mvn test starte, werden keine Tests ausgeführt (unter TESTs header steht There are no tests to run.). 

Ich habe dieses Problem mit einem supereinfachen Setup neu erstellt, das ich im Folgenden sowie die Ausgabe mit -X einfüge.

Die Unit-Tests laufen einwandfrei von Eclipse (sowohl mit dem standardmäßigen Junit-Paket als auch wenn ich stattdessen die von maven heruntergeladene junit.jar-Datei einbeziehe). Mvn test-compile erstellt die Klasse auch korrekt unter Testklassen. Ich verwende dies auf OSX 10.6.7 mit Maven 3.0.2 und Java 1.6.0_24.

Hier ist die Verzeichnisstruktur:

/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));
    }
}

Ende des mvn -X-Tests:

[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: [email protected]]
[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 = [email protected]
[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] ------------------------------------------------------------------------
337
Zugwalt

Standardmäßig verwendet Maven bei der Suche nach Tests die folgenden Namenskonventionen:

  • Test*
  • *Test
  • *TestCase

Ihre Testklasse befolgt diese Konventionen nicht. Sie sollten es umbenennen oder Maven Surefire Plugin konfigurieren, um ein anderes Muster für Testklassen zu verwenden.

572
axtavt

Ich fand auch, dass der Gerätetestcode unter dem Testordner abgelegt werden sollte. Er kann nicht als Testklasse erkannt werden, wenn Sie ihn unter dem Hauptordner.

Falsch

/my_program/src/main/Java/NotTest.Java

Recht

/my_program/src/test/Java/MyTest.Java
72
Robin Ma

Eine andere Sache kann dazu führen, dass Maven die Tests nicht findet, wenn die Verpackung des Moduls nicht korrekt deklariert ist.

In einem kürzlichen Fall hatte jemand <packaging>pom</packaging> und meine Tests liefen nie. Ich habe es in <packaging>jar</packaging> geändert und jetzt funktioniert es gut.

50
Jon

UPDATE:

Wie @scottyseus in den Kommentaren gesagt hat, reicht ab Maven Surefire 2.22.0 Folgendes aus:

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

Bei der Verwendung von JUnit 5 stieß ich auf das gleiche Problem. Maven Surefire benötigt ein Plugin, um JUnit 5-Tests auszuführen. Fügen Sie dies unserem pom.xml hinzu:

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

Quelle: https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

28
teyzer

Überprüfen Sie auch, ob Ihr Testklassenverzeichnis (z. B. src/test/Java) dem Verzeichnis entspricht, das in der Eigenschaft <testSourceDirectory> in Ihrer pom.xml unter der Eigenschaft <build> aufgeführt ist. Ich habe eine Weile gebraucht, um das zu finden.

26
t3rmin41

Überprüfen Sie das (für jUnit - 4.12 und Eclipse Surefire Plugin)

  1. Fügen Sie die erforderliche jUnit-Version in POM.xml in Abhängigkeiten hinzu. Maven -> Aktualisieren Sie das Projekt, um die erforderlichen, im Projekt exportierten Gläser anzuzeigen.
  2. Die Testklasse befindet sich unter dem Ordner src/test/Java und den Unterverzeichnissen dieses Ordners (oder der Basisordner kann in POM in config testSourceDirectory angegeben werden. Der Name der Klasse sollte das Endwort "Test" haben.
  3. Die Testmethode in der Testklasse sollte die Annotation @Test haben
9
Mitra

Maven führt Ihre Tests nicht aus, wenn das Projekt <packaging>pom</packaging> hat.

Sie müssen das Paket auf jar (oder einen anderen Java-Artefakttyp) setzen, damit die Tests ausgeführt werden können: <packaging>jar</packaging>

9
robjwilkins

Wurde festgestellt, dass einem Test ein Präfix vorangestellt wird, wird dieser standardmäßig ebenfalls ignoriert.

8
user1016765

Wenn Sie eine gemeinsam genutzte Java/Groovy-Anwendung haben und nur Groovy-Komponententests vorhanden sind, findet Maven keine Tests. Dies kann durch Hinzufügen eines Komponententests unter src/test/Java behoben werden.

4

Ich hatte auch ein ähnliches Problem, nachdem ich herausgefunden hatte, dass die Testng-Abhängigkeit dieses Problem verursacht. Nachdem ich die testng-Abhängigkeit von pom entfernt hatte (da ich sie nicht mehr brauche), fing es für mich gut an.

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8</version>
        <scope>test</scope>
    </dependency>
3
rajesh madhavan

Viele dieser Antworten waren in der Vergangenheit für mich sehr nützlich, aber ich möchte ein zusätzliches Szenario hinzufügen, das mich einige Zeit gekostet hat, da es anderen in der Zukunft helfen kann:

Stellen Sie sicher, dass die Testklassen und -methoden öffentlich sind.  

Mein Problem war, dass ich eine automatische Testklassen-/Methodengenerierungsfunktion von IDE (IntelliJ) verwendete und diese aus irgendeinem Grund als package-private erstellt hat. Ich finde, dass dies leichter zu übersehen ist, als man erwarten würde.

2
João Matos
/my_program/src/test/Java/ClassUnderTestTests.Java

sollte sein 

/my_program/src/test/Java/ClassUnderTestTest.Java

Der Maven findet diese Enden Test oder startet mit Test, um automatisch ausgeführt zu werden.

Sie können jedoch verwenden 

mvn surefire:test -Dtest=ClassUnderTestTests.Java 

um deine Tests durchzuführen.

2
Boris Z.

Ein anderer Grund, warum ich die Testfälle nicht ausgeführt habe, ist mir passiert - ich hatte eine Eigenschaft namens "test" für völlig andere Zwecke, die jedoch das todsichere Plugin beeinträchtigte. Überprüfen Sie daher Ihre POMs auf:

<properties>
  <test>.... </test>
  ...
</properties>

und entferne es.

1
Rusi Popov

Noch ein Tipp (zusätzlich zu den vorherigen Antworten):

Gehen Sie in Eclipse zu den Eigenschaften Ihres Projekts> klicken Sie auf Run/Debug Settings

"Auf dieser Seite können Sie Startkonfigurationen mit der aktuell ausgewählten Ressource .__ verwalten."

Dort können Sie JU (JUnit) -Tests, die Sie in Ihrem Projekt (im Ordner src/test/Java oder Kurs) haben, hinzufügen (neu ...) oder entfernen (löschen).

1
datv

Ich hatte das gleiche Problem, das durch folgende Änderung in pom.xml behoben wurde:

<build>
    <testSourceDirectory>test</testSourceDirectory>

...

gewechselt zu: 

<build>
    <testSourceDirectory>${project.basedir}/src/test/Java</testSourceDirectory>
1
ShayneR

Wenn Ihr Testklassenname nicht der Standardbenennungskonvention entspricht (wie oben durch @axtavt hervorgehoben), müssen Sie den Muster-/Klassennamen im pom.xml hinzufügen, damit Maven den Test auswählen kann.

...
<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> 
...
1
Saikat

Wenn Sie Ihre Tests in JUnit 4 geschrieben haben und JUnit 5-Abhängigkeiten zum Surefire-Plugin hinzugefügt haben, werden Ihre Tests nicht ausgeführt.

In diesem Fall kommentieren Sie einfach die Abhängigkeiten von JUnit 5 aus dem todsicheren 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>
1
youhans

In meinem Fall handelt es sich um eine Multimodul-Migrationsanwendung für Spring Boot. Leider hat maven nicht mehr alle Tests in den Modulen durchgeführt. Die Benennung der Testklassen hat sich nicht geändert, wir folgen den Namenskonventionen.

Am Ende hat es geholfen, als ich die Abhängigkeit surefire-junit47 zum Plugin maven-surefire-plugin hinzugefügt habe. Aber ich konnte nicht erklären, warum es Versuch und Irrtum war:

<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>
0
Michael Hegner

Ein solches Problem kann auftreten, wenn Sie das Surfire-Plugin 3.x.x + mit JUnit5 verwenden und die Testklasse versehentlich mit der @Test-Anmerkung von JUnit4 annotieren.

Verwenden Sie: org.junit.jupiter.api.Test (JUnit5) anstelle von org.junit.Test (Junit4)

ANMERKUNG: Dies kann schwer zu bemerken sein, da die IDE dies ohne Probleme wie beim JUnit4-Test ausführen kann.

0
walkeros

Das Folgen hat in Junit 5 für mich ganz gut funktioniert

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>
<!-- ... -->
0
A. S. Ranjan

Falls jemand gesucht hat und ich es nicht lösen kann, hatte ich eine Bibliothek für verschiedene Tests:

<dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${org.junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>

Als ich junit installiert habe, hat alles funktioniert, ich hoffe und helfe dabei:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
0
Hizmarck

Ein weiteres leicht zu übersehendes Problem: Stellen Sie sicher, dass Ihre Klassendatei die Erweiterung .Java aufweist

0
Mark W

ich habe diesen Code verwendet

<sourceDirectory>src_controller</sourceDirectory>
  <testSourceDirectory>src_test</testSourceDirectory>

in meiner pom.xml müssen Sie nur sicherstellen, dass die testng-Datei dort spezifisch ist

<suiteXmlFile>/Users/mac/xxx/xxx/xx.xxxx.xx/xxx.restassured.xx/testng.xml</suiteXmlFile>
0
Prasetyo Budi

junitArtifactName könnte auch der Fall sein, wenn die verwendete JUnit nicht der Standard ist (junit:junit), aber zum Beispiel ...

<dependency>
    <groupId>org.Eclipse.orbit</groupId>
    <artifactId>org.junit</artifactId>
    <version>4.11.0</version>
    <type>bundle</type>
    <scope>test</scope>
</dependency>
0
Tuomas Kiviaho

Hier ist der genaue Code, den ich meiner pom.xml hinzufügen musste:

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

Und hier meine Abhängigkeiten:

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

In meinem Fall wurde die junit-vintage-Engine hinzugefügt, wodurch sie mit älteren Versionen von JUnit-Tests kompatibel ist und diese ausführen kann. Da ich JUnit 5 verwende.

<dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
</dependency>
0
Duc Tran