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?
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>
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'
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>
À 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 testjunit-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
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!
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>
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).
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>
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>
Une chose que j'ai remarquée, j'ai été capable de le faire fonctionner:
ClinicCalendarShould
ne sera pas repris par mavenClinicCalendarTest
EST récupéré par mavenDonc, à 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.
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.
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