作为mvn网站构建的一部分,我们有一个多项目正在尝试运行Coverage测试覆盖率报告。 我可以让Cobertura在子项目上运行,但是它错误地报告了0%的覆盖率,即使报告仍然突出显示了单元测试中遇到的代码行。
我们正在使用mvn 2.0.8。 我尝试运行mvn clean site,mvn clean site:stage和mvn clean package site。 我知道测试正在运行,它们显示在surefire报告(txt / xml和站点报告)中。 我在配置中缺少什么吗? Coverage是否不适用于多项目?
这在父.pom中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
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>
cobertura-maven-plugin</artifactId>
<inherited>true</inherited>
</plugin>
</plugins>
</reporting> |
我尝试在子.poms中使用以下命令来运行它:
1 2 3 4 5 6 7 8
| <reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
cobertura-maven-plugin</artifactId>
</plugin>
</plugins>
</reporting> |
我在构建的输出中得到这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ...
[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. |
该报告如下所示:
@Marco是正确的,仅当maven coverage插件缺少合并目标时,才不可能通过maven正常实现此目标。
您可以通过混合Maven和蚂蚁目标来实现它:http://thomassundberg.wordpress.com/2012/02/18/test-coverage-in-a-multi-module-maven-project/
但是,如果您只有一个项目待测项目,则无需合并。您可以在测试项目中,从被测试项目中复制.ser文件和检测到的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| //in test project
<plugin>
<groupId>com.github.goldin</groupId>
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>
[cc]true</preservePath>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
//in parent project
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
cobertura-maven-plugin</artifactId>
<configuration>
<format>xml</format>
true</aggregate>
</configuration>
<executions>
<execution>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
cobertura-maven-plugin</artifactId>
<version>${cobertura.version}</version>
</plugin>
</plugins>
</reporting> |
我实现的解决方案有些手动,但是可行。它由几个步骤组成,一个步骤是合并Cobertura生成的多个.ser文件的步骤。这可以通过使用Maven任务中的cover-merge命令行工具来完成。
根据显示的输出,实际上没有检测到文件,它表明仅检测了3个文件。
我怀疑您在编译阶段缺少插件覆盖的执行,因此在测试运行之后,代码仅在站点生命周期中由报告插件检测。因此不会进行测试,因为它们是在非仪器代码上运行。更加仔细地分析您的构建日志-如果我是对的,您会注意到surefire测试是在coverage:instrument之前执行的。
我的配置与您的配置相似,但是除了在pluginManagement中指定干净执行(像您一样)之外,我还在build plugins部分中显式指定了插件覆盖范围:
1 2 3 4 5 6 7 8 9 10 11 12
| <build>
...
<plugins>
...
<plugin>
<inherited>true</inherited>
<groupId>org.codehaus.mojo</groupId>
cobertura-maven-plugin</artifactId>
<version>${cobertura.plugin.version}</version>
</plugin>
</plugins>
</build> |
我的配置排序有效,并且所有Cobertura内容都位于全局组织范围的pom中,所有项目都将其用作父项。
这样,项目不会在其pom.xml中指定任何与Cobertura相关的内容,但仍会生成覆盖率报告。
我并没有成功获得涵盖多个项目的报告的覆盖范围。对于多项目报告,这通常是一个问题。
我们一直在评估声纳,将其作为指标报告的解决方案。在跨项目(包括多项目)中提供摘要指标似乎做得很好。