Surefire nimmt keine Junit 5-Tests auf

113

Ich habe mit JUnit 5 eine einfache Testmethode geschrieben:

public class SimlpeTest {
    @Test
    @DisplayName("Some description")
    void methodName() {
        // Testing logic for subject under test
    }
}

Aber wenn ich renne mvn test, bekomme ich:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running SimlpeTest
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

Irgendwie hat todsicher diese Testklasse nicht erkannt. Mein pom.xmlsieht aus wie:

<properties>
    <java.version>1.8</java.version>
    <junit.version>5.0.0-SNAPSHOT</junit.version>
</properties>

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

<repositories>
    <repository>
        <id>snapshots-repo</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <updatePolicy>always</updatePolicy>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Irgendeine Idee, wie das funktioniert?

Ali Dehghani
quelle
1
Im Moment müssen Sie eine spezielle Implementierung des todsicheren Plugins verwenden. Überprüfen Sie die Beispiele des Junit-Teams hier
jah
1
Die Frage basiert auf einer veralteten Version, diese Antwort basiert jedoch auf der aktuellen (Stand Dezember 2016).
Nicolai
@Nicolai Danke, dass du die Antwort aktualisiert hast. Wie auch immer, ich würde mich über Ihre Bearbeitung auf Frage freuen, wenn Sie die Zeit haben.
Ali Dehghani
1
Dieser Fehler tritt nicht mehr so ​​auf. Der wahrscheinlichste Fall für eine mangelnde Testausführung wird von dieser Frage abgedeckt .
Nicolai
Stellen Sie sicher, dass sich die Testdateien am richtigen Ort befinden. Standardmäßig sollte test ein Geschwister von main im Ordner src sein.
Joe Bowbeer

Antworten:

115

Das maven-surefire-pluginhat bis heute keine volle Unterstützung für JUnit 5 . Es gibt ein offenes Problem beim Hinzufügen dieser Unterstützung in SUREFIRE-1206 .

Daher müssen Sie einen benutzerdefinierten Anbieter verwenden . Eine wurde bereits vom JUnit-Team entwickelt. Im Benutzerhandbuch müssen Sie den junit-platform-surefire-providerAnbieter und die TestEngineImplementierung für die neue API hinzufügen :

<build>
  <plugins>        
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <!-- latest version (2.20.1) does not work well with JUnit5 -->
      <version>2.19.1</version>
      <dependencies>
        <dependency>
          <groupId>org.junit.platform</groupId>
          <artifactId>junit-platform-surefire-provider</artifactId>
          <version>1.0.3</version>
        </dependency>
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>5.0.3</version>
        </dependency>
      </dependencies>
    </plugin>
  </plugins>
</build>

Stellen Sie außerdem sicher, dass Sie die junit-jupiter-apiAbhängigkeit mit folgendem Umfang deklarieren test:

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.0.3</version>
    <scope>test</scope>
  </dependency>
</dependencies>
Tunaki
quelle
25
Es ist anzumerken, dass das todsichere 2.20.1 derzeit nicht mit dem Junit 5-Anbieter funktioniert, sodass das in der Stichprobe verwendete 2.19.1 trotz des vergangenen Jahres weiterhin gültig ist.
Splatch
1
Surefire 2.21.0 funktioniert auch nicht, muss auf 2.19.1
Valodzka
@valodzka Für mich funktioniert es mit 2.21.0 und neueren Versionen des Plugins und junit5. Siehe junit.org/junit5/docs/current/user-guide/…
Thirler
Verifiziert: maven-surefire-plugin v2.21.0funktioniert gut mit junit-jupiter-engine v5.2.0und junit-platform-surefire-provider v1.2.0
povis
2
Diese Konfiguration schlägt mit Surefire 2.22.0 oder höher fehl. Sie müssen die Junit-Deps von der Surefire-Konfiguration ausschließen. Ich schrieb hier einen kurzen Beitrag darüber - springframework.guru/…
John Thompson
51

Update 2

Problem Problem wurde im Maven Surefire Plugin v2.22.0 behoben

Die neue Version ist im Maven Central Repository verfügbar.

Maven

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
</dependency>

Gradle

compile group: 'org.apache.maven.plugins', name: 'maven-surefire-plugin', version: '2.22.0'

Aktualisieren

Wie Marian betonte, unterstützt die neueste Version von JUnit 5 Platform Surefire Provider (1.2.0) die neueste Version des Maven Surefire Plugins (2.21.0) :

        <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</version>
                </dependency>
            </dependencies>
        </plugin>



Beispiel

pom.xml

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<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</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

TestScenario.java

package test;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class TestScenario {

    @Test
    @DisplayName("Test 2 + 2 = 4")
    public void test() {
        Assertions.assertEquals(4, 2 + 2);
    }
}

Ausgabe (mvn Neuinstallation)

...
[INFO] --- Maven-Surefire-Plugin: 2.21.0 : Test (Standard-Test) @ Test --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] TESTS
[INFO] - -------------------------------------------------- ---
[INFO] Test.TestScenario ausführen
[INFO] Testlauf: 1, Fehler: 0, Fehler: 0, Übersprungen: 0, Verstrichene Zeit: 0,005 s - im Test.TestScenario
[INFO]
[INFO] Ergebnisse:
[INFO ]
[INFO] Testlauf: 1 , Fehler: 0, Fehler: 0, Übersprungen: 0
...


