with test pom plugin example java maven junit maven-surefire-plugin junit5

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 prueba junit-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.