Java 如何让Cobertura在低代码覆盖率的M2构建中失败
我正试图将我的WAR项目构建配置为在线路或分支覆盖率低于给定阈值时失败。我一直在使用优秀书籍第455页提供的配置,但没有成功。以下是我的项目Maven 2 POM的相关片段:Java 如何让Cobertura在低代码覆盖率的M2构建中失败,java,maven-2,build-automation,code-coverage,cobertura,Java,Maven 2,Build Automation,Code Coverage,Cobertura,我正试图将我的WAR项目构建配置为在线路或分支覆盖率低于给定阈值时失败。我一直在使用优秀书籍第455页提供的配置,但没有成功。以下是我的项目Maven 2 POM的相关片段: <build> ... <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactI
<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>
...
org.codehaus.mojo
cobertura maven插件
2.2
80
80
90
90
清洁的
检查
覆盖率测试
验证
清洁的
检查
au/**/*常数*
au/**/*常数*
...
...
正如我所说,覆盖率报告工作得很好,问题是如果线路或分支覆盖率低于我指定的阈值,“安装”目标并没有失败。有没有人能做到这一点?如果有,您的POM是什么样子的?您使用的是哪个版本的Cobertura和Maven?我正在使用Maven 2.0.9和Cobertura 2.2
我试过用谷歌搜索和阅读Cobertura文档,但没有成功(至少可以说后者很少)
<haltOnFailure>true</haltOnFailure>
真的
据我所知,如果
元素设置为true,并且任何指定的检查都失败,那么Cobertura将导致构建失败,这正是您所要求的。但实际上,如果您不指定该元素,则该元素默认为true
,这样您就不必将其添加到属性中。构建失败低于任何覆盖率阈值是(或至少应该是)默认行为
EDIT:我做了一些进一步的测试,haltOnFailure
似乎在我的环境(Maven 2.2.1.和插件版本2.3、2.2、2.1,即Linux上的cobertura版本1.9.2、1.9、1.8)中工作正常。我正在用下面的结果更新这个答案
实际上,我已经在pom中添加了一个
元素。我可能误解了的文档部分,该部分说它“默认绑定到生命周期阶段:verify
”,但是没有
元素,在我的构建的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>
我没有使用maven 2.0.9进行测试,但在我的机器上,
haltOnFailure
生成生成生成错误并停止生成。我看不出你的插件配置有什么不同,我无法重现你描述的行为 mvn clean install-Dcobertura.skip=true感谢您的回答,但我尝试了一下,结果没有成功。从我读到的关于该设置的内容来看,它决定了构建是否在测试失败时停止,而不是构建是否因为覆盖率低而失败(或停止)。它对你有用,还是你只是建议尝试一下?我用你的配置复制了你的成功,所以现在我只需要将它集成到我的实际项目中。顺便说一句,我的配置和你的配置之间有一些不同,例如,我的“执行”标签是我的“配置”标签的子标签,而你的是兄弟姐妹(如书中所述;我不知道为什么我会偏离这一点)。很高兴知道。事实上,配置是不同的,这实际上是一件好事:)我不知道我怎么会错过这一点。我知道这是一个非常古老的答案,但我只是想指出,在最新的文档中,如果您希望它失败,特别要求它将其设置为“true”。
$ 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] ------------------------------------------------------------------------
$