Surefire non raccoglie i test Junit 5


113

Ho scritto un semplice metodo di test con JUnit 5:

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

Ma quando corro mvn test, ho:

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

In qualche modo, infallibile non ha riconosciuto quella classe di prova. Il mio pom.xmlaspetto è:

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

Qualche idea su come farlo funzionare?


1
In questo momento devi usare un'implementazione speciale del plugin infallibile. Controlla gli esempi del team junit qui
jah

1
La domanda si basa su una versione obsoleta ma questa risposta si basa su quella attuale (a dicembre 2016).
Nicolai

@Nicolai Grazie per aver aggiornato la risposta. Comunque apprezzerei la tua modifica sulla questione, se hai tempo.
Ali Dehghani

1
Questo errore non si verifica più così. Il caso più probabile per una mancanza di esecuzione del test è coperto da questa domanda .
Nicolai

Assicurati che i file di prova siano nel posto giusto. Per impostazione predefinita, il test dovrebbe essere un fratello di main nella cartella src.
Joe Bowbeer

Risposte:


115

Il maven-surefire-plugin, ad oggi, non ha il pieno supporto di JUnit 5 . Esiste un problema aperto sull'aggiunta di questo supporto in SUREFIRE-1206 .

Pertanto, è necessario utilizzare un provider personalizzato . Uno è già stato sviluppato dal team JUnit; dalla guida utente , è necessario aggiungere il junit-platform-surefire-providerprovider e l' TestEngineimplementazione per la nuova API:

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

Inoltre, assicurati di dichiarare la junit-jupiter-apidipendenza con un ambito di test:

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

25
Vale la pena notare che in questo momento surefire 2.20.1 non funziona con il provider junit 5, quindi 2.19.1 utilizzato nel campione è ancora valido nonostante l'anno trascorso.
splatch

1
Anche la surefire 2.21.0 non funziona, devi tornare alla 2.19.1
valodzka

@valodzka Per me funziona con 2.21.0 e versioni più recenti del plugin e junit5. Vedi junit.org/junit5/docs/current/user-guide/…
Thirler

Verificato: maven-surefire-plugin v2.21.0funziona bene con junit-jupiter-engine v5.2.0e junit-platform-surefire-provider v1.2.0
povis

2
Questa configurazione fallirà con Surefire 2.22.0 o versioni successive. È necessario escludere Junit deps dalla configurazione di Surefire. Ho scritto un breve post al riguardo qui - springframework.guru/…
John Thompson

51

Aggiorna 2

Il problema è stato risolto in Maven Surefire Plugin v2.22.0

La nuova versione è disponibile su Maven Central Repository.

Esperto di

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

Aggiornare

Come ha sottolineato Marian , l'ultima versione di JUnit 5 Platform Surefire Provider (1.2.0) supporta l'ultima versione di 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>



Esempio

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

Output (installazione pulita mvn)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : test (default-test) @ test --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] TEST
[INFO] - -------------------------------------------------- ---
[INFO] in corso test.TestScenario
[INFO] test eseguiti: 1, guasti: 0, errori: 0, ignorati: 0, il tempo trascorso: 0.005 s - in test.TestScenario
[INFO]
[INFO] Risultati:
[INFO ]
[INFO] Test eseguiti: 1 , Errori: 0, Errori: 0, Ignorato: 0
...


Il modo più semplice fino ad oggi:

    <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
Funziona solo a causa di Test nel nome della classe. Rinomina la classe in ExampleScenario: non verrà scoperta. (Surefire 2.22.0)
Alexei Vinogradov

@AlexeiVinogradov Sì. È un comportamento previsto. Maggiori informazioni sono disponibili qui: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov

bevare, versione del motore junit rispetto alla versione genitore dello stivale a molla. Basta specificare la dipendenza junit-jupiter-engine: 5.1 non funziona dove le versioni più recenti lo fanno. Lo Spring Boot ha ancora preconfigurato JUnit4 <junit.version> 4.13.
Wooff

20

Dalla documentazione di JUnit 5 :

A partire dalla versione 2.22.0, Maven Surefire fornisce supporto nativo per l'esecuzione di test sulla piattaforma JUnit.

Inoltre puoi leggere in maven-surefire-plugin documentazione :

Utilizzo della piattaforma JUnit 5

Per iniziare con la piattaforma JUnit, devi aggiungere almeno una singola TestEngineimplementazione al tuo progetto. Ad esempio, se desideri scrivere test con Jupiter, aggiungi l'artefatto di test junit-jupiter-engine alle dipendenze in POM

Quindi è sufficiente per eseguire i test di JUnit 5:

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

Sul mio spazio GitHub ho aggiunto un progetto maven di esempio funzionante che puoi sfogliare / clonare.
URL: https://github.com/ebundy/junit5-minimal-maven-project


9

Mi sono imbattuto in questo problema con JUnit5 e Maven ma ho anche notato che, anche se fosse stato aggiunto solo junit-jupiter-engine come dipendenza, i test sarebbero stati eseguiti su alcuni progetti, non su altri . E vedo lo stesso schema nei commenti qui: Nel commento di @Alex sopra puoi vedere che non ha alcun problema, anche con le versioni precedenti di surefire / junit / platform.

Dopo essermi grattato la testa per un po 'di tempo, mi sono reso conto che quei progetti in cui i test non sarebbero stati eseguiti erano quelli in cui i nomi dei metodi di test non contenevano la parola "test". Anche se questo non è richiesto da http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

In altre parole: solo con

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

Questo

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

NON verrà eseguito, mentre

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

