【问题标题】:EMMA code coverage for all modules所有模块的 EMMA 代码覆盖率
【发布时间】:2014-01-20 01:49:40
【问题描述】:

我是 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”的目录下的每个模块生成单独的覆盖率报告。有没有办法可以将所有这些报告合并到一个报告中? 任何指针..?

【问题讨论】:

    标签: maven emma


    【解决方案1】:

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

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

    2. 创建新模块“覆盖”以附加 Jacoco 插件的所有结果……这只是一次性的事情。

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

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

    5. 如果模块有任何测试用例,将为该模块生成'jacoco.exec'文件(该文件包含报告所需的所有覆盖率信息),此时也会生成单个模块代码覆盖率报告(在\target\site\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> 
      

    【讨论】:

      【解决方案2】:

      有没有什么方法可以对 ant 报告任务中的多个子模块进行通用处理?指定确切的目录可以正常工作,但不能 ** dirset 引用。这工作正常:

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

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

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

      这些不起作用(0 类,或“创建报告时出错”,没有更多详细信息):

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

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

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

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

      有趣的是,sourcefile ** references 产生了 HTML 源链接 OK,我认为它的工作方式与类文件完全相同:

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

      这不起作用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        相关资源
        最近更新 更多