proyecto pom groupid crear central basedir artifactid and maven-2 cobertura

maven-2 - pom - parent maven



cobertura en el proyecto maven multi-módulo (7)

A partir de la versión 2.6, hay una opción agregada que se puede establecer en true en el pom principal:

<reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.6</version> <configuration> <outputDirectory>./target/tmpCobertura</outputDirectory> <formats> <format>html</format> </formats> <aggregate>true</aggregate> </configuration> </plugin> </plugins> </reporting>

Tengo un proyecto de Maven con 4 módulos, 3 de ellos contienen código y algunas pruebas (las pruebas son iguales y el código hash de las clases), mientras que el 4º módulo sirve para probar los otros 3 módulos.

Ahora quiero ejecutar la herramienta de cobertura de código de cobertura para obtener una visión general de qué clases están bien probadas y cuáles no. Hice algunas investigaciones sobre ese tema y parece que Cobertura no es consciente de cómo generar los porcentajes de cobertura de línea y líneas correctos, si algunas fuentes que se han probado están ubicadas dentro de otros módulos.

He leído algunos enlaces como SeamTestCoverageWithCobertura y Uso del complemento de cobertura dentro de un módulo múltiple de Maven 2, pero tiene que haber una solución lista para usar. ¿Alguien puede informar algunas nuevas direcciones sobre este tema? ¿O existen herramientas como la cobertura? Me he topado con emma pero esta herramienta no ofrece cobertura de línea ...



No tenemos sonar aquí y en este momento, no podemos instalarlo. Así que tuve que encontrar una solución y conseguí una. Esta solución funciona con una instalación simple de mvn clean install -DrunCobertura=true en un proyecto de varios módulos. Solo necesita agregar este perfil a su super pom.xml de su proyecto, defina la propiedad working.dir y debería funcionar.

<profile> <id>runCobertura</id> <activation> <property> <name>runCobertura</name> <value>true</value> </property> </activation> <properties> <cobertura.format>html</cobertura.format> <cobertura.working.dir>${working.dir}/${project.version}/cobertura</cobertura.working.dir> <cobertura.complete.ser.file>${cobertura.working.dir}/complete.ser</cobertura.complete.ser.file> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> <version>2.4.1</version> <inherited>false</inherited> <configuration> <filesets> <fileset> <directory>.</directory> <includes> <include>cobertura.ser</include> </includes> </fileset> <fileset> <directory>${cobertura.working.dir}</directory> </fileset> </filesets> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <id>cobertura-Instrument</id> <phase>process-classes</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <taskdef resource="tasks.properties"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <if> <available file="${project.build.outputDirectory}"/> <then> <cobertura-instrument> <fileset dir="${project.build.outputDirectory}"> <include name="**/*.class"/> </fileset> </cobertura-instrument> </then> </if> </target> </configuration> </execution> <execution> <id>cobertura-createCombinedSerFile</id> <phase>generate-test-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <taskdef resource="tasks.properties"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <if> <available file="${cobertura.complete.ser.file}"/> <then> <cobertura-merge datafile="${basedir}/tmp.ser"> <fileset file="${cobertura.complete.ser.file}"/> <fileset file="${basedir}/cobertura.ser"/> </cobertura-merge> <move file="${basedir}/tmp.ser" tofile="${basedir}/cobertura.ser"/> </then> </if> </target> </configuration> </execution> <execution> <id>cobertura-copyResultSerFileAndSources</id> <phase>test</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <taskdef resource="tasks.properties"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <if> <available file="${basedir}/cobertura.ser"/> <then> <move file="${basedir}/cobertura.ser" tofile="${cobertura.complete.ser.file}"/> <mkdir dir="${cobertura.working.dir}/source"/> <if> <available file="${basedir}/src/main/java"/> <then> <copy todir="${cobertura.working.dir}/source"> <fileset dir="src/main/java"> <include name="**/*.java"/> </fileset> </copy> </then> </if> <cobertura-report datafile="${cobertura.complete.ser.file}" format="${cobertura.format}" destdir="${cobertura.working.dir}/report"> <fileset dir="${cobertura.working.dir}/source"/> </cobertura-report> </then> </if> </target> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>net.sourceforge.cobertura</groupId> <artifactId>cobertura</artifactId> <version>1.9.4.1</version> </dependency> <dependency> <groupId>ant-contrib</groupId> <artifactId>ant-contrib</artifactId> <version>20020829</version> </dependency> </dependencies> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>net.sourceforge.cobertura</groupId> <artifactId>cobertura</artifactId> <version>1.9.4.1</version> <scope>test</scope> </dependency> </dependencies> </profile>

