java - pom - test in maven
Surefire no está recogiendo las pruebas de Junit 5 (11)
Actualización 2
Issue se ha solucionado en Maven Surefire Plugin v2.22.0
La nueva versión está disponible en Maven Central Repository.
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''
Actualizar
Como señaló Marian , la última versión de JUnit 5 Platform Surefire Provider (1.2.0) es compatible con la última versión 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>
Ejemplo
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);
}
}
Salida (instalación limpia mvn)
...
[INFORMACIÓN] --- plugin maven-surefire: 2.21.0 : prueba (prueba predeterminada) @ prueba --- [INFORMACIÓN]
[INFO] ----------------------------------------------- --------
[INFO] PRUEBAS
[INFO] ----------------------------------------------- --------
[INFO] Ejecutando test.TestScenario
[INFO] Pruebas ejecutadas: 1, Fallos: 0, Errores: 0, Saltado: 0, Tiempo transcurrido: 0.005 s - en la prueba. TestScenario
[INFO]
[INFO] Resultados:
[INFO]
[INFORMACIÓN] Pruebas ejecutadas: 1 , Fallos: 0, Errores: 0, Saltado: 0
...
La forma más sencilla hasta hoy:
<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>
Escribí un método de prueba simple con JUnit 5:
public class SimlpeTest {
@Test
@DisplayName("Some description")
void methodName() {
// Testing logic for subject under test
}
}
Pero cuando ejecuto
mvn test
, obtuve:
-------------------------------------------------------
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
De alguna manera, Surefire no reconoció esa clase de prueba.
Mi
pom.xml
ve así:
<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>
¿Alguna idea de cómo hacer que esto funcione?
Actualizando a
maven-surefire-plugin:2.20
ejecuta las pruebas Junit5 sin ningún problema.
Pero estoy usando la versión
M6
en Junit5.
De la documentación de JUnit 5 :
A partir de la versión
2.22.0
, Maven Surefire proporciona soporte nativo para ejecutar pruebas en la plataforma JUnit.
Además, puede leer en la
documentación del
maven-surefire-plugin
:
Usando la plataforma JUnit 5
Para comenzar con JUnit Platform, debe agregar al menos una implementación de
TestEngine
a su proyecto. Por ejemplo, si desea escribir pruebas con Júpiter, agregue el artefacto de pruebajunit-jupiter-engine
a las dependencias en POM
Entonces, eso es suficiente para ejecutar las pruebas 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>
En mi espacio de GitHub, agregué un proyecto de muestra de trabajo de Maven que puedes explorar / clonar.
URL:
https://github.com/ebundy/junit5-minimal-maven-project
El
maven-surefire-plugin
, a partir de hoy,
no tiene soporte completo de JUnit 5
.
Hay un problema abierto acerca de agregar este soporte en
SUREFIRE-1206
.
Como tal, debe usar un
proveedor personalizado
.
Uno ya ha sido desarrollado por el equipo JUnit;
de la
guía
del
usuario
, debe agregar el
junit-platform-surefire-provider
provider y la implementación de
TestEngine
para la nueva 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>
Además, asegúrese de declarar la
junit-jupiter-api
con un alcance de
test
:
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
En mi caso, esto se debió a TestNG en el classpath (
SUREFIRE-1527
).
Groovy 2.5.5 POM lo ha traído con el módulo
groovy-testng
.
El proveedor de marco de prueba especificado manualmente (como se describe en https://maven.apache.org/surefire/maven-surefire-plugin/examples/providers.html ) resolvió el 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>
Me encontré con el mismo problema en agosto de 2019 que pregunté aquí: Maven no puede encontrar silenciosamente las pruebas JUnit para ejecutar . Estas respuestas me llevaron en la dirección correcta, pero descubrí que puede resolver el problema de manera aún más concisa. Copié mi solución del proyecto Maven de muestra JUnit5 .
A partir de JUnit 5.5.1 y
maven-surefire-plugin
2.22.2, no es necesario agregar la dependencia de
junit-platform-surefire-provider
.
Es suficiente tener esta dependencia y un complemento especificado en su
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>
Me encontré con este problema con JUnit5 y Maven, pero también noté que, incluso si solo se agregara junit-jupiter-engine como dependencia, las pruebas se ejecutarían en algunos proyectos, no en otros . Y veo el mismo patrón en los comentarios aquí: en el comentario de @Alex arriba puedes ver que no tiene ningún problema, incluso con versiones anteriores de surefire / junit / platform.
Después de rascarme la cabeza por un tiempo, me di cuenta de que aquellos proyectos donde las pruebas no se ejecutarían eran aquellos en los que los nombres de los métodos de prueba no contenían la palabra "prueba". Aunque esto no es obligatorio por http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
En otras palabras: solo con
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0</version>
<scope>test</scope>
</dependency>
esta
@Test
public void something() {
assertTrue(true);
}
NO se ejecutará, mientras que
@Test
public void testSomething() {
assertTrue(true);
}
Se ejecutará!
Este problema se desarrolla como una muñeca rusa ...
De todos modos, ¡+1 para @Mikhail Kholodkov cuya respuesta actualizada soluciona todos los problemas a la vez!
Solo para complementar, surefire 2.22.0 + junit 5.2.0 + platform 1.2.0 también funciona. Se adjunta un pompón de trabajo para su referencia:
<?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>
Tuve un problema similar que también hizo que Surefire reconociera cero pruebas.
Mi problema resultó estar relacionado con lo siguiente (de la documentación de junit.org/junit5/docs/current/user-guide/… ):
Debido a una pérdida de memoria en Surefire 2.20 y problemas que se ejecutan en Java 9, el proveedor junit-platform-surefire-actualmente solo funciona con Surefire 2.19.1.
Estaba tratando de usar las últimas versiones de Surefire (2.21.0) y junit-platform-surefire-provider (1.1.0), y no funcionó (ni en Java 8 ni 9)
Volver a Surefire 2.19.1 resolvió mi problema.
De acuerdo con este problema , se incluirá una solución en la versión 1.2.0 del proveedor junit-platform-surefire-provider (actualmente disponible solo como SNAPSHOT).
Una cosa que noté fue que pude hacerlo funcionar:
-
Nombrar mi clase de examen
ClinicCalendarShould
no es recogido por maven -
Nombrar mi clase de examen
ClinicCalendarTest
recogido por maven
Entonces, a menos que me falte algún tipo de configuración o parámetro o lo que sea en el complemento infalible, por defecto, debe nombrar sus clases de prueba XXXTest.
Hay un problema abierto para surefire 2.20
Me está funcionando con surfire 2.19 + junit-platform- * 1.0.3