Surefire ne reprend pas les tests Junit 5

113

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 cours 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, infaillible n'a pas reconnu cette classe de test. Mon pom.xmlressemble à:

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

Ali Dehghani
la source
1
Pour l'instant, vous devez utiliser une implémentation spéciale du plugin surefire. Consultez les exemples de l'équipe junit ici
jah
1
La question est basée sur une version obsolète mais cette réponse est basée sur la version actuelle (en décembre 2016).
Nicolai
@Nicolai Merci d'avoir mis à jour la réponse. Quoi qu'il en soit, j'apprécierais votre modification sur la question, si vous avez le temps.
Ali Dehghani
1
Cette erreur ne se produit plus comme ça. Le cas le plus probable d'un manque d'exécution de test est couvert par cette question .
Nicolai
Assurez-vous que les fichiers de test sont au bon endroit. Par défaut, le test doit être un frère de main dans le dossier src.
Joe Bowbeer

Réponses:

115

Le maven-surefire-plugin, à ce jour, ne prend pas entièrement en charge JUnit 5 . L'ajout de cette prise en charge dans SUREFIRE-1206 pose problème .

En tant que tel, vous devez utiliser un fournisseur personnalisé . L'un a déjà été développé par l'équipe JUnit; à partir du guide de l' utilisateur , vous devez ajouter le junit-platform-surefire-providerfournisseur et l' TestEngineimplémentation de 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 junit-jupiter-apidépendance avec une portée de test:

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.0.3</version>
    <scope>test</scope>
  </dependency>
</dependencies>
Tunaki
la source
25
Il convient de noter qu'à l'heure actuelle, surefire 2.20.1 ne fonctionne pas avec le fournisseur junit 5, donc la version 2.19.1 utilisée dans l'échantillon est toujours valide malgré l'année écoulée.
splatch
1
surefire 2.21.0 ne fonctionne pas aussi, doit revenir à 2.19.1
valodzka
@valodzka Pour moi, cela fonctionne avec la 2.21.0 et les versions plus récentes du plugin et junit5. Voir junit.org/junit5/docs/current/user-guide/…
Thirler
Vérifié: maven-surefire-plugin v2.21.0fonctionne bien avec junit-jupiter-engine v5.2.0et junit-platform-surefire-provider v1.2.0
povis
2
Cette configuration échouera avec Surefire 2.22.0 ou supérieur. Vous devez exclure les deps Junit de la configuration Surefire. J'ai écrit un article rapide à ce sujet ici - springframework.guru
John Thompson
51

Mise à jour 2

Le problème a été résolu dans Maven Surefire Plugin v2.22.0

Une nouvelle version est 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 l'a souligné, la dernière version de JUnit 5 Platform Surefire Provider (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);
    }
}

Sortie (installation propre mvn)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : test (test par défaut) @ test --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] TESTS
[INFO] - -------------------------------------------------- ---
[INFO] Exécution de test.TestScenario
[INFO] Tests exécutés: 1, Echecs: 0, Erreurs: 0, Ignoré: 0, Temps écoulé: 0,005 s - en test.TestScenario
[INFO]
[INFO] Résultats:
[INFO ]
[INFO] Tests exécutés: 1 , échecs: 0, erreurs: 0, ignorés: 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>
Mikhail Kholodkov
la source
1
Cela ne fonctionne que grâce à Test au nom de la classe. Renommez la classe en ExampleScenario - elle ne sera pas découverte. (Surefire 2.22.0)
Alexei Vinogradov
@AlexeiVinogradov Oui. C'est un comportement attendu. Plus d'informations disponibles ici: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov
bevare, version du moteur junit par rapport à la version parent de démarrage à ressort. Spécifiez simplement la dépendance junit-jupiter-engine: 5.1 ne fonctionne pas là où les versions plus récentes fonctionnent. Spring Boot a toujours préconfiguré JUnit4 <junit.version> 4.13.
Wooff
20

À partir de la documentation JUnit 5 :

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

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

Utilisation de la plate-forme JUnit 5

Pour démarrer avec JUnit Platform, vous devez ajouter au moins une seule TestEngineimplémentation à votre projet. Par exemple, si vous souhaitez écrire des tests avec Jupiter, ajoutez l'artefact de test junit-jupiter-engine aux dépendances dans POM

Cela suffit donc pour 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 fonctionnel que vous pouvez parcourir / cloner.
URL: https://github.com/ebundy/junit5-minimal-maven-project

davidxxx
la source
9

J'ai rencontré ce problème avec JUnit5 et Maven, mais j'ai également remarqué que, même si seul junit-jupiter-engine était ajouté en tant que dépendance, les tests s'exécuteraient sur certains projets, pas 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 antérieures de surefire / junit / platform.