Einfachster Weg bis heute:

    <plugin>
        <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.1.0</version>
            </dependency>
        </dependencies>
    </plugin>
Mikhail Kholodkov
quelle
1
Dies funktioniert nur aufgrund von Test im Namen der Klasse. Benennen Sie die Klasse in ExampleScenario um - sie wird nicht erkannt. (Surefire 2.22.0)
Alexei Vinogradov
@AlexeiVinogradov Ja. Es ist erwartetes Verhalten. Weitere Informationen finden Sie hier: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov
20

Aus der JUnit 5-Dokumentation :

Ab der Version 2.22.0bietet Maven Surefire native Unterstützung für die Ausführung von Tests auf der JUnit-Plattform.

Zusätzlich können Sie in der maven-surefire-pluginDokumentation lesen :

Verwenden der JUnit 5-Plattform

Um mit JUnit Platform zu beginnen, müssen Sie TestEngineIhrem Projekt mindestens eine einzelne Implementierung hinzufügen . Wenn Sie beispielsweise Tests mit Jupiter schreiben möchten, fügen Sie das Testartefakt junit-jupiter-engine den Abhängigkeiten in POM hinzu

Genau das reicht aus, um JUnit 5-Tests auszuführen:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>davidxxx</groupId>
    <artifactId>minimal-pom-junit5</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <junit-jupiter.version>5.2.0</junit-jupiter.version> 
        <!--optional below but good practice to specify our java version-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

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

        <!--optional below -->
        <!-- add any JUnit extension you need such as -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
        </plugins>
    </build>

</project>

In meinem GitHub-Bereich habe ich ein funktionierendes Beispiel-Maven-Projekt hinzugefügt, das Sie durchsuchen / klonen können.
URL: https://github.com/ebundy/junit5-minimal-maven-project

davidxxx
quelle
9

Ich bin auf dieses Problem mit JUnit5 und Maven gestoßen, habe aber auch festgestellt, dass, selbst wenn nur die Junit-Jupiter-Engine als Abhängigkeit hinzugefügt wurde, Tests für einige Projekte ausgeführt werden, nicht für andere . Und ich sehe das gleiche Muster in den Kommentaren hier: In @Alex Kommentar oben können Sie sehen, dass er kein Problem hat, selbst mit früheren Versionen von todsicher / junit / Plattform.

Kopf für einige Zeit nach dem Kratzen wurde mir klar , dass diese Projekte , bei denen die Tests nicht ausgeführt würden diejenigen waren , wo die Tests Methode Namen dit nicht das Wort „Test“ enthalten. Dies wird jedoch nicht von http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html vorgeschrieben

Mit anderen Worten: nur mit

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>

Dies

@Test
public void something() {
    assertTrue(true);
}

wird NICHT ausgeführt, wohingegen

@Test
public void testSomething() {
    assertTrue(true);
}

WIRD laufen!

Diese Ausgabe entfaltet sich als russische Puppe ...

Wie auch immer, +1 für @Mikhail Kholodkov, dessen aktualisierte Antwort alle Probleme auf einmal behebt!

Fabien M.
quelle
Ich habe auch gerade ein Problem mit mvn 3.5.0, jdk 1.8.0_101 festgestellt, bei dem mein Klassenname nicht 'Test' enthielt und der Test nicht abgeholt wurde. Dies hat mir geholfen, das zu finden!
dann.dev
Ja, in der Tat sollten Sie sich an maven.apache.org/surefire/maven-surefire-plugin/examples/ halten. Aber ich habe über etwas anderes gesprochen.
Fabien M
Ja, es stellte sich heraus, dass ich zwei Probleme hatte. Das erste war, dass ich mich nicht an die grundlegenden Regeln für todsichere Maven-Tests erinnerte. Der zweite führte kein Maven> -Update-Projekt für Eclipse durch, um den Junit 5-Launcher aufzunehmen.
dann.dev
Ich möchte hinzufügen, dass die Klasse und die Methoden öffentlich sein müssen.
Jónás Balázs
5

