Maven 2 maven多模块项目上的cobertura

Maven 2 maven多模块项目上的cobertura,maven-2,cobertura,Maven 2,Cobertura,我有一个Maven项目,有4个模块,其中3个包含代码和一些测试(测试类的equals和hashcode),而第4个模块用于测试其他3个模块 现在,我想运行cobertura代码覆盖率工具,以了解哪些类经过良好测试,哪些类没有经过良好测试。我在这个主题上做了一些调查,似乎cobertura没有意识到生成正确的代码覆盖率百分比和行覆盖率,如果测试的一些源位于其他模块中 我已经阅读了一些链接,如和,但必须有一个开箱即用的解决方案。有人能报告一些关于这个话题的新方向吗?还是有更好的工具,比如cobert

我有一个Maven项目,有4个模块,其中3个包含代码和一些测试(测试类的equals和hashcode),而第4个模块用于测试其他3个模块

现在,我想运行cobertura代码覆盖率工具,以了解哪些类经过良好测试,哪些类没有经过良好测试。我在这个主题上做了一些调查,似乎cobertura没有意识到生成正确的代码覆盖率百分比和行覆盖率,如果测试的一些源位于其他模块中


我已经阅读了一些链接,如和,但必须有一个开箱即用的解决方案。有人能报告一些关于这个话题的新方向吗?还是有更好的工具,比如cobertura?我偶然发现了emma,但这个工具不提供行覆盖率…

有一些插件可以聚合Cobertura(和其他)报告。查看和插件。也有,但有点笨重

FWIW Emma确实这样做。

根据,maven cobertura插件仍然不知道如何将子模块的报告聚合到一个合并的报告中。在maven cobertura插件(请参阅)上实现
merge
目标已经做了一些工作,但是该插件中还没有包含这段代码。我没有亲自测试这个补丁,也说不出是否值得一试


因此,很多人确实建议使用maven,但我个人会远离它,因为从长远来看,它不是很令人满意,我面临着很多问题(技术问题、失去历史等等)。相反,我强烈推荐。看一看最新版本Sonar的公共实例,了解该工具的实时演示。例如,请参见项目和。

由于这个答案,我可以实现与您所需非常相似的功能:

我刚刚添加了
sources
,cobertura也包含了依赖项中的类


问候。

我们这里没有声纳,现在无法安装。所以我必须找到一个解决办法,找到一个。此解决方案与多模块项目中的一个简单的
mvn清洁安装-DrunCobertura=true
配合使用。您只需将此配置文件添加到项目的
super pom.xml
,定义
working.dir
属性,它就可以工作了

<profile>
    <id>runCobertura</id>
    <activation>
        <property>
            <name>runCobertura</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <cobertura.format>html</cobertura.format>
        <cobertura.working.dir>${working.dir}/${project.version}/cobertura</cobertura.working.dir>
        <cobertura.complete.ser.file>${cobertura.working.dir}/complete.ser</cobertura.complete.ser.file>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <inherited>false</inherited>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>.</directory>
                            <includes>
                                <include>cobertura.ser</include>
                            </includes>
                        </fileset>
                        <fileset>
                                <directory>${cobertura.working.dir}</directory>
                            </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>cobertura-Instrument</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <if>
                                    <available file="${project.build.outputDirectory}"/>
                                    <then>
                                        <cobertura-instrument>
                                            <fileset dir="${project.build.outputDirectory}">
                                                <include name="**/*.class"/>
                                            </fileset>
                                        </cobertura-instrument>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <id>cobertura-createCombinedSerFile</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <if>
                                    <available file="${cobertura.complete.ser.file}"/>
                                    <then>
                                        <cobertura-merge datafile="${basedir}/tmp.ser">
                                            <fileset file="${cobertura.complete.ser.file}"/>
                                            <fileset file="${basedir}/cobertura.ser"/>
                                        </cobertura-merge>
                                        <move file="${basedir}/tmp.ser" tofile="${basedir}/cobertura.ser"/>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <id>cobertura-copyResultSerFileAndSources</id>
                        <phase>test</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <if>
                                    <available file="${basedir}/cobertura.ser"/>
                                    <then>
                                        <move file="${basedir}/cobertura.ser" tofile="${cobertura.complete.ser.file}"/>
                                        <mkdir dir="${cobertura.working.dir}/source"/>
                                        <if>
                                            <available file="${basedir}/src/main/java"/>
                                            <then>
                                                <copy todir="${cobertura.working.dir}/source">
                                                    <fileset dir="src/main/java">
                                                        <include name="**/*.java"/>
                                                    </fileset>
                                                </copy>
                                            </then>
                                        </if>
                                        <cobertura-report datafile="${cobertura.complete.ser.file}" format="${cobertura.format}" destdir="${cobertura.working.dir}/report">
                                            <fileset dir="${cobertura.working.dir}/source"/>
                                        </cobertura-report>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>net.sourceforge.cobertura</groupId>
                        <artifactId>cobertura</artifactId>
                        <version>1.9.4.1</version>
                    </dependency>
                    <dependency>
                        <groupId>ant-contrib</groupId>
                        <artifactId>ant-contrib</artifactId>
                        <version>20020829</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>net.sourceforge.cobertura</groupId>
            <artifactId>cobertura</artifactId>
            <version>1.9.4.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</profile>