Après m'être gratté la tête pendant un certain temps, j'ai réalisé que les projets où les tests ne seraient pas exécutés étaient ceux où les noms des méthodes de tests ne contenaient pas 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 exécuté!

Ce numéro 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 à la fois!

Fabien M
la source
Je viens également de rencontrer un problème avec mvn 3.5.0, jdk 1.8.0_101 où mon nom de classe n'avait pas «Test» et le test n'a pas été repris, cela m'a aidé à le trouver!
dann.dev
Oui, en effet, vous devriez être conforme à maven.apache.org/surefire/maven-surefire-plugin/examples/ ... Mais je parlais de quelque chose de différent.
Fabien M
Oui, il s'est avéré que j'avais deux problèmes, le premier était de ne pas me souvenir des règles de base du test infaillible maven. Le second ne faisait pas de projet de mise à jour Maven> pour eclipse afin de récupérer le lanceur junit 5.
dann.dev
Je voudrais ajouter que la classe et les méthodes doivent être publiques.
Jónás Balázs le
6

J'ai rencontré le même problème en août 2019 que j'ai posé ici: Maven échoue silencieusement à trouver les tests JUnit à exécuter . Ces réponses m'ont conduit dans la bonne direction, mais j'ai trouvé que vous pouviez résoudre le problème de manière encore plus concise. J'ai copié ma solution à partir de l' exemple de projet Maven JUnit5 .

À partir de JUnit 5.5.1 et maven-surefire-plugin2.22.2, vous n'avez pas besoin d'ajouter la junit-platform-surefire-providerdépendance. Il suffit d'avoir cette dépendance et un plugin 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>
workerjoe
la source
C'est l'approche correcte et concise. Fonctionne avec OpenJDK 11 et JUnit 5.6.2.
argent
5

Juste pour compléter, surefire 2.22.0 + junit 5.2.0 + plate-forme 1.2.0 fonctionne également. Ci-joint un pom de travail pour votre référence:

    <?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
la source
Mon problème était que je n'avais pas junit-vintage-enginede dépendance, et tous mes tests ont été écrits pour JUnit 4.
Mark
la combinaison de versions junit, plate-forme et infaillible spécifiées a fonctionné pour moi. Merci !
CoderTR
4

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

Le fournisseur de cadre de test spécifié manuellement (tel qu'il est décrit sur 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>
Lu55
la source
Vous devez encapsuler le <dependency>dans <dependencies>dans votre exemple de code.
user1053510
1

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

Mon problème s'est avéré être lié à ce qui suit (à partir de la documentation JUnit 5.1.0 / maven ):

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

J'essayais d'utiliser les dernières versions de Surefire (2.21.0) et 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-provider (actuellement disponible en tant qu'INSTANTANÉ uniquement).

avandeursen
la source
1
J'ai essayé les SNAPSHOTs et tout fonctionne (avec Surefire 2.21.0). Espérons que cela fonctionne toujours au moment de la sortie.
user7610
1

Une chose que j'ai remarquée que j'ai pu le faire fonctionner:

  • Nommer ma classe de test ClinicCalendarShouldn'est pas repris par maven
  • Nommer ma classe de test ClinicCalendarTestest pris en charge par maven

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

jkilgrow
la source
0

Mise à jour vers maven-surefire-plugin:2.20 exécuter les tests Junit5 sans problème.

Mais j'utilise la M6version sur Junit5.

LazerBanana
la source
Pas si simple (du moins pour le moment). Voir le guide de l'utilisateur de JUnit 5
FrVaBe
@FrVaBe bizarre son fonctionne très bien sur le mien avec la version m6.
LazerBanana
2
J'ai fatigué surefire-2.20.1 + junit-5.0.2 et cela n'a pas fonctionné. J'ai aussi essayé surefire-2.20.1 + junit-5.1.0-M6 et cela n'a pas fonctionné
Eric
0

Dans mon cas, le plugin infaillible n'a pas obtenu la version correcte du moteur jupiter / api. Et c'était même si vous exécutiez Maven 3.6.1 et surefireplugin Version 2.22.2!

Maintenant, ma configuration du plugin surefire ressemble à:

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

De plus, j'ai dû forcer ces versions:

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

On dirait que 5.5.2 était lié à la mauvaise version de plate-forme 1.3.2 au lieu de 1.5.2 dans mon cas.

Tous les tests JUnit5 sont récupérés maintenant. Même avec la version 2.22.0 du plugin infaillible, ce n'était pas le cas pour moi!

J'espère que cela pourra aider...

Poignard
la source
0

J'étais confronté au même problème junit5et les maven-surefiretests échouaient. Cependant junit4fonctionnait bien. La combinaison ci-dessous a fonctionné pour moi, je n'ajoute pas la gestion des versions. À utiliser junit-bompour la gestion des dépendances. En utilisantspring-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>

Assurez-vous de passer à la dernière version d'Eclipse

garg10may
la source