2008-10-13 21 views
8

Estoy intentando configurar mi build de proyecto WAR para que falle si la cobertura de línea o rama está por debajo de los umbrales dados. He estado usando la configuración proporcionada en la página 455 del excelente libro Java Power Tools, pero sin éxito. He aquí el fragmento correspondiente de Maven 2 POM de mi proyecto:Cómo hacer que Cobertura falle M2 build para cobertura de código bajo

<build> 
... 
<plugins> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>cobertura-maven-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 
     <check> 
     <!-- Per-class thresholds --> 
     <lineRate>80</lineRate> 
     <branchRate>80</branchRate> 
     <!-- Project-wide thresholds --> 
     <totalLineRate>90</totalLineRate> 
     <totalBranchRate>90</totalBranchRate> 
     </check> 
     <executions> 
     <execution> 
      <goals> 
      <goal>clean</goal> 
      <goal>check</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>coverage-tests</id> 
      <!-- The "verify" phase occurs just before "install" --> 
      <phase>verify</phase> 
      <goals> 
      <goal>clean</goal> 
      <goal>check</goal> 
      </goals> 
     </execution> 
     </executions> 
     <instrumentation> 
     <excludes> 
     <exclude>au/**/*Constants.*</exclude> 
     </excludes> 
     <ignores> 
     <ignore>au/**/*Constants.*</ignore> 
     </ignores> 
     </instrumentation> 
    </configuration> 
    </plugin> 
    ... 
</plugins> 
... 
</build> 

Como digo, el informe de cobertura funciona bien, el problema es que el objetivo "instalar" no está fallando como debe ser si la línea o rama de cobertura está por debajo de mis umbrales especificados. ¿Alguien tiene esto funcionando, y si es así, cómo es tu POM y qué versión de Cobertura y Maven estás usando? Estoy usando Maven 2.0.9 y Cobertura 2.2.

He intentado buscar en Google y leer los documentos Cobertura, pero no tuve suerte (estos últimos son escasos por decir lo menos).

Respuesta

15

Que yo sepa, si el elemento <haltOnFailure> se establece en true y cualquiera de los controles especificados falla, entonces Cobertura hará que la construcción falle que es lo que está pidiendo. Pero en realidad, este elemento se establece de manera predeterminada en true si no lo especifica, por lo que no tiene que agregarlo a en su configuration checks. Si falla la compilación debajo de cualquier límite de cobertura, (o al menos debería ser) el comportamiento predeterminado.

EDIT: he hecho un poco más pruebas y haltOnFailure parece estar funcionando como se esperaba en mi entorno (Maven 2.2.1 y las versiones 2.3, 2.2, 2.1 del plugin es decir, versiones 1.9.2, 1.9, 1.8 del. cobertura en Linux). Estoy actualizando esta respuesta con el resultado a continuación.

En realidad, he agregado un elemento <execution> a mi pom. Se me puede malinterpretando la parte de la documentación cobertura:check 's que dice que 'liga de manera predeterminada a la fase del ciclo de vida: verify', pero, sin el elemento <execution>, cobertura:check no era activa durante la fase de verificar de mi construcción. Por debajo de la configuración tengo uso para la Cobertura-maven-plugin:

<project> 
    ... 
    <build> 
    ... 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>cobertura-maven-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
      <check> 
      <!--<haltOnFailure>true</haltOnFailure>--><!-- optional --> 
      <!-- Per-class thresholds --> 
      <lineRate>80</lineRate> 
      <branchRate>80</branchRate> 
      <!-- Project-wide thresholds --> 
      <totalLineRate>90</totalLineRate> 
      <totalBranchRate>90</totalBranchRate> 
      </check> 
     </configuration> 
     <executions> 
      <execution> 
      <phase>verify</phase> 
      <goals> 
       <!--<goal>clean</goal>--><!-- works if uncommented --> 
       <goal>check</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

me sale el siguiente resultado cuando se ejecuta mvn clean install en un proyecto Maven recién generados (con mvn archetype:create) conectado con la configuración del complemento mencionado anteriormente:

$ mvn archetype:create -DgroupId=com.mycompany.samples -DartifactId=cobertura-haltonfailure-testcase 
... 
$ mvn clean install 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building cobertura-haltonfailure-testcase 
[INFO] task-segment: [clean, install] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [clean:clean {execution: default-clean}] 
[INFO] Deleting directory /home/pascal/Projects/cobertura-haltonfailure-testcase/target 
[INFO] [resources:resources {execution: default-resources}] 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/cobertura-haltonfailure-testcase/src/main/resources 
[INFO] [compiler:compile {execution: default-compile}] 
[INFO] Compiling 1 source file to /home/pascal/Projects/cobertura-haltonfailure-testcase/target/classes 
[INFO] [resources:testResources {execution: default-testResources}] 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/cobertura-haltonfailure-testcase/src/test/resources 
[INFO] [compiler:testCompile {execution: default-testCompile}] 
[INFO] Compiling 1 source file to /home/pascal/Projects/cobertura-haltonfailure-testcase/target/test-classes 
[INFO] [surefire:test {execution: default-test}] 
[INFO] Surefire report directory: /home/pascal/Projects/cobertura-haltonfailure-testcase/target/surefire-reports 

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.mycompany.samples.AppTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.09 sec 

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 

[INFO] [jar:jar {execution: default-jar}] 
[INFO] Building jar: /home/pascal/Projects/cobertura-haltonfailure-testcase/target/cobertura-haltonfailure-testcase-1.0-SNAPSHOT.jar 
[INFO] Preparing cobertura:check 
[WARNING] Removing: check from forked lifecycle, to prevent recursive invocation. 
[INFO] [resources:resources {execution: default-resources}] 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/cobertura-haltonfailure-testcase/src/main/resources 
[INFO] [compiler:compile {execution: default-compile}] 
[INFO] Nothing to compile - all classes are up to date 
[INFO] [cobertura:instrument {execution: default}] 
[INFO] Cobertura 1.9.2 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file 
Instrumenting 1 file to /home/pascal/Projects/cobertura-haltonfailure-testcase/target/generated-classes/cobertura 
Cobertura: Saved information on 1 classes. 
Instrument time: 337ms 

[INFO] Instrumentation was successful. 
[INFO] [resources:testResources {execution: default-testResources}] 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/cobertura-haltonfailure-testcase/src/test/resources 
[INFO] [compiler:testCompile {execution: default-testCompile}] 
[INFO] Nothing to compile - all classes are up to date 
[INFO] [surefire:test {execution: default-test}] 
[INFO] Surefire report directory: /home/pascal/Projects/cobertura-haltonfailure-testcase/target/surefire-reports 

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.mycompany.samples.AppTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.098 sec 

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 

[INFO] [cobertura:check {execution: default}] 
[INFO] Cobertura 1.9.2 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file 
Cobertura: Loaded information on 1 classes. 

[ERROR] com.mycompany.samples.App failed check. Line coverage rate of 0.0% is below 80.0% 
Project failed check. Total line coverage rate of 0.0% is below 90.0% 

[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Coverage check failed. See messages above. 
[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 18 seconds 
[INFO] Finished at: Sat Oct 24 21:00:39 CEST 2009 
[INFO] Final Memory: 17M/70M 
[INFO] ------------------------------------------------------------------------ 
$ 

No probé con maven 2.0.9, pero en mi máquina, haltOnFailure genera un BUILD ERROR y detiene la compilación. No veo ninguna diferencia con la configuración de tu complemento. No puedo reproducir el comportamiento que describes.

+0

He replicado su éxito usando su configuración, así que ahora solo tengo que integrarlo en mis proyectos reales. Por cierto, hay varias diferencias entre mi configuración y la tuya, p. mi etiqueta de "ejecuciones" es un elemento secundario de mi etiqueta de "configuración", mientras que la tuya es un hermano (como en el libro, no sé por qué me desvié de eso). –

+0

Me alegra saber.Y, de hecho, la configuración es diferente, lo que en realidad es algo bueno :) No sé cómo me lo perdí. –

+0

Sé que esta es una respuesta muy antigua, pero solo pensé en señalar que en la documentación más reciente, se solicita específicamente que se establezca como "verdadera" si se quiere que falle. http://www.mojohaus.org/cobertura-maven-plugin/check-mojo.html –

3

Agregue lo siguiente a la configuración < check/>.

 
<haltOnFailure>true</haltOnFailure> 
+0

Gracias por responder, pero lo intenté y no funcionó. Por lo que he leído sobre esa configuración, determina si la compilación se detiene ante una falla de prueba, no si la compilación falla (o se detiene) debido a la baja cobertura. ¿Está funcionando para ti o solo sugieres algo para probar? –

Cuestiones relacionadas