Qué hace:

1. @process-classes -Instrumenta las clases compiladas del módulo.

2. @generate-test-sources -Funde el archivo .ser de los módulos anteriores con el creado de este módulo para obtener la cobertura completa del código.

3. @test Crea el informe de cobertura de código. Debería llamarse en el último módulo, pero debido a que el último módulo puede cambiar, lo llamo siempre y los informes anteriores se sobrescribirán. Si usa el informe en formato xml (para Jenkins) es rápido, por lo que no importa.



Realmente me gustaría agradecer a Sven Oppermann por enviar su solución de perfil runCobertura. Esto me ayudó a resolver la pregunta de ''cómo obtener informes de cobertura agregados para proyectos de varios módulos cuando es posible que no pueda usar Sonar.

He creado un ejemplo que demuestra cómo crear proyectos de múltiples módulos que producen informes de cobertura de código que evalúan no solo la cobertura de pruebas unitarias (en todos los submódulos), sino también la cobertura de PRUEBAS DE INTEGRACIÓN QUE TRAEN SU APLICACIÓN COMO UN .WAR IN JETTY. El ejemplo está alojado aquí:

http://dl.dropbox.com/u/9940067/code/multi-module-cobertura.zip

La receta que estoy proporcionando es bastante reutilizable si copia el perfil de runCobertura que se enumera a continuación (basado en el proporcionado por Sven).

Aquí hay algunas notas que te ayudarán a usar este perfil:

