Как заставить Cobertura отказаться от сборки M2 из-за низкого покрытия кода

Я пытаюсь настроить сборку моего проекта WAR на сбой, если покрытие линии или ветви ниже заданных пороговых значений. Я использовал конфигурацию, представленную на странице 455 превосходной книги Java Power Tools, но без успех. Вот соответствующий фрагмент моего проекта Maven 2 POM:

<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>

Как я уже сказал, отчет о покрытии работает нормально, проблема в том, что цель установки не терпит неудачу, как должно, если покрытие линии или ответвления ниже заданных пороговых значений. У кого-нибудь это работает, и если да, то как выглядит ваш POM и какую версию Cobertura и Maven вы используете? Я использую Maven 2.0.9 и Cobertura 2.2.

Я пробовал искать в Google и читать документы Cobertura, но безуспешно (последних, мягко говоря, немного).


person Community    schedule 13.10.2008    source источник


Ответы (3)


Насколько мне известно, если для элемента <haltOnFailure> задано значение true и какая-либо из указанных проверок не пройдена, Cobertura приведет к сбою сборки, о чем вы и просите. Но на самом деле этот элемент по умолчанию имеет значение true, если вы его не укажете, поэтому вам не нужно добавлять его в ваш проверки конфигурации. Сбой сборки ниже любого порога покрытия является (или, по крайней мере, должен быть) поведением по умолчанию.

РЕДАКТИРОВАТЬ: я провел дополнительное тестирование, и haltOnFailure, похоже, работает в моей среде должным образом (Maven 2.2.1. и версии 2.3, 2.2, 2.1 плагина, т.е. версии 1.9.2, 1.9, 1.8). cobertura для Linux). Я обновляю этот ответ с результатом ниже.

На самом деле, я добавил элемент <execution> в свой pom. Я могу неправильно истолковать часть документации cobertura:check. в котором говорится, что "по умолчанию привязывается к фазе жизненного цикла: verify", но без элемента <execution> cobertura:check не запускался на этапе verify моей сборки. Ниже настройки, которые я использую для плагина cobertura-maven:

<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>

Я получаю следующий результат при запуске mvn clean install в только что созданном проекте maven (с mvn archetype:create), исправленном с помощью упомянутой выше конфигурации плагина:

$ 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] ------------------------------------------------------------------------
$ 

Я не тестировал maven 2.0.9, но на моей машине haltOnFailure генерирует ОШИБКУ СБОРКИ и останавливает сборку. Я не вижу никаких различий с вашей конфигурацией плагина, я не могу воспроизвести описанное вами поведение.

person Community    schedule 24.10.2009
comment
Я воспроизвел ваш успех, используя вашу конфигурацию, так что теперь мне просто нужно интегрировать ее в свои реальные проекты. Кстати, между моей конфигурацией и вашей есть несколько отличий, например. мой тег выполнения является дочерним по отношению к моему тегу конфигурации, тогда как ваш является родственным (как в книге; я не знаю, почему я отклонился от этого). - person Andrew Swan; 28.10.2009
comment
Рад знать. И действительно, конфигурации разные, что на самом деле хорошо :) Не знаю, как я это пропустил. - person Pascal Thivent; 28.10.2009
comment
Я знаю, что это очень старый ответ, но я просто подумал указать, что в последней документации специально предлагается установить для него значение true, если вы хотите, чтобы он не работал. mojohaus.org/cobertura-maven-plugin/check-mojo.html< /а> - person Aditya K; 04.04.2017

Добавьте следующее в конфигурацию ‹check/›.

<haltOnFailure>true</haltOnFailure>
person Brian Matthews    schedule 13.10.2008
comment
Спасибо за ответ, но я пробовал, и это не сработало. Судя по тому, что я читал об этом параметре, он определяет, останавливается ли сборка при сбое теста, а не отказывает ли сборка (или останавливается) из-за низкого охвата. Это работает для вас, или вы просто предложили что-то попробовать? - person Andrew Swan; 13.10.2008

mvn чистая установка -Dcobertura.skip=true

person Community    schedule 03.07.2018