¿Cómo hago para que se ejecuten mis pruebas de integración de Maven?

170

Tengo un proyecto de módulo múltiple maven2 y en cada uno de mis módulos secundarios tengo pruebas JUnit que se nombran Test.javay Integration.javapara pruebas unitarias y pruebas de integración respectivamente. Cuando ejecuto:

mvn test

*Test.javaSe ejecutan todas las pruebas JUnit dentro de los módulos secundarios. Cuando ejecuto

mvn test -Dtest=**/*Integration

ninguna de las Integration.javapruebas se ejecuta dentro de los módulos secundarios.

Estos parecen ser exactamente el mismo comando para mí, pero el que tiene -Dtest = / * Integration ** no funciona, muestra 0 pruebas que se ejecutan en el nivel principal, que no hay ninguna prueba

Peter Delaney
fuente
44
La respuesta de Kief debería ser la aceptada, ya que es el estándar actual para definir las pruebas de integración en Maven.
heenenee

Respuestas:

110

Puede configurar Surefire de Maven 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 el patrón de una prueba de integración. Luego 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>
serg10
fuente
1
Configuré esto como dijiste y solo se ejecutarán los archivos * Test, no * Integration.java al ejecutar: mvn install Necesito ejecutar mi * Test.java como predeterminado, pero para mi compilación nocturna necesito ejecutar ambos * Test .java e * Integration.java. Tengo que ejecutar mvn install, luego cd en cada directorio secundario y ejecutar mvn -Dtest = ** / * Prueba de integración
Peter Delaney
66
Debe usar el complemento a prueba de fallos para las pruebas de integración, no el complemento seguro. No dejará la acumulación hasta después de la fase de post-integración es completa; lo que le permite eliminar recursos de prueba (un servidor web, por ejemplo) antes de que falle la compilación. Por lo tanto, a prueba de fallos.
John Gordon
para mí, como parte de la fase de preintegración, se inicia el servidor de embarcadero. La última línea de registro es: [INFO] inició Jetty Server. Después de eso, no pasa nada. Se atasca. El complemento a prueba de fallos maven surefire no ejecuta pruebas ni el servidor del muelle se detiene. ¿Alguna idea de lo que está mal? Estoy usando la misma configuración especificada por usted.
Tarun Kumar el
66
Esta respuesta está muy desactualizada y debe actualizarse o eliminarse.
Zac Thompson
¿Alguna ayuda con este? stackoverflow.com/questions/48639730/…
Rohit Barnwal
250

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 verificar", "mvn install" o "mvn deploy", las pruebas de integración se ejecutarán en el camino.

Por defecto, la integración de la prueba se ejecuta clases de prueba mencionados **/IT*.java, **/*IT.javay **/*ITCase.java, pero esto se puede configurar.

Para obtener detalles sobre cómo conectar todo esto, consulte el complemento Failsafe , la página de uso de Failsafe (no está correctamente vinculada desde la página anterior mientras escribo esto), y también consulte esta publicación del blog de Sonatype .

Encanto
fuente
1
@WillV Correcto. El cementerio de Codehaus. Y el complemento maven-failsafe está en Apache ahora. Lo siento. :)
Jin Kwon
38
Por defecto, mvn integration-testtambién ejecuta pruebas unitarias (usando via surefire) pero mvn failsafe:integration-testsolo ejecuta las pruebas de integración a prueba de fallas.
Shadow Man
22
Increíblemente, la documentación del complemento Failsafe, la página de uso y las preguntas frecuentes no mencionan que ejecuta clases de prueba llamadas * / IT .java, ** / * IT.java y ** / * ITCase.java ...
Henno Vermeulen
1
Si se ejecuta después de la packagefase, eso significa que debería poner todo mi código fuente de Java IT en src/main/javalugar de src/test/java¿correcto?
Bruce Sun
55
@HennoVermeulen También estaba confundido sobre qué nombrar las pruebas. Se describe en Inclusiones y exclusiones de pruebas . Es bueno que los valores predeterminados se puedan anular, pero sería bueno que mencionen los valores predeterminados anteriormente.
Joshua Taylor el
63

