2012-04-18 23 views
7

Si tengo un proyecto de Java que usa una biblioteca (un archivo jar), ¿es posible obtener la cobertura del código de las clases dentro de este contenedor?¿Cómo puedo obtener la cobertura de código de una biblioteca java externa con jacoco?

La idea detrás de esto es que me gustaría saber en qué proporción de las bibliotecas externas se basa el proyecto (digamos spring, hibernate, o podrían ser las scala jar si fuera un proyecto scala, por qué no) en realidad se usan. Incluso me imagino que podría tratar de enumerarlos y volver a unirlos en un único contenedor que contendría solo archivos .class necesarios (con un complemento como apache felix, por ejemplo) para obtener el contenedor más pequeño posible. No estoy seguro de que realmente quiera hacer esto, soy consciente de que probablemente sea una mala idea por varias razones, pero lo considero una experimentación.

No puedo encontrar cómo hacerlo, jacoco informa solo la cobertura de los archivos de clase directamente dentro de mi proyecto. Tal vez estoy haciendo algo mal, estoy usando el plugin de Maven como esto:

 <plugin> 
      <groupId>org.jacoco</groupId> 
      <artifactId>jacoco-maven-plugin</artifactId> 
      <version>0.5.6.2012</version> 
      <configuration> 
       <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile> 
       <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile> 
       <includes> 
        <include>**</include> 
       </includes> 
      </configuration> 
      <executions> 
       <execution> 
        <id>jacoco-initialize</id> 
        <goals> 
         <goal>prepare-agent</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>jacoco-site</id> 
        <phase>package</phase> 
        <goals> 
         <goal>report</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

He intentado cambiar la etiqueta include, pero el único efecto es restringir el valor por defecto que incluye sólo los archivos de clase directamente en el interior mi proyecto.

¡Gracias de antemano!


Edición después Oers' respuesta:

descubrí cómo hacerlo con hormigas y antRun-plugin, aunque es muy complicado, tuve muchos problemas con antRun versiones del plugin (incapaz de hacer una trabajo de la versión reciente, incluso para una tarea básica) y me gustaría quedarme con Maven. Si alguien sabe cómo hacer el equivalente con el plugin je jacoco maven en lugar de hormiga, ¡estoy interesado!

Solución parcial con ant: en realidad, el archivo jacoco.exec ya contenía referencias a las clases de mis jar externos; por lo tanto, es la tarea del informe la que debería indicar que tenga en cuenta estos jar, y no la fase de tiempo de ejecución, como yo pensaba. Aquí está la configuración experta utilicé (He encontrado ayuda en http://intellectualcramps.wordpress.com/2012/03/22/jacoco-tycho-and-coverage-reports/):

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <!--<version>1.7</version>--> 
      <dependencies> 
       <dependency> 
        <groupId>org.jacoco</groupId> 
        <artifactId>org.jacoco.ant</artifactId> 
        <version>0.5.6.2012</version> 
       </dependency> 
       <dependency> 
        <groupId>ant-contrib</groupId> 
        <artifactId>ant-contrib</artifactId> 
        <version>20020829</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>jacoco-report</id> 
        <phase>package</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 

          <taskdef name="jacoco-report" 
            classname="org.jacoco.ant.ReportTask" 
            classpathref="maven.plugin.classpath" /> 
          <taskdef classpathref="maven.runtime.classpath" 
        resource="net/sf/antcontrib/antcontrib.properties" /> 
          <available 
       file="${project.basedir}/target/jacoco.exec" 
       property="jacoco.exec.file.exists" /> 
          <echo message="${project.basedir}/target/jacoco.exec" /> 
          <if> 
           <equals arg1="${jacoco.exec.file.exists}" 
         arg2="true" /> 
           <then> 
            <echo message="Executing jacoco report" /> 

            <trycatch> 
             <try> 
              <jacoco-report> 
               <executiondata> 
                <file 
           file="${project.basedir}/target/jacoco.exec" /> 
               </executiondata> 

               <structure name="Minerva"> 
                <classfiles> 
                 <fileset 
            dir="target/classes" /> 

                 <fileset dir="C:/Data/dev/m2Repository/com/groupama/framework/crypt/fwk-cryptage/1.0/"> 
                  <include name="**/*.jar"/> 
                 </fileset> 

                </classfiles> 

                <sourcefiles 
            encoding="UTF-8"> 
                 <fileset 
            dir="src/main/java" /> 
                </sourcefiles> 
               </structure> 
               <html destdir="${project.basedir}/target/jacoco/report" /> 
               <xml destfile="${project.basedir}/target/jacoco/report/jacoco.xml"/> 
              </jacoco-report> 
             </try> 
             <catch> 
              <echo>skipping</echo> 
             </catch> 
            </trycatch> 
           </then> 
           <else> 
            <echo message="No jacoco.exec file found." /> 
           </else> 
          </if> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

Respuesta

1

Es necesario dar la meta informe de las clases de la biblioteca que desea analizar. Desafortunadamente no puedo encontrar una documentación sobre eso. The official docu is ... hm ... sparse

SI puede ejecutar hormiga, le sugiero que mire report task.

<jacoco:report> 

    <executiondata> 
     <file file="jacoco.exec"/> 
    </executiondata> 

    <structure name="Example Project"> 
     <classfiles> 
      <fileset dir="classes"/> <!-- HERE THE CLASSES FROM YOUR LIB --> 
     </classfiles> 
     <sourcefiles encoding="UTF-8"> 
      <fileset dir="src"/> <!-- HERE THE SORUCESFROM YOUR LIB --> 
     </sourcefiles> 
    </structure> 

    <html destdir="report"/> 

</jacoco:report> 
+0

Tiene razón acerca de la documentación, que realmente debe ser más completa. Realmente pensé que era la tarea de ejecución la que necesitaba ser parametrizada; me hizo mirar el archivo jacoco.exec y darse cuenta de que ya contenía referencias a las clases dentro de jar externos, lo que significa que es el informe el que debe estar correctamente parametrizado. Sin saber nada de hormiga, pasé toda la mañana antes de ponerlo a trabajar, pero finalmente funcionó.Me satisface parcialmente, ve mi respuesta a continuación, pero es un paso en la dirección correcta. Muchas gracias de todos modos! – Guillaume

+0

gracias, uu me salvaste el día – vinod

0

Aunque esta pregunta es antigua, todavía parece relevante. Si la biblioteca externa es un proyecto Maven, puede ir al directorio de origen biblioteca y solicitar informe JaCoCo obtenido previamente con el banco de pruebas desde el interior de ahí:

mvn org.jacoco:jacoco-maven-plugin:0.7.8:report -Djacoco.dataFile=/path/to/jacoco.exec 

Se puede obtener el informe en $ {proyecto}/target/sitio/directorio jacoco.

Cuestiones relacionadas