web-dev-qa-db-fra.com

Surefire ne ramasse pas les tests Junit 5

J'ai écrit une méthode de test simple avec JUnit 5:

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

Mais quand je lance mvn test, j'ai:

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

D'une manière ou d'une autre, Surefire n'a pas reconnu cette classe de test. Mon pom.xml ressemble à:

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

Une idée de comment faire ce travail?

76
Ali Dehghani

Le maven-surefire-plugin, à compter d’aujourd’hui, contient ne prend pas totalement en charge JUnit 5 . Il existe un problème non résolu concernant l'ajout de cette prise en charge dans SUREFIRE-1206 .

En tant que tel, vous devez utiliser un fournisseur personnalisé . L'un d'entre eux a déjà été développé par l'équipe JUnit; depuis le guide de l'utilisateur , vous devez ajouter le fournisseur junit-platform-surefire-provider et l'implémentation TestEngine pour la nouvelle 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>

Assurez-vous également de déclarer la dépendance junit-jupiter-api avec une étendue de test:

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

Mise à jour 2

Problème a été corrigé dans Maven Surefire Plugin v2.22.0 

Nouvelle version disponible sur le référentiel central Maven.

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'

Mettre à jour

Comme Marian a souligné, la dernière version de JUnit 5 Platform Fournisseur Surefire (1.2.0) prend en charge la dernière version de 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>



Exemple

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 (installation propre de MVN)

... 
[INFO] --- maven-surefire-plugin: 2.21.0: test (test par défaut) @ test --- [INFO] 
[INFO] -------------------------------------------------- ----- 
[INFO] T S S T S 
[INFO] -------------------------------------------------- ----- 
[INFO] Lancer test.TestScenario 
[INFO] Tests exécutés: 1, Échecs: 0, Erreurs: 0, ignorées: 0, temps écoulé: 0,005 s - dans test.TestScenario
[INFO] 
[INFO] Résultats: 
[INFO] 
[INFO] Tests: 1, Échecs: 0, Erreurs: 0, Ignoré: 0 
...


Le moyen le plus simple jusqu'à aujourd'hui:

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

À partir de documentation JUnit 5 :

À partir de la version 2.22.0, Maven Surefire fournit un support natif pour exécuter des tests sur la plateforme JUnit.

De plus, vous pouvez lire dans la documentation maven-surefire-plugin :

Utilisation de la plate-forme JUnit 5

Pour démarrer avec JUnit Platform, vous devez ajouter au moins un seul TestEngine mise en œuvre pour votre projet. Par exemple, si vous voulez écrire des tests avec Jupiter, ajoutez l'artefact de test junit-jupiter-engine aux dépendances dans POM

Il suffit donc de faire exécuter les tests 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>

Sur mon espace GitHub, j'ai ajouté un exemple de projet maven de travail que vous pouvez parcourir/cloner.
URL: https://github.com/ebundy/junit5-minimal-maven-project

7
davidxxx

J'ai rencontré ce problème avec JUnit5 et Maven, mais j'ai également remarqué que, même si only junit-jupiter-engine était ajouté en tant que dépendance, tests s'exécutaient sur certains projets et non sur d'autres. Et je vois un peu le même schéma dans les commentaires ici: Dans le commentaire @Alex ci-dessus, vous pouvez voir qu’il n’a aucun problème, même avec les versions précédentes de surefire/junit/platform.

Après m'être gratté la tête pendant un certain temps, j'ai réalisé que les projets dans lesquels les tests ne s'exécutaient pas étaient ceux dans lesquels les tests méthode noms dit not contenaient le mot "test". Bien que cela ne soit pas mandaté par http://maven.Apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

En d'autres termes: Juste avec

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

ce

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

ne sera PAS exécuté, alors que

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

SERA couru!

Ce problème se déroule comme une poupée russe ...

Quoi qu'il en soit, +1 pour @ Mikhail Kholodkov, dont la réponse mise à jour résout tous les problèmes en même temps!

4
Fabien Marsaud

Pour compléter, surefire 2.22.0 + junit 5.2.0 + plateforme 1.2.0 fonctionne également. Ci-joint un pom de travail pour votre 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>
2
schnell18

J'ai eu un problème similaire qui a également amené Surefire à reconnaître les tests zéro.

Mon problème s'est avéré être lié au suivant (du JUnit 5.1.0/maven documentation):

En raison d'une fuite de mémoire dans Surefire 2.20 et de problèmes liés à Java 9, le fournisseur junit-platform-surefire ne fonctionne actuellement qu'avec Surefire 2.19.1.

J'essayais d'utiliser les dernières versions de Surefire (2.21.0) et de junit-platform-surefire-provider (1.1.0), et cela ne fonctionnait pas (ni en Java 8 ni en 9)

Revenir à Surefire 2.19.1 a résolu mon problème.

Selon ce problème un correctif sera inclus dans la version 1.2.0 du fournisseur junit-platform-surefire (actuellement disponible en tant que SNAPSHOT uniquement).

1
avandeursen

J'ai rencontré le même problème en août 2019 sur lequel j'avais posé des questions à ce sujet: Maven n'arrive pas en silence à trouver les tests JUnit à exécuter . Ces réponses m'ont conduit dans la bonne direction, mais j'ai découvert que vous pouvez résoudre le problème de manière encore plus concise. J'ai copié ma solution à partir du exemple du projet Maven de JUnit5 .

A partir de JUnit 5.5.1 et de maven-surefire-plugin 2.22.2, il n'est pas nécessaire d'ajouter la dépendance junit-platform-surefire-provider. Il suffit que cette dépendance et ce plugin soient spécifiés dans votre 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>
0
workerjoe

Dans mon cas, c'était à cause de TestNG dans le classpath ( SUREFIRE-1527 ). Groovy 2.5.5 POM l’a apporté avec le module groovy-testng.

Le fournisseur d'infrastructure de test spécifié manuellement (comme décrit dans https://maven.Apache.org/surefire/maven-surefire-plugin/examples/providers.html ) a résolu le problème:

<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

Une chose que j'ai remarquée, j'ai été capable de le faire fonctionner:

  • Nommer ma classe de test ClinicCalendarShould ne sera pas repris par maven
  • Donner le nom de ma classe de test ClinicCalendarTest EST récupéré par maven

Donc, à moins que je ne manque une configuration, un paramètre ou quoi que ce soit dans le plugin Surefire, vous devez par défaut nommer vos classes de test XXXTest.

0
jkilgrow

La mise à jour vers maven-surefire-plugin:2.20 exécute les tests Junit5 sans problème.

Mais j'utilise la version M6 sur Junit5.

0
LazerBanana

Il y a un numéro en suspens pour surefire 2.20

Cela fonctionne pour moi avec surefire 2.19 + junit-platform- * 1.0.3

0
Alex