Evite las pruebas unitarias pero permita las pruebas de integración en Maven

157

Tengo una compilación Maven en la que utilizo el complemento SureFire para ejecutar algunas pruebas unitarias, y el complemento FailSafe para ejecutar algunas pruebas de integración. Me gustaría una forma de ejecutar solo las pruebas del complemento FailSafe.

No es una buena solución para mí agregar diferentes perfiles o cualquier cosa en el pom, porque es una compilación de múltiples módulos y no quiero tener que editar el pom de cada módulo.

Hay skip.testsy maven.test.skipy skipTestsque detienen todas las pruebas, y skipITs, que detiene solo el complemento a prueba de fallos.

Entonces, ¿hay un indicador de línea de comando para Maven skipITs, pero en cambio con la funcionalidad de "onlyITs"?

Matthew Gilliard
fuente
¿Intentaste maven.test.skipo skipTests?
Thomas
1
@khmarbaise en teoría, sí. Pero en la mayoría de los proyectos en los que he trabajado, las "pruebas unitarias" en las que realmente se realizan pruebas de integración con una base de datos en memoria (si tuvo suerte)
Sean Patrick Floyd
9
@khmarbaise Muchas pruebas unitarias. Tardan un par de minutos en ejecutarse y no los necesitamos en esta circunstancia. Específicamente, ejecutamos pruebas unitarias antes de construir el artefacto (por supuesto), pero queremos ejecutar las TI en múltiples entornos. No tiene sentido volver a ejecutar las pruebas unitarias en este punto.
Matthew Gilliard
2
Hola @khmarbaise, en mi configuración skipTestsomite solo las pruebas infalibles, ¡no la prueba a prueba de fallas! Tal vez es una nueva característica?
danidemi
2
FYI: skipTests ahora está en desuso en Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Respuestas:

171

Encontré que la forma más sencilla de omitir solo las pruebas de seguro seguro es configurar el seguro seguro ( pero no a prueba de fallas ) de la siguiente manera:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Esto le permite ejecutar mvn verify -Dskip.surefire.testsy solo seguro, no a prueba de fallas, se omitirán las pruebas; también ejecutará todas las demás fases necesarias, incluidas la preintegración y la posintegración, y también ejecutará el verifyobjetivo que se requiere para fallar realmente su compilación de Maven si sus pruebas de integración fallan.

Tenga en cuenta que esto redefine la propiedad utilizada para especificar que las pruebas se deben omitir, por lo que si proporciona el canónico -DskipTests=true, surefire lo ignorará pero a prueba de fallas lo respetará, lo que puede ser inesperado, especialmente si tiene compilaciones / usuarios existentes que ya especifican ese indicador. Una solución alternativa simple parece ser skip.surefire.testsel valor predeterminado skipTestsen su <properties>sección del pom:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Si lo necesita, podría proporcionar un parámetro análogo llamado skip.failsafe.testsa prueba de fallas, sin embargo, no lo he encontrado necesario, porque las pruebas unitarias generalmente se ejecutan en una fase anterior, y si quiero ejecutar pruebas unitarias pero no pruebas de integración, ejecutaría la testfase en lugar de la verifyfase. ¡Tus experiencias pueden variar!

Estas skip.(surefire|failsafe).testspropiedades probablemente deberían integrarse en el propio código seguro / a prueba de fallas, pero no estoy seguro de cuánto violaría el ethos "son exactamente el mismo complemento, excepto por 1 pequeña diferencia".

bacar
fuente
44
Utilizando esta solución, he podido configurar mi marco de modo que -DskipUnitTests omite el complemento seguro, -DskipIntegrationTests omite el complemento a prueba de fallos y DskipTests omite ambos. ¡Exactamente lo que se necesitaba!
Alex Jansen
2
mi IDE se queja de "no se puede resolver el símbolo 'skipTests'", la solución fue agregar una línea que <skipTests>false</skipTests>aún funciona con cualquier combinación de -DskipTests o -Dskip.surefire.tests ya que los argumentos de la línea de comando parecen sobrescribir las propiedades stackoverflow.com/questions/13708738 / ... es posible que desee agregar eso a su solución
globalworming
<skipTests>${skip.surefire.tests}</skipTests>No funciona con la maven-surefire-pluginversión 3.0.0-M3. Todas las pruebas infalibles siguen ejecutándose. ¿Alguien más encontró esto? Sin embargo, la siguiente solución de Sean Patrick Floyd está funcionando.
John Meyer
120

