Diferencia entre revisiones de «Cobertura»
(→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/ | + | 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.
Contenido
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)
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