Emma es una librería que permite generar reportes sobre el nivel de cobertura de las pruebas unitarias sobre el código fuente de un proyecto. Para usarlo con Ant es necesario importar la librería en el archivo XML de Ant, en nuestro caso, el build.xml. Una vez se importa la librería creamos una tarea para que realice el análisis y almacene el reporte en el directorio y formato indicado, para el caso de Hudson es necesario un reporte en formato XML.
Para integrar este reporte en XML dentro de la tarea de Hudson, es necesario instalar el plugin Emma y activarlo en el proyecto.
1. Abra el archivo build.xml del proyecto ejemplo.
2. Importe las librerías y las tareas de Emma agregando al principio del archivo las siguientes líneas:
<path id = "emma.lib"> <pathelement location = "${lib.dir}/emma.jar" /> <pathelement location = "${lib.dir}/emma_ant.jar" /> <pathelement location = "${emma.build.dir}/**" /> </path> <taskdef resource = "emma_ant.properties" classpathref = "emma.lib" />
3. En la tarea init agregue la creación del directorio ${emma.coverage.dir} mediante la siguiente línea:
<mkdir dir = "${emma.coverage.dir}" />
4. En la tarea cleanall agregue el borrado del directorio ${emma.coverage.dir} mediante la siguiente línea:
<delete failonerror = "false" dir = "${emma.coverage.dir}" />
5. Agregue ahora la tarea emma que consiste en la compilación del código fuente y los test y en la ejecución de AllTestCase.class. Después de esta ejecución la tarea genera los reportes en el directorio ${emma.coverage.dir}.
El script de la tarea es el siguiente:
<target name = "emma" depends = "init"> <javac encoding = "ISO-8859-1" destdir = "${emma.build.dir}" classpathref = "lib.jarfiles" debug = "on" deprecation = "on" optimize = "on"> <src path = "${src.dir}" /> <src path = "${test.dir}" /> </javac> <emmajava enabled = "true" libclasspathref = "lib.jarfiles" fullmetadata = "yes" filter = "org.farng.*" sourcepath = "${src.dir}" classname = "org.farng.mp3.AllTestCase" fork = "true" classpathref = "lib.jarfiles" failonerror = "true"> <classpath> <pathelement path = "${emma.build.dir}" /> <pathelement path = "${java.class.path}" /> </classpath> <txt outfile = "${emma.coverage.dir}/coverage.txt" /> <xml outfile = "${emma.coverage.dir}/coverage.xml" /> <html outfile = "${emma.coverage.dir}/coverage.html" /> </emmajava> </target>
La primera parte que es la compilación es similar a la compilación de la tarea junit, sólo cambia el directorio destino. En la segunda parte del script usamos el tag emmajava para que ejecute la clase org.farng.mp3.AllTestCase y analice únicamente los archivos de tipo org.farng.*. Al final genera los reportes en formatos txt, xml y html.
6. Abra una consola de comandos en el directorio del proyecto y ejecute el comando ant emma. Debe obtener un resultado similar al mostrado en las siguientes imágenes:
7. En el directorio emmaResults puede ver los resultados del reporte de cobertura, el formato HTML es el más legible.
8. Suba el archivo build.xml al repositorio haciendo clic derecho sobre él y seleccionando la opción Commit…. Este es un ejemplo del archivo después de las últimas modificaciones.
9. Vaya ahora a la página principal del Hudson que instaló y seleccione la opción Administrar Hudson —> Administrar Plugins.
10. Seleccione la pestaña Todos los plugins.
11. Busque Emma Plugin y selecciónelo.
12. Vaya al final de la página y seleccione Instalar.
13. Cuando finalice la instalación del plugin aparecerá un mensaje indicando que fue exitosa y que debe reiniciar la aplicación.
14. Reinicie el contenedor (Tomcat).
15. Ingrese a la página principal de Hudson y seleccione el proyecto BuildProyectoEjemplo y la opción Configurar. En la sección Acciones para ejecutar después seleccione Recoger informes de cobertura EMMA.
En la casilla Directorios o archivos donde Emma deja la información ingrese la ruta del reporte xml de Emma. En nuestro caso ProyectoEjemplo/emmaResults/coverage.xml.
Deje el resto de casillas en blanco para usar los valores por defecto.
16. En la misma página de configuración agregue la tarea emma en la sección Ejecutar Ant.
17. Guarde la nueva configuración y ejecute dos veces la tarea.
18. Vaya a la página principal del proyecto e ingrese a la nueva opción Tendencia de cobertura.
19. Esta opción le mostrará un gráfico con el reporte de tendencia de cobertura de codigo. En este caso las pruebas unitarias están cubriendo aproximadamente el 50% de las clases y métodos y el 62% - 63% de bloques y líneas de código.
19. Haga clic sobre el gráfico para ver más detalles del reporte.
20. Esta nueva opción le muestra detalles del cubrimiento de código de cada paquete.
21. Puede seleccionar el paquete para ver el porcentaje de cobertura por clase.
22. Seleccione un archivo para ver detalles por métodos, bloques y líneas.
23. Si desea ver con más detalle las líneas exactas por las que pasaron las pruebas, puede ver el reporte HTML generado cuando ejecutó las pruebas desde eclipse. La siguiente imagen muestra el tipo de detalle que se puede ver:
Las líneas resaltadas en verde fueron cubiertas por las pruebas unitarias. Las rojas en cambio indican que la prueba no pasó por esas porciones de código.
24. Hasta acá el taller de cobertura de código. Otros puntos en los que se puede profundizar es en definir las reglas que indiquen el porcentaje de líneas, métodos, bloques o clases que deben cubrir las pruebas unitaria para considerar el proyecto estable o también hay opciones para que importe el reporte HTML en la ejecución de la tarea.