pom plugin example compiler maven integration-testing maven-surefire-plugin maven-failsafe-plugin

plugin - ¿Cómo puedo omitir las pruebas en el objetivo de instalación de Maven, mientras las ejecuto en el objetivo de prueba de Maven?



maven-resources-plugin (6)

Tengo un proyecto maven de varios módulos con pruebas de integración y unidad en la misma carpeta (src / test / java). Las pruebas de integración están marcadas con @Category(IntegrationTest.class) . Quiero terminar con la siguiente configuración:

  1. Si ejecuto mvn install , quiero que todas las pruebas se compilen, pero no quiero ejecutar ninguna.
  2. Si mvn test , quiero que todas las pruebas se compilen, pero solo ejecute pruebas unitarias.
  3. Si ejecuto mvn integration-test , quiero compilar y ejecutar todas las pruebas.

El punto importante es que quiero que esté configurado en el pom.xml sin ningún argumento de línea de comando adicional.

Actualmente se me ocurrió la siguiente configuración en mi pom.xml padre, donde el único problema es # 1, donde se ejecutan todas las pruebas:

<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${project.java.version}</source> <target>${project.java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.14.1</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.14.1</version> </dependency> </dependencies> <configuration> <includes> <include>**/*.class</include> </includes> <excludedGroups>cz.cuni.xrg.intlib.commons.IntegrationTest</excludedGroups> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>2.14.1</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.14.1</version> </dependency> </dependencies> <configuration> <groups>cz.cuni.xrg.intlib.commons.IntegrationTest</groups> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <includes> <include>**/*.class</include> </includes> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>

Todos los módulos secundarios tienen la siguiente configuración de complemento en su pom.xml, que creo que debería heredar del pom padre:

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> </plugin> </plugins> </build>

Intenté usar <skipTests>true</skipTests> , pero deshabilita la ejecución de prueba para todos los objetivos, que no es lo que quiero (infringe los números 2 y 3). También es bastante extraño que la mvn test respete la opción skipTests=true ... ¿por qué querría ejecutarla en primer lugar?

Después de horas buscando en Google y probando diferentes combinaciones, dudo si es posible incluso no ejecutar pruebas en mvn install , mientras que al mismo tiempo las ejecuto en mvn test . Espero que alguien demuestre esto mal. ;)

También estoy dispuesto a aceptar una solución, donde mvn install ejecutará solo pruebas unitarias, pero no creo que haga mucha diferencia.



El maven-failsafe-plugin docs tiene una sección titulada "Saltarse por defecto".

Lamentablemente, los pasos que describe la página no funcionan como están escritos. Sin embargo, un ligero cambio en esos pasos lo hará funcionar:

En la sección de properties de pom.xml , agregue esto:

<skipITs>true</skipITs>

A continuación, agregue la propiedad skipTests a la sección de plugin de maven-failsafe-plugin:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <configuration> <skipTests>${skipITs}</skipTests> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>

Entonces, una mvn install por defecto ejecutará pruebas unitarias, pero no pruebas de integración.

Pero una mvn install -DskipITs=false ejecutará pruebas unitarias y pruebas de integración.

Nota al pie: la mala documentación jugó un papel importante en la razón por la cual a Maven le desagradaba tanto tiempo.


Lo que OP declaró en su pregunta:

Si ejecuto mvn install , quiero que todas las pruebas se compilen, pero no quiero ejecutar ninguna.
Si ejecuto la prueba mvn , quiero que todas las pruebas se compilen, pero solo ejecute pruebas unitarias.
Si ejecuto mvn integration-test , quiero compilar y ejecutar todas las pruebas.

es perfectamente válido y extremadamente fácil de lograr.
EDITAR: excepto la primera condición, que actúa contra la naturaleza maven. La mejor manera aquí sería simplemente hacer mvn install -DskipTests

Todo lo que necesita es seguir el fragmento en pom.xml :

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.17</version> <executions> <execution> <id>integration-tests</id> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>

y atenerse a las convenciones de nomenclatura de maven para pruebas unitarias y de integración (como ya se indicó en @khmarbaise). Por lo tanto, generalmente nombre las pruebas de integración con IT sufijo IT (por ejemplo MyIntegrationTestIT.java ) y deje que maven-failsafe haga su trabajo.
De esa manera, ni siquiera necesita categorías JUnit (aunque a veces pueden ser bastante útiles).

Eso es :)

  • mvn test ejecuta solo pruebas unitarias
  • mvn integration-test ejecuta todas las pruebas
  • mvn failsafe:integration-test ejecuta solo pruebas de integración
  • mvn clean verify cuando quieras estar seguro, todo ese proyecto simplemente funciona


Algunos consejos personales

Mantener las pruebas de integración por separado de las pruebas unitarias le permite ejecutar fácilmente dentro de su IDE todas las pruebas en algún paquete. Por lo general, se utiliza un directorio adicional denominado test-integration (o integrationtest ) para este fin.
Esto también es fácil de lograr con maven:

