所有模块的EMMA代码覆盖率

时间:2014-01-20 01:49:41

标签: maven emma

我是maven的新手,我们的项目有几个模块。我的目标是为整个项目(包含所有模块)生成一个覆盖率报告。下面是我们基于项目的POM.xml

的粗略骨架
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>1.0.0</modelVersion>
<groupId>com.xx.test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>test</name>

<modules>
    <module>module1</module>
    <module>module2</module>
    <module>module3</module>
    <module>module4</module>
    <module>module5</module>        
</modules>

<build>
    .
    .
    .

</build>
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>emma-maven-plugin</artifactId>
            <version>1.0-alpha-3</version>
        </plugin>
    </plugins>
</reporting>
</project>

如上所示,我添加了emma插件并执行以下内容:mvn emma:emma 这将为名为“target”的目录下的每个模块生成单独的覆盖率报告。有没有办法可以将所有这些报告整合到一个报告中? 任何指针..?

2 个答案:

答案 0 :(得分:2)

以下是实现所需结果的方法

  1. 将JaCoCo插件添加到父pom.xml中,以便所有项目都可以生成覆盖率报告。

  2. 创建新模块'coverage'以附加Jacoco插件的所有结果......这只是一次性事情。

  3. 在此新模块的pom.xml中,插入所需的插件以加入所有覆盖信息   一个。定义所有类,源,生成源等所有属性,因为JaCoCo报告插件需要您设置构建目录,类目录,源目录或生成源目录的位置   湾我们正在使用Maven的ANT任务。 JaCoCo Ant任务将合并来自多个JaCoCo文件结果的结果

  4. 现在从父pom.xml运行:mvn clean install

  5. 如果模块有任何测试用例,将为该模块生成“jacoco.exec”文件(此文件具有报告所需的所有覆盖信息),此时也会生成单个模块代码覆盖率报告(在\目标\站点\ jacoco)
  6. 最后从'coverage'pom.xml运行:mvn clean install  一个。这将在maven中运行ANT报告任务,该任务将获取所有模块的所有生成的'jacoco.exec'文件,合并结果并生成报告。 以下是可以在maven中运行的ANT报告目标

    <?xml version="1.0" encoding="UTF-8" ?>
    <project name="maven-antrun-" default="main"  >
    <target name="main">
    <echo message="Generating JaCoCo Reports"/>
    <taskdef name="report" classname="org.jacoco.ant.ReportTask">
    <classpath path="./target/jacoco-jars/org.jacoco.ant.jar"/>
    </taskdef>
    <mkdir dir="./target/coverage-report"/>
    <report>
    <executiondata>
      <fileset dir="../module1/target">
        <include name="jacoco.exec"/>
      </fileset>
      <fileset dir="../module2/target">
        <include name="jacoco.exec"/>
      </fileset>
    
    </executiondata>
    <structure name="Project Code Coverage">
      <group name="project">
        <classfiles>
          <fileset dir="../module1/target/classes"/>
          <fileset dir="../module2/target/classes"/>
    
        </classfiles>
        <sourcefiles encoding="UTF-8">
          <fileset dir="../module1/src/main/java"/>
          <fileset dir="../module2/src/main/java"/>          
        </sourcefiles>
      </group>
    </structure>
    <html destdir="./target/coverage-report/html"/>
    <xml destfile="./target/coverage-report/coverage-report.xml"/>
    <csv destfile="./target/coverage-report/coverage-report.csv"/>
    </report>
    </target>
    </project> 
    

答案 1 :(得分:0)

对于ant报告任务中的多个子模块,有没有办法一般地执行此操作?指定确切的目录可以正常工作,但不能** dirset引用。这没关系:

<classfiles>
    <dirset dir="${basedir}">
        <include name="module1/target/classes"/>
        <include name="module2/target/classes"/>

OR

<dirset dir="">
    <include name="module1/target/classes"/>
    <include name="module2/target/classes"/>

OR

<dirset dir="" includes="module1/target/classes,module2/target/classes"/>

这些不起作用(0个类,或者在创建报告时出现错误&#39;没有进一步的详细信息):

<dirset dir="">
  <include name="**/target/classes"/>

OR

<dirset dir="${basedir}">
  <include name="**/target/classes"/>

OR

<dirset dir="" includes="**/target/classes"/>

OR

<dirset dir="${basedir}" includes="**/target/classes"/>

有趣的是,sourcefile **引用生成HTML源链接OK,我认为它与classfiles完全相同:

<sourcefiles>
    <dirset dir="" includes="**/src/main/java"/>

这不起作用:

<sourcefiles>
    <dirset dir="${basedir}" includes="**/src/main/java"/>