伦科贝图拉
伦科贝图拉
真的
html
${working.dir}/${project.version}/cobertura
${cobertura.working.dir}/complete.ser
org.apache.maven.plugins
maven清洁插件
2.4.1
假的
.
科贝图拉
${cobertura.working.dir}
org.apache.maven.plugins
maven antrun插件
1.7
科贝图拉仪器
进程类
跑
cobertura创建了CombinedSerFile
生成测试源
跑
cobertura copyResultSerFileAndSources
测试
跑
        http://dl.dropbox.com/u/9940067/code/multi-module-cobertura.zip 
  mvn -PrunCobertura clean install      # gives you the aggregate reports.
<profiles>
<profile>
    <id>runCobertura</id>
    <activation>
        <property>
            <name>runCobertura</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <cobertura.format>html</cobertura.format>
        <working.dir>/tmp</working.dir>
        <cobertura.working.dir>${working.dir}/${project.version}/cobertura</cobertura.working.dir>
        <cobertura.complete.ser.file>${cobertura.working.dir}/complete.ser</cobertura.complete.ser.file>

        <!-- scope which determines whether or not cobertura is included in .war file: overriden here -->
        <cobertura.dependency.scope>compile</cobertura.dependency.scope>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <inherited>false</inherited>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>.</directory>
                            <includes>
                                <include>**/cobertura.ser</include>
                            </includes>
                        </fileset>
                        <fileset>
                                <directory>${cobertura.working.dir}</directory>
                            </fileset>
                    </filesets>
                </configuration>
            </plugin>




            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>cobertura-Instrument</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <echo message="::PROCESS CLASSES: ${artifactId}"/>

                                <if>
                                  <equals arg1="${artifactId}" arg2="web-test-driver-for-code-coverage" />
                                    <then>
                                        <echo message="::SKIPPING PHASE for integration test"/>
                                    </then>
                                    <else>
                                        <if>
                                            <available file="${project.build.outputDirectory}"/>
                                            <then>
                                                <echo message="::BEFORE INSTRUMENT"/>
                                                <cobertura-instrument>
                                                    <fileset dir="${project.build.outputDirectory}">
                                                        <include name="**/*.class"/>
                                                    </fileset>
                                                </cobertura-instrument>
                                            </then>
                                        </if>
                                    </else>
                                </if>


                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <id>cobertura-createCombinedSerFile</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
                                <echo message=":::generate-test-sources"/>


                                <if>
                                  <equals arg1="${artifactId}" arg2="web-test-driver-for-code-coverage" />
                                    <then>
                                        <echo message="::SHORT CIRCUIT COMBINE PHASE for integration test"/>
                                        <echo  message="source - ${cobertura.complete.ser.file} dest - ${basedir}/cobertura.ser"/>
                                        <copy file="${cobertura.complete.ser.file}" tofile="${basedir}/cobertura.ser"/>
                                    </then>
                                    <else>
                                        <if>
                                            <available file="${basedir}/cobertura.ser"/>
                                            <then>
                                                <echo message="::: Is available ${basedir}/cobertura.ser"/>
                                            </then>
                                        </if>

                                        <if>
                                            <available file="${cobertura.complete.ser.file}"/>
                                            <then>
                                                <echo message="before merge1"/>
                                                <cobertura-merge datafile="${basedir}/tmp.ser">
                                                    <fileset file="${cobertura.complete.ser.file}"/>
                                                    <fileset file="${basedir}/cobertura.ser"/>
                                                </cobertura-merge>
                                                <echo message="move temp.ser to ${basedir}/cobertura.ser"/>
                                                <move file="${basedir}/tmp.ser" tofile="${basedir}/cobertura.ser"/>
                                            </then>
                                        </if>
                                    </else>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                    <execution>
                        <id>cobertura-copyResultSerFileAndSources</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <target>
                                <taskdef resource="tasks.properties"/>
                                <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

                                <echo message=":::copyResultSerFileAndSources -beforeIf"/>
                                <if>
                                    <available file="${basedir}/cobertura.ser"/>
                                    <then>
                                        <echo message="move1"/>
                                        <move file="${basedir}/cobertura.ser" tofile="${cobertura.complete.ser.file}"/>
                                        <mkdir dir="${cobertura.working.dir}/source"/>
                                        <if>
                                            <available file="${basedir}/src/main/java"/>
                                            <then>
                                                <copy todir="${cobertura.working.dir}/source">
                                                    <fileset dir="src/main/java">
                                                        <include name="**/*.java"/>
                                                    </fileset>
                                                </copy>
                                            </then>
                                        </if>
                                        <echo message="runreport"/>
                                        <cobertura-report datafile="${cobertura.complete.ser.file}" format="${cobertura.format}" destdir="${cobertura.working.dir}/report">
                                            <fileset dir="${cobertura.working.dir}/source"/>
                                        </cobertura-report>
                                    </then>
                                </if>
                            </target>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>net.sourceforge.cobertura</groupId>
                        <artifactId>cobertura</artifactId>
                        <version>1.9.4.1</version>
                    </dependency>
                    <dependency>
                        <groupId>ant-contrib</groupId>
                        <artifactId>ant-contrib</artifactId>
                        <version>20020829</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>net.sourceforge.cobertura</groupId>
            <artifactId>cobertura</artifactId>
            <version>1.9.4.1</version>
        </dependency>
    </dependencies>
</profile>
</profiles>
mvn clean compile
ant instrument
mvn test
ant report
<reporting>
<plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <outputDirectory>./target/tmpCobertura</outputDirectory>
        <formats>
            <format>html</format>
        </formats>
        <aggregate>true</aggregate>
    </configuration>
  </plugin>
</plugins>
</reporting>