关于Maven 2:Maven站点构建期间的Maven2多项目覆盖率报告问题

Maven2 Multiproject Cobertura Reporting Problems During mvn site Build

作为mvn网站构建的一部分,我们有一个多项目正在尝试运行Coverage测试覆盖率报告。 我可以让Cobertura在子项目上运行,但是它错误地报告了0%的覆盖率,即使报告仍然突出显示了单元测试中遇到的代码行。

我们正在使用mvn 2.0.8。 我尝试运行mvn clean sitemvn clean site:stagemvn 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.

该报告如下所示:
cobertura report


@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相关的内容,但仍会生成覆盖率报告。


我并没有成功获得涵盖多个项目的报告的覆盖范围。对于多项目报告,这通常是一个问题。

我们一直在评估声纳,将其作为指标报告的解决方案。在跨项目(包括多项目)中提供摘要指标似乎做得很好。


推荐阅读