Cobertura
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