He hecho EXACTAMENTE lo que quieres hacer y funciona muy bien. Las pruebas unitarias "* Pruebas" siempre se ejecutan, y "* IntegrationTests" solo se ejecutan cuando se realiza una verificación o instalación de mvn. Aquí está el fragmento de mi POM. serg10 casi lo hizo bien ... 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!

HDave
fuente
Exactamente lo que intenté hacer, pero mis pruebas de integración se mantuvieron ejecutándose durante la fase de prueba mvn, ya que NO SALTÉ LA PREDETERMINADA. Pensé que configurar la ejecución de la prueba lo anularía. Como explicaste, solo agrega una nueva ejecución (por lo tanto, todo se ejecutará dos veces). Entonces, para mí, el salto era una pieza faltante. +1 Como esta configuración responde la pregunta al 100%
Nils Schmidt
2
¡Entonces siéntase libre de marcar la casilla para que esta respuesta sea la respuesta!
HDave
para mí, como parte de la fase de preintegración, se inicia el servidor de embarcadero. La última línea de registro es: [INFO] inició Jetty Server. Después de eso, no pasa nada. Se atasca. El complemento a prueba de fallos maven surefire no ejecuta pruebas ni el servidor del muelle se detiene. ¿Alguna idea de lo que está mal? Estoy usando la misma configuración especificada por usted.
Tarun Kumar el
@Tarun - haz una nueva pregunta sobre tu problema
HDave
2
Esta debería ser la respuesta aceptada. El objetivo asociado de Maven es: clean compile integration-test -Dmaven.test.failure.ignore=false
Neill Lima
31

Puede dividirlos muy fácilmente usando las categorías JUnit y Maven.
Esto se muestra muy, muy brevemente a continuación dividiendo 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 utilizará para marcar todas las pruebas que desea ejecutar 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 su nueva interfaz.

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

Configurar las pruebas de la unidad Maven

La belleza de esta solución es que nada cambia realmente para el lado de las pruebas unitarias.
Simplemente agregamos un poco de 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 haces un mvn clean test, solo se ejecutarán las pruebas unitarias sin marcar.

Configurar las pruebas de integración de Maven

Nuevamente, la configuración para esto es muy simple.
Utilizamos el complemento a prueba de fallos estándar y lo configuramos para ejecutar solo 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 fallos durante la fase de prueba de integración de la compilación.

Ahora puedes hacer un mvn clean install.
Esta vez, además de las pruebas unitarias en ejecución, las pruebas de integración se ejecutan durante la fase de prueba de integración.

John Dobie
fuente
Pensé que JUnit no tiene más secretos para mí. ¡Buen lugar!
gertas
44
Esto solo funciona si la interfaz de marcador ya existe en algún lugar disponible para Maven. No funciona si su interfaz de marcador existe en otro módulo de la misma compilación de varios módulos.
EngineerBetter_DJ
@EngineerBetter_DJ, ¿qué quieres decir con eso? ¿No puede hacer eso si tiene una configuración maven basada en múltiples proyectos?
matthieusb
16

Deberías intentar usar el complemento maven failsafe . Puede decirle que incluya un cierto conjunto de pruebas.

James Kingsbery
fuente
1
+1 Esto es lo que uso. Funciona bien y le permite realizar la configuración previa / posterior, como iniciar y cerrar un contenedor de servlet local.
mdma
maven-failsafe-pluginha ido a Plugin Graveyard
Jin Kwon el
9
La página del cementerio solo dice que el failsafecomplemento ha sido movido maven-failsafe-plugin. Parece que maven-failsafe-plugintodavía está activo (los documentos se enviaron por última vez en marzo de 2014).
James Kingsbery
13

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 funcionará.

Alternativamente, puede cambiar la configuración de Maven para incluir ese archivo, pero probablemente sea más fácil y mejor solo nombrar sus pruebas SomethingTest.

De inclusiones y exclusiones de pruebas :

Por defecto, el complemento Surefire incluirá automáticamente todas las clases de prueba con los siguientes patrones comodín:

  • \*\*/Test\*.java - incluye todo su subdirectorio y todos los nombres de archivo java que comienzan con "Prueba".
  • \*\*/\*Test.java - incluye todo su subdirectorio y todos los nombres de archivo java que terminan con "Prueba".
  • \*\*/\*TestCase.java - incluye todo su subdirectorio y todos los nombres de archivo 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.

