coverage maven code-coverage jacoco maven-surefire-plugin maven-failsafe-plugin

coverage java maven



FusiĆ³n de informes de integraciĆ³n y pruebas unitarias con JaCoCo (5)

Estoy generando informes seguros y a prueba de fallas con Maven con el complemento JaCoCo, pero solo puedo conseguirlos en informes separados. También me gustaría tener una vista de cobertura general (fusionar entre pruebas unitarias y pruebas de integración).

Después de lo que creo que fue una búsqueda exhaustiva en Google, solo pude encontrar una manera de hacer esto con Sonar. ¿Hay alguna forma más sencilla de hacer esto?

Pregunta relacionada: Prueba separada de unidad y pruebas de integración separadas de Maven


No es la respuesta que estás buscando, pero aún así ...

En la mayoría de los casos, no debe combinar la cobertura de las pruebas de unidad e integración.

El valor de las pruebas unitarias es que mejoran el diseño de su aplicación y garantizan que los casos de esquina de su código estén funcionando correctamente. Debe tratar de tener una alta cobertura de sucursales de sus pruebas unitarias.

El valor de sus pruebas de integración es que garantizan que los principales casos de uso de su aplicación estén funcionando correctamente y que toda la pila esté integrada correctamente. Debe intentar tener una alta cobertura funcional para sus pruebas de integración. (Pero es bastante difícil medir la cobertura funcional con una herramienta).

Si necesita pruebas de integración para mejorar la cobertura de su sucursal, eso es una indicación sólida de que debe revisar el diseño de su código. Y si ya tiene una alta cobertura de sucursales sin pruebas de integración, agregarlas no debería modificar significativamente sus métricas.

Siéntase libre de votar esta respuesta, ya que es un poco de tema y bastante de opinión ...


Recientemente implementé esto: después de algunos dolores de cabeza y muchas pruebas, tengo una configuración que funciona a la perfección.

<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <executions> <execution> <id>pre-unit-test</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile> <propertyName>surefireArgLine</propertyName> </configuration> </execution> <execution> <id>pre-integration-test</id> <goals> <goal>prepare-agent-integration</goal> </goals> <configuration> <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile> <propertyName>testArgLine</propertyName> </configuration> </execution> <execution> <id>post-integration-test</id> <phase>post-integration-test</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory> </configuration> </execution> <execution> <id>post-unit-test</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory> </configuration> </execution> <execution> <id>merge-results</id> <phase>verify</phase> <goals> <goal>merge</goal> </goals> <configuration> <fileSets> <fileSet> <directory>${project.build.directory}/coverage-reports</directory> <includes> <include>*.exec</include> </includes> </fileSet> </fileSets> <destFile>${project.build.directory}/coverage-reports/aggregate.exec</destFile> </configuration> </execution> <execution> <id>post-merge-report</id> <phase>verify</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/coverage-reports/aggregate.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <argLine>${surefireArgLine}</argLine> <skipTests>${skip.unit.tests}</skipTests> <includes> <include>**/*UT.java</include> <include>**/*MT.java</include> <include>**/*Test.java</include> </includes> <skipTests>${skipUTMTs}</skipTests> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> <configuration> <skipTests>${skipTests}</skipTests> <skipITs>${skipITs}</skipITs> <argLine>${testArgLine}</argLine> <excludes> <exclude>**/*UT*.java</exclude> </excludes> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>

Como puede ver, hay 6 ejecuciones Jacoco distintas para ejecutar las pruebas, combinar los archivos y crear un informe agregado. Además de la configuración de Jacoco, también debe configurar Surefire y Failsafe para tomar un argumento de Jacoco (Surefire ejecuta las pruebas unitarias y Failsafe ejecuta las pruebas de integración).

Toda la configuración que utilicé debería estar allí, lo que haga con ella es su arquitectura de diseño para que se ajuste a sus requisitos deseados. Personalmente, recomiendo una mirada a lo que excluyo e incluyo dentro de surefire y failafe si tiene problemas con los archivos que no se leen.


Sobre la base de la respuesta de Chad, aquí está mi configuración. Se configura como un perfil separado llamado jacoco para que pueda activarlo y desactivarlo fácilmente. Utiliza solo la configuración por defecto. Puede crear un informe de cobertura de código separado para pruebas unitarias, un informe de cobertura de código separado para pruebas de integración y también un informe de cobertura de código combinado.

<profile> <id>jacoco</id> <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution> <id>pre-unit-test</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>post-unit-test</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> <execution> <id>pre-integration-test</id> <goals> <goal>prepare-agent-integration</goal> </goals> </execution> <execution> <id>post-integration-test</id> <goals> <goal>report-integration</goal> </goals> </execution> <execution> <id>merge-results</id> <phase>verify</phase> <goals> <goal>merge</goal> </goals> <configuration> <fileSets> <fileSet> <directory>${project.build.directory}</directory> <includes> <include>*.exec</include> </includes> <excludes> <exclude>aggregate.exec</exclude> </excludes> </fileSet> </fileSets> <destFile>${project.build.directory}/aggregate.exec</destFile> </configuration> </execution> <execution> <id>post-merge-report</id> <phase>verify</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>${project.build.directory}/aggregate.exec</dataFile> <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>


Tal vez la mejor manera de lograrlo es usar el mismo archivo jacoco, pero permítale otra prueba, que funciona para nosotros: unidad y prueba.

<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.1</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <skip>${maven.surefire.skipTests}</skip> <propertyName>maven.surefire.argLine</propertyName> <!-- using the same dest file for both UT and IT --> <destFile>${sonar.jacoco.reportPath}</destFile> </configuration> </execution> <execution> <id>default-prepare-agent-integration</id> <goals> <goal>prepare-agent-integration</goal> </goals> <configuration> <skip>${maven.failsafe.skipTests}</skip> <propertyName>maven.failsafe.argLine</propertyName> <!-- append to the UT dest file --> <destFile>${sonar.jacoco.reportPath}</destFile> <append>true</append> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>${maven.surefire.skipTests}</skipTests> <failIfNoTests>${maven.surefire.failIfNoTests}</failIfNoTests> <!-- allow argLine to be modified by other plugins, e.g. jacoco --> <argLine>@{maven.surefire.argLine}</argLine> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <configuration> <skipTests>${maven.failsafe.skipTests}</skipTests> <failIfNoTests>${maven.failsafe.failIfNoTests}</failIfNoTests> <!-- allow argLine to be modified by other plugins, e.g. jacoco --> <argLine>@{maven.failsafe.argLine}</argLine> </configuration> </plugin>


Debería echar un vistazo a la documentación del complemento JaCoCo Maven que contiene un objetivo de merge .