Surefire no está recogiendo las pruebas de Junit 5

113

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 corro mvn test, tengo:

-------------------------------------------------------
 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.xmlapariencia es:

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

Ali Dehghani
fuente
1
Ahora mismo tienes que usar una implementación especial del complemento surefire. Vea los ejemplos del equipo de junit aquí
jah
1
La pregunta se basa en una versión desactualizada, pero esta respuesta se basa en la actual (a diciembre de 2016).
Nicolai
@Nicolai Gracias por actualizar la respuesta. De todos modos, agradecería su edición de la pregunta, si tiene tiempo.
Ali Dehghani
1
Este error ya no ocurre así. Esta pregunta cubre el caso más probable de falta de ejecución de la prueba .
Nicolai
Asegúrese de que los archivos de prueba estén en el lugar correcto. De forma predeterminada, la prueba debe ser hermana de main en la carpeta src.
Joe Bowbeer

Respuestas:

115

El maven-surefire-plugin, a día de hoy, no tiene soporte completo de JUnit 5 . Hay un problema abierto sobre la adición de este soporte en SUREFIRE-1206 .

Como tal, debe utilizar un proveedor personalizado . Uno ya ha sido desarrollado por el equipo de JUnit; de la guía del usuario , debe agregar el junit-platform-surefire-providerproveedor y la TestEngineimplementación de 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-apidependencia 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>
Atún
fuente
25
Vale la pena señalar que en este momento surefire 2.20.1 no funciona con el proveedor junit 5, por lo que 2.19.1 utilizado en la muestra sigue siendo válido a pesar del año pasado.
splatch
1
surefire 2.21.0 no funciona también, tiene que
retroceder a 2.19.1
@valodzka Para mí, funciona con 2.21.0 y versiones más recientes del complemento y junit5. Ver junit.org/junit5/docs/current/user-guide/…
Thirler
Verificado: maven-surefire-plugin v2.21.0funciona bien con junit-jupiter-engine v5.2.0y junit-platform-surefire-provider v1.2.0
povis
2
Esta configuración fallará con Surefire 2.22.0 o superior. Debe excluir los departamentos de Junit de la configuración de Surefire. Escribí una publicación rápida al respecto aquí: springframework.guru/…
John Thompson
51

Actualización 2

El problema 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 de mvn)

...
[INFO] --- maven-surefire-plugin: 2.21.0 : prueba (prueba predeterminada) @ prueba --- [INFO]
[INFO] -------------- -----------------------------------------
[INFO] PRUEBAS
[INFO] - -------------------------------------------------- ---
[INFO] Ejecutando prueba.TestScenario
[INFO] Pruebas ejecutadas: 1, Fallos: 0, Errores: 0, Omitidos: 0, Tiempo transcurrido: 0.005 s - en prueba.TestScenario
[INFO]
[INFO] Resultados:
[INFO ]
[INFO] Pruebas ejecutadas: 1 , Fallos: 0, Errores: 0, Omitidos: 0
...


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>
Mikhail Kholodkov
fuente
1
Esto solo funciona debido a Test en el nombre de la clase. Cambie el nombre de la clase a ExampleScenario; no se descubrirá. (Surefire 2.22.0)
Alexei Vinogradov
@AlexeiVinogradov Sí. Es el comportamiento esperado. Más información disponible aquí: stackoverflow.com/a/6178629/3523579
Mikhail Kholodkov
bevare, versión del motor junit frente a la versión principal de Spring Boot. Simplemente especifique la dependencia junit-jupiter-engine: 5.1 no funciona donde lo hace la versión más reciente. Spring boot todavía tiene JUnit4 <junit.version> 4.13 preconfigurado.
Wooff
20

De la documentación de JUnit 5 :

Comenzando con la versión 2.22.0, Maven Surefire proporciona soporte nativo para ejecutar pruebas en la plataforma JUnit.

Además puedes leer en la maven-surefire-plugindocumentación :

Usando la plataforma JUnit 5

Para comenzar con la plataforma JUnit, debe agregar al menos una TestEngineimplementación única a su proyecto. Por ejemplo, si desea escribir pruebas con Jupiter, agregue el artefacto de prueba junit-jupiter-engine a las dependencias en POM

Así que eso es suficiente para ejecutar las pruebas de 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 maven de muestra en funcionamiento que puede navegar / clonar.
URL: https://github.com/ebundy/junit5-minimal-maven-project

davidxxx
fuente
9

Me encontré con este problema con JUnit5 y Maven, pero también noté que, incluso si solo se agrega 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 anterior, puede ver que no tiene ningún problema, incluso con versiones anteriores de surefire / junit / platform.