VERRÀ eseguito!

Questo problema si svolge come una bambola russa ...

Comunque, +1 per @Mikhail Kholodkov la cui risposta aggiornata risolve tutti i problemi contemporaneamente!


Ho anche appena riscontrato un problema con mvn 3.5.0, jdk 1.8.0_101 in cui il nome della mia classe non aveva "Test" e il test non è stato rilevato, questo mi ha aiutato a trovarlo!
dann.dev

Sì, in effetti dovresti essere conforme a maven.apache.org/surefire/maven-surefire-plugin/examples/… Ma stavo parlando di qualcosa di diverso.
Fabien M

Sì, ho scoperto che avevo due problemi, il primo era non ricordare le regole di base del test infallibile di Maven. Il secondo non stava facendo un progetto di aggiornamento Maven> per eclipse per raccogliere il programma di avvio di junit 5.
dann.dev

Vorrei aggiungere che la classe e i metodi devono essere pubblici.
Jónás Balázs,

6

Ho riscontrato lo stesso problema nell'agosto 2019 di cui ho chiesto qui: Maven non riesce silenziosamente a trovare i test JUnit da eseguire . Queste risposte mi hanno portato nella giusta direzione, ma ho scoperto che puoi risolvere il problema in modo ancora più conciso. Ho copiato la mia soluzione dal progetto Maven di esempio JUnit5 .

A partire da JUnit 5.5.1 e maven-surefire-plugin2.22.2, non è necessario aggiungere la junit-platform-surefire-providerdipendenza. È sufficiente che questa dipendenza e un plug-in siano specificati nel tuo 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>

Questo è l'approccio corretto e conciso. Funziona con OpenJDK 11 e JUnit 5.6.2.
argento

5

Giusto per completare, funziona anche la piattaforma surefire 2.22.0 + junit 5.2.0 + 1.2.0. In allegato c'è un pom funzionante per il tuo referecne:

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

Il mio problema era che non avevo junit-vintage-engineuna dipendenza e tutti i miei test erano scritti per JUnit 4.
Mark

la combinazione di specifiche versioni junit, piattaforma e infallibile ha funzionato per me. Grazie !
CoderTR

4

Nel mio caso questo era a causa del TestNG nel classpath ( SUREFIRE-1527 ). Groovy 2.5.5 POM lo ha portato con il groovy-testngmodulo.

Il provider del framework di test specificato manualmente (come descritto su https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html ) ha risolto il problema:

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

Si dovrebbe avvolgere la <dependency>in <dependencies>nel codice di esempio.
user1053510


1

Ho avuto un problema simile anche perché Surefire riconosceva zero test.

Il mio problema si è rivelato essere correlato a quanto segue (dalla documentazione di JUnit 5.1.0 / maven ):

A causa di una perdita di memoria in Surefire 2.20 e di problemi in esecuzione su Java 9, il provider junit-platform-surefire attualmente funziona solo con Surefire 2.19.1.

Stavo cercando di utilizzare le ultime versioni di Surefire (2.21.0) e junit-platform-safefire-provider (1.1.0) e non ha funzionato (né in Java 8 o 9)

Il ritorno a Surefire 2.19.1 ha risolto il mio problema.

In base a questo problema, una correzione sarà inclusa nella versione 1.2.0 di junit-platform-surefire-provider (attualmente disponibile solo come SNAPSHOT).


1
Ho provato gli SNAPSHOT e tutto funziona (con Surefire 2.21.0). Si spera che funzioni ancora al momento del rilascio.
user7610

1

Una cosa che ho notato che sono riuscito a farlo funzionare:

  • La denominazione della mia classe di prova ClinicCalendarShouldnon viene presa da Maven
  • Assegnare un nome alla mia classe di prova ClinicCalendarTestviene scelto da Maven

Quindi, a meno che non manchi una sorta di configurazione o parametro o qualsiasi altra cosa nel plug-in infallibile, per impostazione predefinita, è necessario denominare le classi di test XXXTest.


0

L'aggiornamento per maven-surefire-plugin:2.20eseguire i test Junit5 senza problemi.

Ma sto usando la M6versione su Junit5.


Non così semplice (almeno al momento). Vedi JUnit 5 User Guide
FrVaBe

@FrVaBe strano funziona bene sul mio con la versione m6.
LazerBanana

2
Mi sono stancato di surefire-2.20.1 + junit-5.0.2 e non ha funzionato. Ho anche provato surefire-2.20.1 + junit-5.1.0-M6 e non ha funzionato
Eric

0

Nel mio caso, il plugin infallibile non ha ottenuto la versione corretta di jupiter-engine / api. E questo era anche se si eseguiva Maven 3.6.1 e la versione 2.22.2 di surefireplugin!

Ora la mia configurazione del plugin infallibile sembra:

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

Inoltre, ho dovuto forzare queste versioni:

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

Sembra che 5.5.2 fosse collegato alla versione 1.3.2 della piattaforma sbagliata invece di 1.5.2 nel mio caso.

Tutti i test JUnit5 vengono raccolti ora. Anche con 2.22.0 del plugin infallibile questo non è stato il mio caso!

Spero che aiuti...


0

Stavo affrontando lo stesso problema junit5e entrambi i maven-surefiretest stavano fallendo. Tuttavia junit4stava funzionando bene. La combinazione di seguito ha funzionato per me, non aggiungo il controllo delle versioni. Utilizzare junit-bomper la gestione delle dipendenze. utilizzandospring-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>

Assicurati di eseguire l'aggiornamento all'ultima versione di eclipse

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.