2009-09-14 16 views
14

Estoy migrando un par de proyectos de una construcción de hormiga a una de maven. El servidor de compilación es, y seguirá siendo, Hudson.Cobertura de código de Java en Hudson

He tenido problemas para registrar la cobertura de código en hudson con cobertura debido al tests run and recorded twice problem.

El proyecto es de varios módulos y sería bueno, aunque no obligatorio, tener una salida agregada de los datos de cobertura del código.

Con todo, la solución que yo estoy buscando para el mosto:

pruebas
  • plazo automatizados para todos los módulos y registrar los resultados una vez ;
  • muestra la cobertura del código de módulo individual en Hudson;
  • se configuró fácilmente una vez para todo el proyecto, no en cada módulo.

La solución se puede basar en Cobertura, o Emma, ​​o cualquier otra herramienta de cobertura de código Java.


actualización: Ejecución de las pruebas con Emma todavía duplica los resultados y no hay merge capacidad, por lo que no es realmente utilizable con multi-módulo se basa.

Respuesta

1

Robert,

tuve este problema también y se encontró que Hudson no cumple una doble informe si la configuración del proyecto como un proyecto de estilo libre en lugar de un proyecto Maven2. Usted pierde algo de la bondad de tener un proyecto maven2, pero para nosotros, era un oficio que teníamos que hacer.

Jeff

+0

Gracias por la respuesta. Es bueno saberlo y tendré esto como la opción alternativa. –

+0

Claro. Además, no estoy 100% seguro, pero creo que lo que sucede es que el código instrumentado termina en el classpath antes del código no instrumentado y luego, cuando el plugin surefire ejecuta las pruebas unitarias, ejecuta el código instrumentado que da como resultado el los resultados se calculan dos veces. Si tiene otros complementos que ejecutan pruebas unitarias, verá multiplicada nuevamente la cantidad de pruebas. Puede ejecutar su compilación con mvn -X para obtener información de depuración que debe proporcionar el classpath. –

1

Utilizamos proyectos estilo libre y no tienen este problema, por lo que como se ha indicado, este puede ser el origen del problema.

Para proporcionar las características de fusión, creamos nuestro propio repositorio de artefactos (no estamos usando Maven). Al final de cada compilación, copiamos el archivo cobertura.ser a un recurso compartido de red, renombrándolo en el proceso. Tenemos un trabajo de vista consolidado que copia todos los archivos de cobertura y los archivos de código fuente (otro artefacto de construcción copiado en el recurso compartido de red) en el directorio de compilación local y genera el informe Cobertura.

La falta de un depósito de artefactos estándar dentro de Hudson es un poco frustrante, pero tiene sentido que los autores usen Maven para esas necesidades. Nuestro proceso de compilación se ejecuta en varios servidores, por lo que no podemos simplemente utilizar las rutas relativas en los otros directorios de trabajo.

Nota, hacemos lo mismo para otras métricas: resultados de las pruebas, JavaNCSS, ect. y se unió usando las herramientas correctas o algún código personalizado.

Usamos el mismo repositorio para artefactos de construcción tradicionales: DLL, JAR, scripts de instalación.

1

¿Has considerado Atlassian's Clover?

El complemento maven-clover2 tiene un nuevo objetivo: clover2:setup que simplemente instrumentará sus pruebas sin bifurcar el ciclo de vida, o ejecutar las pruebas dos veces.

Se podría definir los objetivos para funcionar en Hudson, así:

mvn clover2:setup verify clover2:aggregate clover2:clover 

El experto-clover2-plugin es absolutamente gratis para probar durante 30 días.

+0

Gracias por la respuesta. Consideré a Clover, pero AFAIK no funciona con el trabajo de M2 ​​Hudson, solo que con el estilo libre. –

+0

Hola Robert, Lo investigaré.Definitivamente funciona si usas un trabajo de experto en estilo libre. Cheers, Nick – npellow

6

Es un poco hackish, pero el enfoque que estoy usando es usar un modified version of the Maven cobertura plugin (que es available from their repo). Proporciona un objetivo de cobertura: generar informe, de modo que puede insertar cobertura: instrumento y cobertura: generar informe en su ciclo de vida antes y después de ejecutar las pruebas, respectivamente. Eso te dará los datos de cobertura que deseas sin la ejecución/grabación duplicada de la prueba.

El problema subyacente es que todos los complementos de cobertura Maven no trébol que he encontrado se basan en la idea de ejecutar las pruebas con cobertura por separado de la ejecución de la prueba principal en el ciclo de vida de Maven. Esto, obviamente, resulta en dos juegos de ejecuciones de prueba. Si está utilizando un proyecto de estilo libre, solo obtendrá un conjunto de pruebas grabadas (ya que, incluso con dos ejecuciones de prueba, solo hay una copia de la salida de prueba), pero el tipo de proyecto Maven en realidad intercepta las ejecuciones de Maven Mojo y registra los resultados/resultados de la prueba en el momento de la ejecución de la prueba, en lugar de hacerlo todos a la vez al final de la construcción, como lo hacen los proyectos de estilo libre. Esto tiene muchas ventajas, pero también tiene la desventaja más bien evidente de que una sola prueba que se ejecuta dos veces se cuenta como dos pruebas.

Dicho esto, aunque he visto fuertes argumentos para ejecutar pruebas tanto contra el código instrumentado como no instrumentado, prefiero ejecutar las pruebas solo una vez, contra código instrumentado, no solo por los problemas de Maven/Hudson, sino porque cuando tienes pruebas que duran 45 minutos, parece francamente tonto ejecutarlas dos veces para generar el mismo resultado.

+0

Parece interesante, gracias. –

+0

Los enlaces ya no funcionan, ¿quizás podría actualizarlos? ¡Gracias! – dhiller

1

Consulte la Cobertura de prueba SD Java para una herramienta de sobrecarga extremadamente baja con una buena GUI. No estoy seguro de entender su problema de "correr dos veces", pero si ejecutó las pruebas (el mismo determinista) dos veces con las herramientas SD, obtendrá los mismos datos de cobertura de prueba, por ejemplo, su idempotencia. Si sus pruebas no son deterministas, obtendrá dos ejecuciones de prueba diferentes, pero estas herramientas fusionan fácilmente los resultados de varias ejecuciones en un único resumen general.

También manejan aplicaciones extremadamente grandes, y manejan bastante bien las aplicaciones de múltiples hilos (las pequeñas astillas de temporización pueden hacer que la respuesta sea ligeramente incorrecta en teoría, pero practicar esto simplemente no es un problema).

+0

Gracias por la respuesta. ¿Hay algún cambio en un complemento maven para esta herramienta también? No pude encontrar uno. –

+0

Lo sentimos, no hay un plugin de maven. –

Cuestiones relacionadas