在姜黄项目中,我们每晚维护一个仪表板。
在仪表板上,我们收集有关项目的统计信息,包括代码覆盖率,findbugs分析和其他指标。
我们一直在使用Maven EMMA插件来提供代码覆盖,但是遇到了EMMA问题。
在对类进行检测后,这会导致测试失败。
因此,由于在构建过程中需要准确的测试结果,因此我们禁用了代码覆盖率。
但是,我们仍然需要覆盖代码,更重要的是,我们还需要覆盖现有测试套件,这实际上是一个集成测试套件,而不是单元测试套件。
Cobertura和EMMA插件实际上都是设计用于单元测试的。 因此,我们必须解决该限制。
- 首先,我们需要对类进行检测。
- 其次,我们需要打包检测的类,并在以后的构建中使用它们。
- 需要告诉集成测试为其使用依赖的检测类。
- 生成结果的XML报告。
我尝试过这样做,但又不依赖于ant,但是每次我尝试使用maven-site-plugin并将其配置为生成报告时,都会抱怨cobertura:check没有正确配置。 在我们的情况下,我不需要运行检查,只需要生成的报告即可。 于是Ant和AntContrib得以营救。 以下是我想出的完整的Maven个人资料:
<profile>
<id>cobertura</id>
<dependencies>
<dependency>
<groupId>net.sourceforge.cobertura</groupId>
<artifactId>cobertura</artifactId>
<optional>true</optional>
<version>1.9.4.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<instrumentation>
<excludes>
<exclude>org/ebayopensource/turmeric/test/**/*.class</exclude>
<exclude>org/ebayopensource/turmeric/common/v1/**/*.class</exclude>
</excludes>
</instrumentation>
</configuration>
<executions>
<execution>
<id>cobertura-instrument</id>
<phase>process-classes</phase>
<goals>
<goal>instrument</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>cobertura-jar</id>
<phase>post-integration-test</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>cobertura</classifier>
<classesDirectory>${basedir}/target/generated-classes/cobertura</classesDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.3.1</version>
<executions>
<execution>
<id>cobertura-install</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
<configuration>
<classifier>cobertura</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>verify</phase>
<configuration>
<tasks>
<taskdef classpathref='maven.runtime.classpath'
resource='tasks.properties' />
<taskdef classpathref='maven.runtime.classpath'
resource='net/sf/antcontrib/antcontrib.properties' />
<available
file='${project.build.directory}/cobertura/cobertura.ser'
property='ser.file.exists' />
<if>
<equals arg1='${ser.file.exists}'
arg2='true' />
<then>
<echo message='Executing cobertura report' />
<mkdir
dir='${project.build.directory}/site/cobertura' />
<cobertura-report
format='xml'
destdir='${project.build.directory}/site/cobertura'
datafile='${project.build.directory}/cobertura/cobertura.ser' />
</then>
<else>
<echo message='No SER file found.' />
</else>
</if>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>20020829</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
注意:请勿在此配置文件中使用cobertura:cobertura目标。 由于它将尝试对类进行两次检测,因此构建将失败。
必须使用Ant和AntContrib,因为没有cobertura:report目标,因为它希望在网站生成阶段运行。 但是,这会导致检查目标也可以运行,而我们则不需要。 因此,也许,我将制作一个补丁以添加报告目标,以便仅运行报告而不必运行站点目标。 希望这对某些人有帮助,因为我为此花费了很多时间。
祝您编程愉快,别忘了分享!
参考: Intelligent Cramps博客上的JCG合作伙伴 David Carver 使用Cobertura和Maven为集成和单元测试启用代码覆盖率 。
翻译自: https://www.javacodegeeks.com/2012/09/cobertura-and-maven-code-coverage-for.html