我们有一个多项目,我们试图在我们的mvn网站构建中运行Cobertura测试覆盖率报告。我可以让Cobertura继续运行子项目,但它错误地报告0%的覆盖率,即使报告仍然突出显示单元测试所遇到的代码行。
我们正在使用mvn 2.0.8。我尝试过mvn clean site
,mvn clean site:stage
和mvn clean package site
。我知道测试正在运行,它们出现在surefire报告中(txt / xml和站点报告)。我在配置中遗漏了什么吗? Cobertura对多项目不合作吗?
这是父母.pom:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<inherited>true</inherited>
<executions>
<execution>
<id>clean</id>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<inherited>true</inherited>
</plugin>
</plugins>
</reporting>
我尝试在孩子中使用和不使用以下内容运行它.poms:
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
</plugin>
</plugins>
</reporting>
我在构建的输出中得到了这个:
...
[INFO] [cobertura:instrument]
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Instrumenting 3 files to C:\workspaces\sandbox\CommonJsf\target\generated-classes\cobertura
Cobertura: Saved information on 3 classes.
Instrument time: 186ms
[INFO] Instrumentation was successful.
...
[INFO] Generating "Cobertura Test Coverage" report.
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Cobertura: Loaded information on 3 classes.
Report time: 481ms
[INFO] Cobertura Report generation was successful.
报告看起来像这样:
答案 0 :(得分:1)
我没有成功地让Cobertura结合多个项目的报告。这通常是多项目报告的一个问题。
我们一直在评估sonar作为衡量指标报告的解决方案。它似乎在提供跨项目的摘要指标方面做得很好,包括多项目。
答案 1 :(得分:1)
我怀疑你在编译阶段错过了cobertura插件的执行,因此在测试运行后,代码只会在站点生命周期中由报告插件进行检测。因此,测试运行不会被选中,因为它们运行在非检测代码上。更仔细地分析您的构建日志 - 如果我是对的,您会注意到在cobertura:instrument之前执行了surefire测试。
我的配置与您的配置相似,但除了在pluginManagement中指定clean exectution(像您一样)之外,我还在build plugins部分中明确指定了cobertura插件:
<build>
...
<plugins>
...
<plugin>
<inherited>true</inherited>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>${cobertura.plugin.version}</version>
</plugin>
</plugins>
</build>
我的配置分类工作,所有Cobertura的东西都在全球组织范围的pom中,所有项目都用作父母。
这样项目不会在他们的pom.xml中指定与Cobertura相关的任何内容,但它们仍会生成覆盖报告。
答案 2 :(得分:1)
我实施的解决方案有点手动,但有效。它由几个步骤组成,其中一个步骤是组合由Cobertura生成的几个.ser文件。这可以通过在maven任务中使用cobertura-merge命令行工具来完成。
根据您显示的输出,文件实际上没有检测,它告诉只有3个文件被检测。
答案 3 :(得分:1)
@Marco是对的,只有当maven cobertura插件缺少合并目标时才能通过maven正常实现这一点。
您可以通过混合使用maven和ant目标来实现它:http://thomassundberg.wordpress.com/2012/02/18/test-coverage-in-a-multi-module-maven-project/
尽管如此,如果您有一个项目进度,则无需合并。您可以在测试项目中从正在测试的项目中复制.ser文件和已检测的类:
//in test project
<plugin>
<groupId>com.github.goldin</groupId>
<artifactId>copy-maven-plugin</artifactId>
<version>0.2.5</version>
<executions>
<execution>
<id>copy-cobertura-data-from-project-under-test</id>
<phase>compile</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${project.basedir}/../<project-under-test>/target/cobertura</directory>
<targetPath>${project.basedir}/target/cobertura</targetPath>
<includes>
<include>*.ser</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/../<project-under-test>/target/generated-classes/cobertura/</directory>
<targetPath>${project.basedir}/target/generated-classes/cobertura</targetPath>
<preservePath>true</preservePath>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
//in parent project
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<configuration>
<format>xml</format>
<aggregate>true</aggregate>
</configuration>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>${cobertura.version}</version>
</plugin>
</plugins>
</reporting>