it-swarm.com.de

Surefire nimmt keine Junit 5-Tests auf

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 mvn test starte, bekam 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 erkannte Surefire diese Testklasse nicht. Mein pom.xml sieht folgendermaßen aus:

<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 man diese Arbeit machen kann?

76
Ali Dehghani

Der maven-surefire-plugin hat ab heute keine vollständige Unterstützung von JUnit 5 . Es gibt eine offene Frage zum Hinzufügen dieser Unterstützung in SUREFIRE-1206 .

Daher müssen Sie einen benutzerdefinierten Anbieter verwenden. Eines wurde bereits vom JUnit-Team entwickelt. Im user guide müssen Sie den junit-platform-surefire-provider-Provider und die TestEngine-Implementierung 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-api-Abhängigkeit mit einem Gültigkeitsbereich von test angeben:

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.0.3</version>
    <scope>test</scope>
  </dependency>
</dependencies>
87
Tunaki

Update 2

Problem wurde in Maven Surefire Plugin v2.22.0 behoben 

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'

Update

Wie Marian festgestellt hat, unterstützt die neueste Version von JUnit 5 Platform Surefire Provider (1.2.0) die neueste Version von Maven Surefire Plugin (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 clean install)

... 
[INFO] --- maven-surefire-plugin: 2.21.0: test (default-test) @ test --- [INFO] 
[INFO] -------------------------------------------------- ----- 
[INFO] T E S T S 
[INFO] -------------------------------------------------- ----- 
[INFO] Lauftest test.TestScenario 
[INFO] Testlauf: 1, Fehler: 0, Fehler: 0, Übersprungen: 0, Verstrichene Zeit: 0,005 s - in test.TestScenario
[INFO] 
[INFO] Ergebnisse: 
[INFO] 
[INFO] Tests laufen: 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>
33

Aus der JUnit 5 Dokumentation :

Ab Version 2.22.0 bietet Maven Surefire native Unterstützung zum Ausführen von Tests auf der JUnit-Plattform.

Zusätzlich können Sie die maven-surefire-plugin Dokumentation lesen:

Verwenden der JUnit 5-Plattform

Um mit JUnit Platform beginnen zu können, müssen Sie mindestens ein einzelnes .__ hinzufügen. TestEngine Implementierung in Ihr Projekt. Zum Beispiel, wenn Sie möchten Schreiben Sie Tests mit Jupiter, fügen Sie das Testartefakt junit-jupiter-engine.__ hinzu. zu den Abhängigkeiten in POM

Es reicht also aus, 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-Space habe ich ein funktionierendes Beispiel-Maven-Projekt hinzugefügt, das Sie durchsuchen/klonen können.
URL: https://github.com/ebundy/junit5-minimal-maven-project

7
davidxxx

Ich bin auf dieses Problem mit JUnit5 und Maven gestoßen, habe aber auch bemerkt, dass nur junit-jupiter-engine als Abhängigkeit hinzugefügt wurde, Tests würden auf einigen Projekten ausgeführt, nicht auf andere. Und ich sehe dasselbe Muster in den Kommentaren hier: In @Alex Kommentar oben können Sie sehen, dass er selbst mit früheren Versionen von surefire/junit/platform kein Problem hat.

Nachdem ich mir einige Zeit am Kopf gekratzt hatte, wurde mir klar, dass die Projekte, in denen die Tests nicht ausgeführt werden konnten, diejenigen waren, in denen die Tests Methode Namen dit nicht das Wort enthalten " Prüfung". Dies wird jedoch nicht von http://maven.Apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html vorgeschrieben

Mit anderen Worten: einfach mit

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

diese

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

wird NICHT ausgeführt, wohingegen

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

WIRD laufen!

Diese Ausgabe entfaltet sich wie eine russische Puppe ...

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

7
Fabien Marsaud

Die todsichere Version 2.22.0 + junit 5.2.0 + platform 1.2.0 funktioniert ebenfalls. Angeschlossen ist ein Arbeitsbombe für Ihre 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>
2
schnell18

Ich hatte ein ähnliches Problem, weshalb Surefire Nulltests erkannte.

Es stellte sich heraus, dass mein Problem auf Folgendes bezogen war (aus der Dokumentation JUnit 5.1.0/maven ):

Aufgrund eines Speicherverlusts in Surefire 2.20 und Problemen mit Java 9 funktioniert der Surefire-Anbieter für Junit-Plattformen derzeit nur mit Surefire 2.19.1.

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

Das Umschalten auf Surefire 2.19.1 hat mein Problem gelöst.

Laut diesem Problem wird ein Update in Version 1.2.0 des Junit-Plattform-Surefire-Providers enthalten (derzeit nur als SNAPSHOT verfügbar).

1
avandeursen

Ich bin im August 2019 auf dasselbe Problem gestoßen, zu dem ich hier gefragt habe: Maven findet 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-Beispiel-Maven-Projekt kopiert.

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

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

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

Der manuell angegebene Test-Framework-Anbieter (wie unter https://maven.Apache.org/surefire/maven-surefire-plugin/examples/providers.html beschrieben) hat das Problem behoben:

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

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

  • Die Benennung meiner Testklasse ClinicCalendarShould wird von maven nicht abgeholt
  • Die Benennung meiner Testklasse ClinicCalendarTest wird von maven abgeholt

Wenn Sie also keine Konfiguration oder Parameter oder was auch immer im surefire-Plugin fehlen, müssen Sie standardmäßig Ihre Testklassen XXXTest nennen.

0
jkilgrow

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

Aber ich verwende die M6-Version auf Junit5.

0
LazerBanana

Es gibt eine offene Ausgabe für todsichere 2.20

Es funktioniert für mich mit surefire 2.19 + junit-platform- * 1.0.3

0
Alex