Diferencia entre revisiones de «Cobertura»

De Dos Ideas.
Saltar a: navegación, buscar
(Bug con JDK 1.6)
(Integración de Cobertura con NetBeans)
 
(No se muestran 23 ediciones intermedias de 3 usuarios)
Línea 11: Línea 11:
  
 
==Bug con JDK 1.6==
 
==Bug con JDK 1.6==
Trabajando con la versión 1.8 de Cobertura y JDK 1.6 nos encontramos con el [[http://cobertura.sourceforge.net/ problema de escribir los datos de cobertura (java.lang.IllegalStateException: Shutdown in progress) ]], que se resuelve con la version 1.9.2.
+
Trabajando con la versión 1.8 de Cobertura y JDK 1.6 nos encontramos con el problema de escribir los datos de cobertura [[http://cobertura.sourceforge.net/ (java.lang.IllegalStateException: Shutdown in progress) ]], que se resuelve con la version 1.9.2.
Por ahora, seguimos con 1.8 y JDK 1.5. Seguramente, en breve nos pongamos con la versión 1.9.3.
+
Por ahora, seguimos con 1.8 y JDK 1.5. Seguramente, en breve nos pongamos con la última versión estable de Cobertura.
 +
 
 +
==Enconding==
 +
 
 +
A partir de la '''versión 1.9''' de cobertura se asume que todos los archivos java fueron guardados con el formato de codificación de caracteres '''UTF-8''', en vez de usar la codificación por default de la computadora donde está corriendo cobertura.
 +
Además permite modificar dicho comportamiento, permitiendo configurar el formato de codificación que se desea, según el api de [http://java.sun.com/j2se/1.5.0/docs/api/java/nio/charset/Charset.html Charset].Esa configuación se setea en la tarea ant cobertura-report mediante el nuevo atributo "enconding" del tag cobertura-report como figura en el siguiente ejemplo:
 +
 
 +
<code xml>
 +
 
 +
<cobertura-report format="html" destdir="${coveragereport.dir}" srcdir="${src.dir}" encoding="ISO-8859-1" />
 +
 
 +
</code>
 +
 
 +
== Integración de Cobertura con NetBeans IDE ==
 +
Los siguientes pasos explican como integrar [[Cobertura]] con un proyecto que se compila con [[Ant]] generado usando [[NetBeans]].
 +
 
 +
=== project.properties ===
 +
 
 +
==== Definir las variables de Cobertura ====
 +
 
 +
<code>
 +
build.instrumented.dir=${build.dir}/instrumented
 +
build.report.dir=${build.dir}/report
 +
build.report.cobertura.dir=${build.report.dir}/report-coverage
 +
 
 +
junitreport.report.dir=${build.report.dir}/report-test
 +
junitreport.project.test.classes=build/test/results
 +
</code>
 +
 
 +
====Agregar el path de la instrumentación a los classpath de compilación y corrida de test====
 +
 
 +
<code>
 +
javac.test.classpath=\
 +
${javac.classpath}:\
 +
${build.instrumented.dir}:\
 +
${build.classes.dir}:\
 +
${libs.junit_4.classpath}
 +
 
 +
run.test.classpath=\
 +
${javac.test.classpath}:\
 +
${build.instrumented.dir}:\
 +
${build.test.classes.dir}:\
 +
${file.reference.asm-3.0.jar}:\
 +
${file.reference.asm-tree-3.0.jar}:\
 +
${file.reference.cobertura.jar}:\
 +
${file.reference.jakarta-oro-2.0.8.jar}:\
 +
${file.reference.log4j-1.2.9.jar}
 +
</code>
 +
 
 +
=== Agregar al classpath de corrida de los test los jars de cobertura  ===
 +
 
 +
Download Cobertura ([http://cobertura.sourceforge.net/download.html sitio web])
 +
 
 +
[[Image:Netbeans-classpath.JPG]]<br>
 +
 
 +
=== Archivo build.xml del proyecto ===
 +
 
 +
====Tareas para instrumentar las clases====
 +
 
 +
<code xml>
 +
<property environment="env"/>
 +
<taskdef classpath="cobertura.jar" resource="tasks.properties"/>
 +
<target name="-pre-compile-test">
 +
<delete dir="${build.instrumented.dir}" />
 +
<delete dir="${build.report.cobertura.dir}" />
 +
<mkdir dir="${build.instrumented.dir}" />
 +
<mkdir dir="${build.report.cobertura.dir}" />
 +
<cobertura-instrument todir="${build.instrumented.dir}">
 +
<fileset dir="${build.classes.dir}">
 +
<include name="**/*.class"/>
 +
</fileset>
 +
</cobertura-instrument>
 +
</target>
 +
</code>
 +
 
 +
====Tareas de generación de reportes====
 +
 
 +
<code xml>
 +
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
 +
 
 +
<cobertura-report format="html" srcdir="${src.dir}" destdir="${build.report.cobertura.dir}"/>
 +
 
 +
<cobertura-report format="xml" srcdir="${src.dir}" destdir="${build.report.cobertura.dir}"/>
 +
 
 +
<delete file="cobertura.ser" />
 +
 
 +
<mkdir dir="${junitreport.report.dir}"/>
 +
 
 +
<delete>
 +
<fileset dir="${junitreport.report.dir}" includes="*.xml"/>
 +
</delete>
 +
 
 +
<taskdef name="junitreport" classpath="${junitreport.classpath}" classname="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator" />
 +
 
 +
<junitreport todir="${junitreport.report.dir}">
 +
<fileset dir="${junitreport.project.test.classes}">
 +
  <include name="TEST-*.xml" />
 +
</fileset>
 +
<report todir="${junitreport.report.dir}" />
 +
</junitreport>
 +
 
 +
</target>
 +
</code>
 +
 
 +
===Ejecución tarea "test"===
 +
 
 +
<code>
 +
-pre-compile-test:
 +
  [delete] Deleting directory D:\workspace\prueba-cobertura\build\cobertura-out
 +
instr
 +
  [delete] Deleting directory D:\workspace\prueba-cobertura\report\report-cover
 +
age
 +
    [mkdir] Created dir: D:\workspace\prueba-cobertura\build\cobertura-outinstr
 +
    [mkdir] Created dir: D:\workspace\prueba-cobertura\report\report-coverage
 +
[cobertura-instrument] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See C
 +
OPYRIGHT file
 +
[cobertura-instrument] Instrumenting 2 files to D:\workspace\prueba-cobertura\bu
 +
ild\cobertura-outinstr
 +
[cobertura-instrument] Cobertura: Saved information on 2 classes.
 +
[cobertura-instrument] Instrument time: 78ms
 +
 
 +
-compile-test-depend:
 +
 
 +
-do-compile-test:
 +
 
 +
-post-compile-test:
 +
 
 +
compile-test:
 +
 
 +
-pre-test-run:
 +
 
 +
-do-test-run:
 +
    [junit] Testsuite: pruebacobertura.PruebaCoberturaTest
 +
    [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0,187 sec
 +
    [junit]
 +
    [junit] Flushing results...
 +
    [junit] Flushing results done
 +
    [junit] Cobertura: Loaded information on 2 classes.
 +
    [junit] Cobertura: Saved information on 2 classes.
 +
 
 +
test-report:
 +
 
 +
-post-test-run:
 +
[cobertura-report] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See COPYR
 +
IGHT file
 +
[cobertura-report] Cobertura: Loaded information on 2 classes.
 +
[cobertura-report] Report time: 172ms
 +
[cobertura-report] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See COPYR
 +
IGHT file
 +
[cobertura-report] Cobertura: Loaded information on 2 classes.
 +
[cobertura-report] Report time: 94ms
 +
[delete] Deleting: D:\workspace\prueba-cobertura\cobertura.ser
 +
[junitreport] Processing D:\workspace\prueba-cobertura\report\report-test\TESTS-
 +
TestSuites.xml to C:\Temp\null1151001524
 +
[junitreport] Loading stylesheet jar:file:/D:/apache-ant-1.7.1/lib/ant-junit.jar
 +
!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl
 +
[junitreport] Transform time: 359ms
 +
[junitreport] Deleting: C:\Temp\null1151001524
 +
</code>
 +
 
 +
=== Reportes  ===
 +
 
 +
[[Image:Reportes-cobertura.jpg]]
  
 
==Ver también==
 
==Ver también==
Línea 18: Línea 180:
 
* [http://cobertura.sourceforge.net/ Web oficial de Cobertura]
 
* [http://cobertura.sourceforge.net/ Web oficial de Cobertura]
 
* [http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/ Tutorial para integrar Cobertura, NetBeans y Hudson]
 
* [http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/ Tutorial para integrar Cobertura, NetBeans y Hudson]
 +
* [http://es.wikipedia.org/wiki/UTF-8 UTF-8]
  
 
[[Category:Métricas]]
 
[[Category:Métricas]]

Revisión actual del 19:28 20 oct 2010

Cobertura es una herramienta de Java libre para calcular el porcentaje de código accedido por las pruebas. Puede ser usada para identificar cuales partes de su código Java carece de cobertura de pruebas. Se basa en JCoverage.

Características

  • Se puede ejecutar desde Ant o desde linea de comando.
  • Instrumenta los bytecode de Java después que este ha sido compilado.
  • Puede generar reportes en HTML or XML.
  • Muestra el porcentaje de líneas y ramas cubiertas de cada clase, cada paquete, y en todo el proyecto.
  • Muestra el McCabe Complejidad Ciclomatica de cada clase, y el promedio de la Complejidad Ciclomatica para cada paquete y para todo el producto.
  • Puede ordenar los resultados en HTML por nombre de clase, porcentaje de líneas cubiertas, porcentaje de ramas cubiertas, etc. Y puede ordenar en forma ascendente o descendente.

Bug con JDK 1.6

Trabajando con la versión 1.8 de Cobertura y JDK 1.6 nos encontramos con el problema de escribir los datos de cobertura [(java.lang.IllegalStateException: Shutdown in progress) ], que se resuelve con la version 1.9.2. Por ahora, seguimos con 1.8 y JDK 1.5. Seguramente, en breve nos pongamos con la última versión estable de Cobertura.

Enconding

A partir de la versión 1.9 de cobertura se asume que todos los archivos java fueron guardados con el formato de codificación de caracteres UTF-8, en vez de usar la codificación por default de la computadora donde está corriendo cobertura. Además permite modificar dicho comportamiento, permitiendo configurar el formato de codificación que se desea, según el api de Charset.Esa configuación se setea en la tarea ant cobertura-report mediante el nuevo atributo "enconding" del tag cobertura-report como figura en el siguiente ejemplo:

<cobertura-report format="html" destdir="${coveragereport.dir}" srcdir="${src.dir}" encoding="ISO-8859-1" />

Integración de Cobertura con NetBeans IDE

Los siguientes pasos explican como integrar Cobertura con un proyecto que se compila con Ant generado usando NetBeans.

project.properties

Definir las variables de Cobertura

build.instrumented.dir=${build.dir}/instrumented build.report.dir=${build.dir}/report build.report.cobertura.dir=${build.report.dir}/report-coverage

junitreport.report.dir=${build.report.dir}/report-test junitreport.project.test.classes=build/test/results

Agregar el path de la instrumentación a los classpath de compilación y corrida de test

javac.test.classpath=\

${javac.classpath}:\
${build.instrumented.dir}:\
${build.classes.dir}:\
${libs.junit_4.classpath}

run.test.classpath=\

${javac.test.classpath}:\
${build.instrumented.dir}:\
${build.test.classes.dir}:\
${file.reference.asm-3.0.jar}:\
${file.reference.asm-tree-3.0.jar}:\
${file.reference.cobertura.jar}:\
${file.reference.jakarta-oro-2.0.8.jar}:\
${file.reference.log4j-1.2.9.jar}

Agregar al classpath de corrida de los test los jars de cobertura

Download Cobertura (sitio web)

Netbeans-classpath.JPG

Archivo build.xml del proyecto

Tareas para instrumentar las clases

<property environment="env"/> <taskdef classpath="cobertura.jar" resource="tasks.properties"/> <target name="-pre-compile-test">

<delete dir="${build.instrumented.dir}" />
<delete dir="${build.report.cobertura.dir}" />
<mkdir dir="${build.instrumented.dir}" />
<mkdir dir="${build.report.cobertura.dir}" />
<cobertura-instrument todir="${build.instrumented.dir}">
<fileset dir="${build.classes.dir}">
<include name="**/*.class"/>
</fileset>
</cobertura-instrument>

</target>

Tareas de generación de reportes

<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">

<cobertura-report format="html" srcdir="${src.dir}" destdir="${build.report.cobertura.dir}"/>

<cobertura-report format="xml" srcdir="${src.dir}" destdir="${build.report.cobertura.dir}"/>

<delete file="cobertura.ser" />

<mkdir dir="${junitreport.report.dir}"/>

<delete>

<fileset dir="${junitreport.report.dir}" includes="*.xml"/>

</delete>

<taskdef name="junitreport" classpath="${junitreport.classpath}" classname="org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator" />

<junitreport todir="${junitreport.report.dir}">

<fileset dir="${junitreport.project.test.classes}">
 <include name="TEST-*.xml" />
</fileset>
<report todir="${junitreport.report.dir}" />

</junitreport>

</target>

Ejecución tarea "test"

-pre-compile-test:

  [delete] Deleting directory D:\workspace\prueba-cobertura\build\cobertura-out

instr

  [delete] Deleting directory D:\workspace\prueba-cobertura\report\report-cover

age

   [mkdir] Created dir: D:\workspace\prueba-cobertura\build\cobertura-outinstr
   [mkdir] Created dir: D:\workspace\prueba-cobertura\report\report-coverage

[cobertura-instrument] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See C OPYRIGHT file [cobertura-instrument] Instrumenting 2 files to D:\workspace\prueba-cobertura\bu ild\cobertura-outinstr [cobertura-instrument] Cobertura: Saved information on 2 classes. [cobertura-instrument] Instrument time: 78ms

-compile-test-depend:

-do-compile-test:

-post-compile-test:

compile-test:

-pre-test-run:

-do-test-run:

   [junit] Testsuite: pruebacobertura.PruebaCoberturaTest
   [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0,187 sec
   [junit]
   [junit] Flushing results...
   [junit] Flushing results done
   [junit] Cobertura: Loaded information on 2 classes.
   [junit] Cobertura: Saved information on 2 classes.

test-report:

-post-test-run: [cobertura-report] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See COPYR IGHT file [cobertura-report] Cobertura: Loaded information on 2 classes. [cobertura-report] Report time: 172ms [cobertura-report] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See COPYR IGHT file [cobertura-report] Cobertura: Loaded information on 2 classes. [cobertura-report] Report time: 94ms [delete] Deleting: D:\workspace\prueba-cobertura\cobertura.ser [junitreport] Processing D:\workspace\prueba-cobertura\report\report-test\TESTS- TestSuites.xml to C:\Temp\null1151001524 [junitreport] Loading stylesheet jar:file:/D:/apache-ant-1.7.1/lib/ant-junit.jar !/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl [junitreport] Transform time: 359ms [junitreport] Deleting: C:\Temp\null1151001524

Reportes

Reportes-cobertura.jpg

Ver también