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?


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>

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>

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


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!


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>

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>

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>

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


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.


0

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

Aber ich benutze die M6Version auf Junit5.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.