java - run - mvn test config
¿Cómo puedo hacer que se ejecuten mis pruebas de integración de Maven? (8)
Tengo un proyecto multi-módulo maven2 y en cada uno de mis módulos hijos tengo pruebas JUnit que se llaman Test.java
e Integration.java
para pruebas unitarias y pruebas de integración, respectivamente. Cuando ejecuto:
mvn test
todas las pruebas de JUnit *Test.java
dentro de los módulos secundarios se ejecutan. Cuando ejecuto
mvn test -Dtest=**/*Integration
ninguna de las pruebas de Integration.java
se ejecuta dentro de los módulos secundarios.
Me parecen exactamente el mismo comando, pero el que tiene -Dtest = / * Integration ** no funciona, muestra 0 pruebas que se ejecutan en el nivel principal, que no hay ninguna prueba
Debería intentar usar el complemento maven failsafe . Puede indicarle que incluya un cierto conjunto de pruebas.
El ciclo de vida de construcción de Maven ahora incluye la fase de "prueba de integración" para ejecutar pruebas de integración, que se ejecutan por separado de las pruebas unitarias ejecutadas durante la fase de "prueba". Se ejecuta después de "paquete", por lo que si ejecuta "mvn verify", "mvn install" o "mvn deploy", las pruebas de integración se ejecutarán en el camino.
De forma predeterminada, la prueba de integración ejecuta clases de prueba denominadas **/IT*.java
, **/*IT.java
y **/*ITCase.java
, pero esto se puede configurar.
Para obtener detalles sobre cómo conectar todo esto, consulte el plugin Failsafe , la página de uso de Failsafe (no vinculado correctamente desde la página anterior mientras escribo esto), y también consulte esta publicación de Sonatype en el blog .
He hecho EXACTAMENTE lo que quieres hacer y funciona muy bien. Las pruebas unitarias "* Tests" siempre se ejecutan, y "* IntegrationTests" solo se ejecutan cuando se realiza una mvn verify o mvn install. Aquí está el fragmento de mi POM. serg10 casi tenía razón ... pero no del todo.
<plugin>
<!-- Separates the unit tests from the integration tests. -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
<skip>true</skip>
<!-- Show 100% of the lines from the stack trace (doesn''t work) -->
<trimStackTrace>false</trimStackTrace>
</configuration>
<executions>
<execution>
<id>unit-tests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<!-- Never skip running the tests when the test phase is invoked -->
<skip>false</skip>
<includes>
<!-- Include unit tests within integration-test phase. -->
<include>**/*Tests.java</include>
</includes>
<excludes>
<!-- Exclude integration tests within (unit) test phase. -->
<exclude>**/*IntegrationTests.java</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<!-- Never skip running the tests when the integration-test phase is invoked -->
<skip>false</skip>
<includes>
<!-- Include integration tests within integration-test phase. -->
<include>**/*IntegrationTests.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
¡Buena suerte!
Otra forma de ejecutar pruebas de integración con Maven es hacer uso de la función de perfil:
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/*IntegrationTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>integration-tests</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*IntegrationTest.java</include>
</includes>
<excludes>
<exclude>**/*StagingIntegrationTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
...
Al ejecutar ''mvn clean install'' se ejecutará la compilación predeterminada. Como se especifica arriba, las pruebas de integración serán ignoradas. Ejecutar ''mvn clean install -P integration-tests'' incluirá las pruebas de integración (también ignoro mis pruebas de integración de etapas). Además, tengo un servidor de CI que ejecuta mis pruebas de integración todas las noches y para eso expido el comando ''mvn test -P integration-tests'' .
Por defecto, Maven solo ejecuta pruebas que tienen Test en algún lugar del nombre de la clase.
Cambie el nombre a IntegrationTest y probablemente funcione.
Alternativamente, puede cambiar la configuración de Maven para incluir ese archivo, pero probablemente sea más fácil y mejor simplemente nombrar sus pruebas SomethingTest.
De inclusiones y exclusiones de pruebas :
De forma predeterminada, el complemento Surefire incluirá automáticamente todas las clases de prueba con los siguientes patrones comodín:
- "** / Test * .java": incluye todos sus subdirectorios y todos los nombres de archivo de Java que comienzan con "Prueba".
- "** / * Test.java": incluye todos sus subdirectorios y todos los nombres de archivo de Java que terminan con "Prueba".
- "** / * TestCase.java" - incluye todos sus subdirectorios y todos los nombres de archivo de Java que terminan con "TestCase".
Si las clases de prueba no van con la convención de nomenclatura, configure Surefire Plugin y especifique las pruebas que desea incluir.
Puede configurar Maven''s Surefire para ejecutar pruebas unitarias y pruebas de integración por separado. En la fase de prueba unitaria estándar, ejecuta todo lo que no coincide con una prueba de integración. A continuación, crea una segunda fase de prueba que ejecuta solo las pruebas de integración.
Aquí hay un ejemplo:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/*IntegrationTest.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>test</goal>
</goals>
<phase>integration-test</phase>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/*IntegrationTest.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
Puede dividirlos muy fácilmente utilizando las categorías JUnit y Maven.
Esto se muestra muy, muy brevemente a continuación mediante la división de la unidad y las pruebas de integración.
Definir una interfaz de marcador
El primer paso para agrupar una prueba usando categorías es crear una interfaz de marcador.Esta interfaz se usará para marcar todas las pruebas que desea que se ejecuten como pruebas de integración.
public interface IntegrationTest {}
Marque sus clases de prueba
Agregue la anotación de categoría a la parte superior de su clase de prueba. Toma el nombre de tu nueva interfaz.
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
Configurar pruebas de unidad Maven
La belleza de esta solución es que nada realmente cambia para el lado de la prueba de unidad.Simplemente agregamos alguna configuración al plugin maven surefire para que ignore cualquier prueba de integración.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<excludedGroups>
com.test.annotation.type.IntegrationTest
</excludedGroups>
</configuration>
</plugin>
Cuando realice una prueba de limpieza de mvn, solo se ejecutarán las pruebas de la unidad sin marcar.
Configurar las pruebas de integración de Maven
De nuevo, la configuración para esto es muy simple.Usamos el plugin failsafe estándar y lo configuramos solo para ejecutar las pruebas de integración.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<groups>
com.test.annotation.type.IntegrationTest
</groups>
</configuration>
</plugin>
La configuración utiliza un objetivo de ejecución estándar para ejecutar el complemento a prueba de fallas durante la fase de prueba de integración de la compilación.
Ahora puede hacer una instalación limpia de mvn
Esta vez, así como las pruebas unitarias en ejecución, las pruebas de integración se ejecutan durante la fase de prueba de integración.
Puede seguir la documentación de maven para ejecutar las pruebas unitarias con la compilación y ejecutar las pruebas de integración por separado.
<project>
<properties>
<skipTests>true</skipTests>
</properties>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<skipITs>${skipTests}</skipITs>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
Esto le permitirá ejecutar con todas las pruebas de integración deshabilitadas de forma predeterminada. Para ejecutarlos, use este comando:
mvn install -DskipTests=false