<plugin> <!-- adding second test source directory (just for integration tests) --> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.9.1</version> <executions> <execution> <id>add-integration-test-source</id> <phase>generate-test-sources</phase> <goals> <goal>add-test-source</goal> </goals> <configuration> <sources> <source>src/test-integration/java</source> </sources> </configuration> </execution> </executions> </plugin>

Y luego mueve tus pruebas de integración a ese directorio. Debería verse así:

src main test test-integration

Las pruebas de integración generalmente necesitan más memoria:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> ... <configuration> <argLine>-Xmx512m -XX:MaxPermSize=256m</argLine> </configuration> </plugin>


Parece que no entendiste el concepto del ciclo de vida de la construcción en Maven. Si ejecuta mvn install todas las fases del ciclo de vida (incluida la fase de install ) antes de la fase de instalación. Esto significa ejecutar las siguientes fases:

  1. validar
  2. inicializar
  3. generar-fuentes
  4. proceso-fuentes
  5. generar recursos
  6. recursos de proceso
  7. compilar
  8. proceso-clases
  9. generar-probar-fuentes
  10. proceso-prueba-fuentes
  11. generar-probar-recursos
  12. proceso-prueba-recursos
  13. compilación de prueba
  14. proceso-prueba-clases
  15. prueba
  16. preparar-paquete
  17. paquete
  18. prueba previa a la integración
  19. examen de integración
  20. prueba post-integración
  21. verificar
  22. instalar

lo que significa, en otras palabras, se incluyen las fases de integration-test y de ciclo de vida de integration-test . Entonces, sin ninguna información complementaria, no es posible cambiar el comportamiento como lo desees.

Se puede lograr usando un perfil en Maven:

<project> [...] <profiles> <profile> <id>no-unit-tests</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </profile> </profiles> [...] </project>

Entonces su primer requisito:

  1. Si ejecuto mvn install , quiero que todas las pruebas se compilen, pero no quiero ejecutar ninguna.

se puede lograr mediante el uso de lo siguiente:

mvn -Pno-unit-test test

  1. Si mvn test , quiero que todas las pruebas se compilen, pero solo ejecute pruebas unitarias.

Esto se puede lograr simplemente usando la llamada simple:

mvn test

porque la fase de pruebas de integración no se ejecuta (ver el ciclo de vida de la construcción).

  1. Si ejecuto mvn integration-test , quiero compilar y ejecutar todas las pruebas.

Esto significa ejecutar el valor predeterminado que incluye ejecutar la fase de test que ejecutará las pruebas de la unidad (maven-surefire-plugin) y además ejecutar la prueba de integración, que son manejadas por maven-failsafe-plugin. Pero debe tener en cuenta que si desea llamar a las pruebas de integración, debe usar el siguiente comando:

mvn verify

en su lugar, porque se perdió la fase de post-integration-test en su llamada anterior.

Además de lo anterior, debe seguir las convenciones de nomenclatura para las pruebas de unidad e integración donde las pruebas unitarias deben nombrarse de la siguiente manera:

<includes> <include>**/*Test*.java</include> <include>**/*Test.java</include> <include>**/*TestCase.java</include> </includes>

y las pruebas de integración deben nombrarse como las siguientes:

<includes> <include>**/IT*.java</include> <include>**/*IT.java</include> <include>**/*ITCase.java</include> </includes>

Espero que haya configurado el plugin maven-failsafe como el siguiente, que es necesario para vincular el maven-failsafe-plugin con las fases correctas del ciclo de vida:

<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.15</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin> </plugins> </build> [...] </project>

como lo hizo correctamente, pero debe tener en cuenta que las etiquetas include funcionan en el código fuente ( .java) y no en los nombres compilados ( .class). No utilizaría la anotación Categoría, simplemente usando las convenciones de nomenclatura hace que el pom sea más simple y más corto.


En esta publicación se explica cómo omitir las pruebas de integración, independientemente del complemento que utilice para estas pruebas. Básicamente, lo que debes hacer es definir un perfil y poner todos tus códigos xml relacionados con las pruebas de integración dentro de ese perfil. Luego de activarlo cuando falta una propiedad -DskipIntegrationTests.

Puede hacer lo mismo para las pruebas unitarias: escriba un perfil y actívelo cuando falte -DskipUnitTests.

Then, you could do: mvn install -DskipIntegrationTests -DskipUnitTests (runs install without any tests) mvn test (runs unit tests) mvn post-integration-test (runs all tests)


mvn test-compile hace exactamente lo que estás buscando. Simplemente puede reemplazar mvn install con mvn test-compile y listo. No es necesario personalizar el archivo pom ni nada. La siguiente pregunta vinculada es similar a la # 1:

Maven - ¿Cómo compilar pruebas sin ejecutarlas?

mvn test-compile debe aceptarse como la mejor respuesta, ya que Maven admite exactamente lo que quieres hacer de forma nativa y sin ningún tipo de magia. Usted terminaría con esto:

If I run mvn test-compile, I want all tests to compile, but I do not want to execute any. If I run mvn test, I want all tests to compile, but execute only unit tests. If I run mvn integration-test, I want to compile and execute all tests.