Después de rascarme la cabeza durante algún tiempo, me di cuenta de que aquellos proyectos en los que 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!

Fabien M
fuente
También acabo de experimentar un problema con mvn 3.5.0, jdk 1.8.0_101 en el que el nombre de mi clase no tenía 'Prueba' y la prueba no se recogió, ¡esto me ayudó a encontrar eso!
dann.dev
Sí, de hecho, deberías cumplir con maven.apache.org/surefire/maven-surefire-plugin/examples/ ... Pero estaba hablando de algo diferente.
Fabien M
Sí, resultó que tuve dos problemas, el primero fue no recordar las reglas básicas de prueba infalibles de maven. El segundo no estaba haciendo un proyecto de actualización de Maven para que eclipse recogiera el lanzador junit 5.
dann.dev
Me gustaría agregar que la clase y los métodos deben ser públicos.
Jónás Balázs
6

Encontré el mismo problema en agosto de 2019 sobre el que pregunté aquí: Maven silenciosamente no encuentra las pruebas de JUnit para ejecutar . Estas respuestas me llevaron en la dirección correcta, pero descubrí que puedes 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-plugin2.22.2, no es necesario agregar la junit-platform-surefire-providerdependencia. Es suficiente tener esta dependencia y un complemento especificados 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>
trabajador joe
fuente
Este es el enfoque correcto y conciso. Funciona con OpenJDK 11 y JUnit 5.6.2.
plata
5

Solo para complementar, surefire 2.22.0 + junit 5.2.0 + plataforma 1.2.0 también funciona. Se adjunta un pom 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>
schnell18
fuente
Mi problema era que no tenía junit-vintage-engineuna dependencia, y todas mis pruebas se escribieron para JUnit 4.
Mark
la combinación de versiones específicas de junit, plataforma y seguro funcionó para mí. Gracias !
CoderTR
4

En mi caso, esto se debió al TestNG en el classpath ( SUREFIRE-1527 ). Groovy 2.5.5 POM lo ha traído con el groovy-testngmódulo.

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>
Lu55
fuente
Usted debe envolver el <dependency>de <dependencies>en su ejemplo de código.
user1053510
1

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 5.1.0 / maven ):

Debido a una pérdida de memoria en Surefire 2.20 y problemas de ejecución en Java 9, junit-platform-surefire-provider actualmente solo funciona con Surefire 2.19.1.

Estaba intentando 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 en 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 de junit-platform-surefire-provider (actualmente disponible solo como SNAPSHOT).

avandeursen
fuente
1
He probado los SNAPSHOTs y todo está funcionando (con Surefire 2.21.0). Ojalá siga funcionando en el momento del lanzamiento.
user7610
1

Una cosa que noté fue que pude hacer que funcionara:

  • Nombrar mi clase de prueba ClinicCalendarShouldno es recogido por maven
  • Nombrar mi clase de prueba ClinicCalendarTestSI es 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 seguro, de forma predeterminada, debe nombrar sus clases de prueba XXXTest.

jkilgrow
fuente
0

La actualización para maven-surefire-plugin:2.20ejecutar las pruebas de Junit5 sin problemas.

Pero estoy usando la M6versión en Junit5.

LazerBanana
fuente
No es tan simple (al menos por el momento). Consulte la Guía del usuario de JUnit 5
FrVaBe
@FrVaBe raro, funciona bien en el mío con la versión m6.
LazerBanana
2
Me cansé de surefire-2.20.1 + junit-5.0.2 y no funcionó. También probé surefire-2.20.1 + junit-5.1.0-M6 y no funcionó
Eric
0

En mi caso, el complemento seguro no obtuvo la versión correcta en jupiter-engine / api. ¡Y eso fue incluso si ejecuta Maven 3.6.1 y surefireplugin Versión 2.22.2!

Ahora mi configuración de complemento seguro se ve así:

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

Además, tuve que forzar estas versiones:

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

Parece que 5.5.2 estaba vinculado a la versión 1.3.2 de la plataforma incorrecta en lugar de 1.5.2 en mi caso.

Todas las pruebas JUnit5 se recuperan ahora. ¡Incluso con 2.22.0 del complemento infalible, este no fue el caso para mí!

Espero que ayude...

Puñal
fuente
0

Me enfrentaba al mismo problema junit5y las maven-surefirepruebas fallaban. Sin embargo, junit4estaba funcionando bien. La siguiente combinación funcionó para mí, no agrego el control de versiones. Úselo junit-bompara la gestión de dependencias. Utilizandospring-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>

Asegúrese de actualizar a la última versión de eclipse

garg10may
fuente