Als Ergänzung funktioniert auch das todsichere 2.22.0 + Junit 5.2.0 + Plattform 1.2.0. Im Anhang finden Sie einen funktionierenden Pom für Ihren Schiedsrichter:

    <?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>org.jjhome.junit5</groupId>
    <artifactId>junit5-hone</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>junit5-home</name>

    <properties>
        <maven.compiler.source>1.6</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit5.version>5.2.0</junit5.version>
        <platform.version>1.2.0</platform.version>
        <surefire.version>2.22.0</surefire.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${platform.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${platform.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit5.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
schnell18
quelle
Mein Problem war , dass ich nicht hatte junit-vintage-engineals Abhängigkeit, und alle meine Tests für JUnit wurden geschrieben 4.
Mark
Die Kombination der angegebenen Junit-, Plattform- und todsicheren Versionen hat bei mir funktioniert. Vielen Dank !
CoderTR
5

Im August 2019 stieß ich auf dasselbe Problem, nach dem ich hier gefragt habe: Maven findet lautlos keine JUnit-Tests zum Ausführen . Diese Antworten haben mich in die richtige Richtung geführt, aber ich habe festgestellt, dass Sie das Problem noch präziser lösen können. Ich habe meine Lösung aus dem JUnit5-Beispielprojekt Maven kopiert .

Ab JUnit 5.5.1 und maven-surefire-plugin2.22.2 müssen Sie die junit-platform-surefire-providerAbhängigkeit nicht mehr hinzufügen . Es reicht aus, diese eine Abhängigkeit und ein Plugin in Ihrem pom.xml:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.5.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>
Arbeiterjoe
quelle
4

In meinem Fall lag dies am TestNG im Klassenpfad ( SUREFIRE-1527 ). Groovy 2.5.5 POM hat es mit dem groovy-testngModul gebracht.

Der manuell angegebene Test-Framework-Anbieter (wie unter https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html beschrieben ) löste das Problem:

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

    <dependency>
        <groupId>org.apache.maven.surefire</groupId>
        <artifactId>surefire-junit-platform</artifactId>
        <version>2.22.1</version>
    </dependency>
Lu55
quelle
Sie sollten das <dependency>In <dependencies>in Ihr Codebeispiel einschließen.
user1053510
1

Ich hatte ein ähnliches Problem, das auch dazu führte, dass Surefire keine Tests erkannte.

Es stellte sich heraus, dass mein Problem mit Folgendem zusammenhängt (aus der JUnit 5.1.0 / maven- Dokumentation):

Aufgrund eines Speicherverlusts in Surefire 2.20 und Problemen unter Java 9 funktioniert der Junit-Plattform-Surefire-Anbieter derzeit nur mit Surefire 2.19.1.

Ich habe versucht, die neuesten Versionen von Surefire (2.21.0) und Junit-Platform-Surefire-Provider (1.1.0) zu verwenden, und es hat nicht funktioniert (weder in Java 8 noch in Java 9).

Das Zurückschalten auf Surefire 2.19.1 hat mein Problem gelöst.

Entsprechend diesem Problem wird ein Fix in Version 1.2.0 des Junit-Platform-Surefire-Providers enthalten sein (derzeit nur als SNAPSHOT verfügbar).

avandeursen
quelle
1
Ich habe die SNAPSHOTs ausprobiert und alles funktioniert (mit Surefire 2.21.0). Hoffentlich funktioniert es zum Zeitpunkt der Veröffentlichung noch.
user7610
1

Eines ist mir aufgefallen, dass ich es zum Laufen bringen konnte:

  • Die Benennung meiner ClinicCalendarShouldTestklasse wird von Maven nicht erfasst
  • Das Benennen meiner ClinicCalendarTestTestklasse wird von Maven abgeholt

Sofern mir keine Konfiguration oder Parameter oder was auch immer im todsicheren Plugin fehlt, müssen Sie Ihre Testklassen standardmäßig XXXTest benennen.

jkilgrow
quelle
0

Durch das Aktualisieren werden maven-surefire-plugin:2.20die Junit5-Tests problemlos ausgeführt.

Aber ich benutze die M6Version auf Junit5.

LazerBanana
quelle
Nicht so einfach (zumindest im Moment). Siehe JUnit 5 Benutzerhandbuch
FrVaBe
@FrVaBe komisch, es funktioniert gut auf meinem mit der m6-Version.
LazerBanana
2
Ich war müde todsicher-2.20.1 + junit-5.0.2 und es hat nicht funktioniert. Ich habe auch todsichere-2.20.1 + junit-5.1.0-M6 versucht und es hat nicht funktioniert
Eric
0

In meinem Fall hat das todsichere Plugin nicht die richtige Version auf der Jupiter-Engine / API erhalten. Und das war sogar, wenn Maven 3.6.1 und surefireplugin Version 2.22.2 ausgeführt wurde!

Jetzt sieht meine todsichere Plugin-Konfiguration so aus:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.5.2</version>
                </dependency>
            </dependencies>
        </plugin>

        ...
    </plugins>
</pluginManagement>

Außerdem musste ich diese Versionen erzwingen:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-engine</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.5.2</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Es sieht so aus, als ob 5.5.2 in meinem Fall mit der falschen Plattformversion 1.3.2 anstelle von 1.5.2 verknüpft war.

Alle JUnit5-Tests werden jetzt abgeholt. Selbst mit 2.22.0 des todsicheren Plugins war dies bei mir nicht der Fall!

Hoffentlich hilft das...

Dolch
quelle
0

Ich hatte beide das gleiche Problem junit5und die maven-surefireTests schlugen fehl. Lief junit4jedoch gut. Die folgende Kombination hat bei mir funktioniert, ich füge die Versionierung nicht hinzu. Verwendung junit-bomfür das Abhängigkeitsmanagement. Verwenden vonspring-boot 2.1.4

   <dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.6.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Stellen Sie sicher, dass Sie auf die neueste Version von Eclipse aktualisieren

garg10may
quelle