* the integration test module that launches jetty (and defines tests that run against the production .war) must either be named web-test-driver-for-code-coverage, or you must modify the <if> statements in the runCobertura configuration block. * your coverage reports will appear wherever you set your <working.dir> variable * you MUST include ''clean'' on the command line when you run your build for code coverage. ''clean'' will blow away prior cobertura.ser files, which if left lurking around can cause very confusing reports to be generated (a sign you need to ''clean'' is that the reports show 100% coverage for everything, including stuff you know is never called. mvn -PrunCobertura clean install # gives you the aggregate reports. * the module web-test-driver-for-code-coverage defines a servlet context listener that explicitly flushes the cobertura metrics to disk when the web server shuts down. Supposedly the container is supposed to do this automatically, but that didn''t work for me, so I had to hook in the explicit call to flush out the metrics. * the integration tests are done in groovy because i based this on some maven project skeletons that already used groovy. Sorry for the added clutter, but it does show you how to do your tests in groovy (which is highly recommended anyway.) * Note that when you compile with the runCobertura profile all of your artifacts are created with cobertura instrumentation, even your .war file. You NEVER want to let this get out in production of course (for one thing it would run realllll slow.) I have not yet figured out a food way to get the artifacts to rename themselves so that the ''cobertura-ness'' is obvious. <profiles> <profile> <id>runCobertura</id> <activation> <property> <name>runCobertura</name> <value>true</value> </property> </activation> <properties> <cobertura.format>html</cobertura.format> <working.dir>/tmp</working.dir> <cobertura.working.dir>${working.dir}/${project.version}/cobertura</cobertura.working.dir> <cobertura.complete.ser.file>${cobertura.working.dir}/complete.ser</cobertura.complete.ser.file> <!-- scope which determines whether or not cobertura is included in .war file: overriden here --> <cobertura.dependency.scope>compile</cobertura.dependency.scope> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-clean-plugin</artifactId> <version>2.4.1</version> <inherited>false</inherited> <configuration> <filesets> <fileset> <directory>.</directory> <includes> <include>**/cobertura.ser</include> </includes> </fileset> <fileset> <directory>${cobertura.working.dir}</directory> </fileset> </filesets> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <id>cobertura-Instrument</id> <phase>process-classes</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <taskdef resource="tasks.properties"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <echo message="::PROCESS CLASSES: ${artifactId}"/> <if> <equals arg1="${artifactId}" arg2="web-test-driver-for-code-coverage" /> <then> <echo message="::SKIPPING PHASE for integration test"/> </then> <else> <if> <available file="${project.build.outputDirectory}"/> <then> <echo message="::BEFORE INSTRUMENT"/> <cobertura-instrument> <fileset dir="${project.build.outputDirectory}"> <include name="**/*.class"/> </fileset> </cobertura-instrument> </then> </if> </else> </if> </target> </configuration> </execution> <execution> <id>cobertura-createCombinedSerFile</id> <phase>generate-test-sources</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <taskdef resource="tasks.properties"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <echo message=":::generate-test-sources"/> <if> <equals arg1="${artifactId}" arg2="web-test-driver-for-code-coverage" /> <then> <echo message="::SHORT CIRCUIT COMBINE PHASE for integration test"/> <echo message="source - ${cobertura.complete.ser.file} dest - ${basedir}/cobertura.ser"/> <copy file="${cobertura.complete.ser.file}" tofile="${basedir}/cobertura.ser"/> </then> <else> <if> <available file="${basedir}/cobertura.ser"/> <then> <echo message="::: Is available ${basedir}/cobertura.ser"/> </then> </if> <if> <available file="${cobertura.complete.ser.file}"/> <then> <echo message="before merge1"/> <cobertura-merge datafile="${basedir}/tmp.ser"> <fileset file="${cobertura.complete.ser.file}"/> <fileset file="${basedir}/cobertura.ser"/> </cobertura-merge> <echo message="move temp.ser to ${basedir}/cobertura.ser"/> <move file="${basedir}/tmp.ser" tofile="${basedir}/cobertura.ser"/> </then> </if> </else> </if> </target> </configuration> </execution> <execution> <id>cobertura-copyResultSerFileAndSources</id> <phase>verify</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <taskdef resource="tasks.properties"/> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <echo message=":::copyResultSerFileAndSources -beforeIf"/> <if> <available file="${basedir}/cobertura.ser"/> <then> <echo message="move1"/> <move file="${basedir}/cobertura.ser" tofile="${cobertura.complete.ser.file}"/> <mkdir dir="${cobertura.working.dir}/source"/> <if> <available file="${basedir}/src/main/java"/> <then> <copy todir="${cobertura.working.dir}/source"> <fileset dir="src/main/java"> <include name="**/*.java"/> </fileset> </copy> </then> </if> <echo message="runreport"/> <cobertura-report datafile="${cobertura.complete.ser.file}" format="${cobertura.format}" destdir="${cobertura.working.dir}/report"> <fileset dir="${cobertura.working.dir}/source"/> </cobertura-report> </then> </if> </target> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>net.sourceforge.cobertura</groupId> <artifactId>cobertura</artifactId> <version>1.9.4.1</version> </dependency> <dependency> <groupId>ant-contrib</groupId> <artifactId>ant-contrib</artifactId> <version>20020829</version> </dependency> </dependencies> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>net.sourceforge.cobertura</groupId> <artifactId>cobertura</artifactId> <version>1.9.4.1</version> </dependency> </dependencies> </profile> </profiles>


Según MCOBERTURA-65 , el complemento de cobertura de Maven aún no sabe cómo agregar informes de submódulos a uno consolidado. Se ha trabajado para implementar un objetivo de merge en el complemento de cobertura de Maven (ver MCOBERTURA-33 ) pero este código aún no se ha incluido en el complemento. No probé el parche yo mismo y no puedo decir si vale la pena intentarlo.

En consecuencia, mucha gente sugiere utilizar el complemento del panel de control de Maven, pero personalmente me mantendría lejos de él, ya que no es muy satisfactorio a largo plazo y tuve muchos problemas con él (problemas técnicos, pérdida de la historia). , ...). En su lugar, recomiendo encarecidamente Sonar . Eche un vistazo a Nemo , una instancia pública de la última versión de Sonar, para ver una demostración en vivo de esta herramienta. Vea, por ejemplo, el proyecto Commons Digester y el desglose de la cobertura del código .


Thomas Sundberg ofrece una solución interesante en la que la instrumentación y los informes de pruebas se realizan a través de ant , pero todas las pruebas y la gestión de dependencias a través de mvn .

Compruebe aquí: wordpress thomassundberg

Esto significa que debe ejecutar los comandos a continuación en el nivel principal en este orden:

mvn clean compile ant instrument mvn test ant report

Martijn Stelinga describe la integración de estos pasos en el sonar .

test-coverage-in-multi-module-projects