Una solución alternativa sería llamar a:

mvn clean test-compile failsafe:integration-test

Es cierto que esto es feo, pero puede resolver su problema.


O (otro truco):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Referencia:

Sean Patrick Floyd
fuente
1
La segunda sugerencia funcionó para mí. la prueba de preintegración se llamó con éxito
Lawrence Tierney
77
¿Es esta una buena idea? ¿No resultará esto en que su compilación tenga éxito incluso si sus pruebas de integración fallan? Esa es toda la esencia de failsafe, si no ejecutas también el objetivo de "verificar" . Cita: "El complemento Failsafe no fallará la compilación durante la fase de prueba de integración". ¡Necesita ejecutar el objetivo de verificación para decirle si las pruebas de integración tuvieron éxito o no!
bacar
2
@bacar tiene razón, pero solo use en verifylugar de integration-testen la segunda solución.
Matthew Gilliard
1
En realidad, debería ver la respuesta de @bacar para una solución mucho mejor.
FBB
12
Si agrega failsafe:verifyal final del primer hack ( mvn clean test-compile failsafe:integration-test failsafe:verify) fallará la compilación si falla una de las pruebas de integración.
Shadow Man
73

Estoy usando el código del Blog de Antonio Goncalves , que funciona perfecto.

Puede usar las siguientes propiedades:

-DskipUTs=true para saltear pruebas infalibles.

-DskipITs=true para saltear pruebas a prueba de fallas.

-DskipTests=true para saltear todas las pruebas.

El pom.xmles el siguiente:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>
Martijn Burger
fuente
2
gracias, gran enfoque! también es útil para anular la ejecución predeterminada de surefire (default-test) ver: stackoverflow.com/questions/11935181/…
pls
1
Esta es la razón por la que a veces tiene que desplazarse hacia abajo y buscar una buena solución de trabajo con toda la información requerida. Gracias por compartir
Atul Chaudhary
Realmente una buena solución. Sin embargo, la configuración a prueba de fallos es redundante, como skipITses el valor predeterminado.
timomeinen
SkipITs es una opción personalizada en esta configuración. Tienes razón en la implementación predeterminada, pero esa no era la pregunta de los OP.
Martijn Burger
¡Felicitaciones, eres un gurú experto! Esto debería estar en el superpom maven.
Adam
22

¡Espero que esto ayude!

Intente ejecutar la prueba solo con FailSafe (complemento para prueba de integración; le permitirá ejecutar solo pruebas de integración con este tipo de nombres, de forma predeterminada: * / IT .java, ** / IT.java, * /*ITCase.java ;, pero puede cambiarlo fácilmente desde el archivo pom)

mvn failsafe:integration-test

Y cuando quiera usar solo SureFire (complemento para pruebas unitarias)

mvn surefire:test

o una prueba a la vez con:

mvn -Dtest=MyUnitlTest
Kati Holasz
fuente
9

Me gusta esto para que cada fase se ejecute normalmente:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Jérôme Herry
fuente
1
¡Esta es la solución más fácil (y sinceramente la más brillante)!
Títulos el
no requiere agregar nada en el pom como lo solicitó el OP y ejecuta todas las fases como se indica. gran respuesta.
jnichols959
1

Para ampliar los comentarios de @danidemi y @GuillaumeHusta:

FYI: skipTests ahora está en desuso en Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )

Por lo tanto, para omitir las pruebas unitarias, pero no las pruebas de integración, puede hacerlo si está utilizando la última versión del complemento Failsafe:

mvn verify -DskipTests

(por favor dale un voto positivo a los comentarios mencionados si esto te ayuda)

meustrus
fuente
-3

Intente ejecutar su integración o pruebas unitarias en un perfil separado. Luego puede habilitar / deshabilitar el perfil.

Steven
fuente
¿Quizás agregar padre pom en el que define el perfil que solo ejecuta TI? todos los submódulos del proyecto podrían heredar ese pom, por lo que no necesitaría cambiar cada pom o ejecutar módulos con conmutadores especiales (ya que puede activar el perfil en ausencia de propiedad).
yoosiba