cletus
fuente
Hola y gracias. Tengo dos tipos de pruebas normales de POJO Junit llamadas SomethingTest.java que se disparan. También tengo pruebas de integración llamadas SomethingIntegration.java que no se disparan. SomethingTest.java se activa a través de mvn test o mvn install. Las segundas pruebas no se despiden. mvn test -Dtest = ** / * Integración
Peter Delaney
.. y por "Maven solo ejecuta pruebas que tienen Test en algún lugar del nombre de la clase" quiere decir "el complemento seguro Maven solo ejecuta pruebas que tienen Test en algún lugar del nombre de la clase".
Joshua Davis
1
No es "en algún lugar del nombre de la clase" es "el nombre de la clase termina con Prueba", por ejemplo, MyTest funciona pero MyTests no lo hace
Julian
10

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 especificó anteriormente, las pruebas de integración serán ignoradas. La ejecución de 'mvn clean install -P Integration-tests' incluirá las pruebas de integración (también ignoro mis pruebas de integración por etapas). Además, tengo un servidor CI que ejecuta mis pruebas de integración todas las noches y para eso emito el comando 'mvn test -P Integration-tests' .

Jorge
fuente
1
¿Por qué no usarías la fase de prueba de integración? Los perfiles se pueden usar para cosas como pruebas de integración contra varios servidores de aplicaciones, etc. como lo hace Arquillian. No soy un experto en Maven, pero creo que los expertos podrían decir que esto no es muy 'Maven-y'.
Joshua Davis
1
@Joshua Creo que lo hago de esta manera porque mis pruebas de integración tardan al menos 5 minutos en ejecutarse y emito 'mvn clean install' muchas veces al día porque necesito actualizar mis artefactos en mi repositorio local de Maven. Según lo que la gente dice anteriormente, ejecutar 'instalar' hará que se ejecute la fase de prueba de integración, lo que me hará perder un valioso tiempo de desarrollador.
Jorge
Hmm ... no estoy seguro acerca de 'instalar' ejecutando prueba de integración. En cualquier caso, todavía usaría la fase en lugar de un perfil. Es mejor utilizar los perfiles para cosas como admitir diferentes servidores de aplicaciones, etc.
Joshua Davis
1
Seguiré jugando con eso entonces. ¡Gracias por el consejo!
Jorge
@jorge Supongo que el objetivo correcto para usar aquí sería verificar, ¿verdad?
Kilokahn
1

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, usa este comando:

mvn install -DskipTests=false
Dherik
fuente
0

Debe usar el complemento maven surefire para ejecutar pruebas unitarias y el complemento maven failsafe para ejecutar pruebas de integración.

Siga a continuación si desea alternar la ejecución de estas pruebas con banderas.

Configuración Maven

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipUnitTests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <skipTests>${skipIntegrationTests}</skipTests>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <properties>
            <skipTests>false</skipTests>
            <skipUnitTests>${skipTests}</skipUnitTests>
            <skipIntegrationTests>${skipTests}</skipIntegrationTests>
        </properties>

Por lo tanto, las pruebas se omitirán o cambiarán de acuerdo con las siguientes reglas de bandera:

Las pruebas se pueden omitir con los siguientes indicadores:

  • -DskipTests omite las pruebas unitarias y de integración
  • -DskipUnitTests omite pruebas unitarias pero ejecuta pruebas de integración
  • -DskipIntegrationTests se saltea las pruebas de integración pero ejecuta pruebas unitarias

Ejecutando pruebas

Ejecute a continuación para ejecutar solo pruebas unitarias

mvn clean test

Puede ejecutar el siguiente comando para ejecutar las pruebas (tanto la unidad como la integración)

mvn clean verify

Para ejecutar solo pruebas de integración, siga

mvn failsafe:integration-test

O saltear pruebas unitarias

mvn clean install -DskipUnitTests

Además, para omitir las pruebas de integración durante mvn install, siga

mvn clean install -DskipIntegrationTests

Puedes saltarte todas las pruebas usando

mvn clean install -DskipTests
Liquidpie
fuente