【问题标题】:How to properly run Eclemma coverage with Java如何使用 Java 正确运行 Eclemma 覆盖
【发布时间】:2020-02-26 09:23:47
【问题描述】:

我们使用非 java 测试。他们每个人都执行我们用 Java 编写的工具。 我正在尝试使用 Eclemma 创建测试的覆盖率报告。 让我们从一项测试开始。我们使用build.xml 编译代码。我想以某种方式为每个测试创建一个覆盖率报告,然后将它们合并到一个主报告中。 我发现我可以使用Jacoco has CMD interface 来合并这些报告。但我不明白如何使用覆盖包运行该工具?

  1. 我应该使用哪个覆盖包?是 Eclemma 还是 Jacoco?
  2. 如何使用覆盖包运行该工具?我应该将它添加到 build.xml 文件中吗?我应该将它添加到命令行吗?

我对 Java 中覆盖的整个概念有点困惑。在 Python 和 Perl 等动态语言中,我只是使用覆盖率模块执行代码,从而创建覆盖率报告。

我们用来执行out tool的命令:

gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData -configuration /ganduInternalConfig --session_id 1582722179

我应该添加一些选项吗?

build.xml 中的构建:

<target name="pde-build" depends="clean, init">
    <java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true">
        <arg value="-application" />
        <arg value="org.eclipse.ant.core.antRunner" />
        <arg value="-buildfile" />
        <arg value="${eclipseLocation}/plugins/org.eclipse.pde.build_${pdeBuildPluginVersion}/scripts/productBuild/productBuild.xml" />
        <arg value="-Dtimestamp=${timestamp}" />
        <classpath>
            <pathelement location="${eclipseLocation}/plugins/org.eclipse.equinox.launcher_${equinoxLauncherPluginVersion}.jar" />
        </classpath>
    </java>
</target>

我应该添加以下命令吗?

<arg value="-autVMArgs" />      
<arg value="-Xmx800m;-XX:MaxPermSize=600M;-javaagent:${jacoco-agent-path}=destfile=${jacoco-report},append=true"/>

更新:感谢这两个答案,我设法使用 CLI 创建了报告。但看起来它显示(几乎)零覆盖率。它在我看到已执行的打印行上显示红色(未覆盖)(它们被打印到标准输出)。

该项目包含很多包,但第一次尝试我正在尝试为特定包创建覆盖率报告。我跑了:

gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData --session_id 1583967465 -vmargs -Xmx256m -Xms128m -javaagent:/jacoco_coverage/jacoco-0.8.5/lib/jacocoagent.jar

然后我跑了:

/usr/pkgs/java/1.6.0.16-64/bin/java -jar /jacoco_coverage/jacoco-0.8.5/lib/jacococli.jar report jacoco.exec --classfiles /gandu_repo/com.core.gandu/bin/ --html temp_dir --sourcefiles /gandu_repo/com.core.gandu/src/

输出:

[WARN] Some classes do not match with execution data.
[WARN] For report generation the same class files must be used as at runtime.
[WARN] Execution data for class <PATH> does not match.
[INFO] Analyzing 8 classes.

我很难理解classfilessourcefiles 的含义。我试图报道的文件是Application。在bin 中有一些内部文件夹Application.class,在src 中有一些内部文件夹Application.java。我什至尝试在classfilessourcefiles 中添加这些文件的完整路径,但仍然没有覆盖范围(全为红色)。可能是什么问题呢? 工具的结构: 根目录包含很多包,每个包都有文件夹binsrc。每个src 都包含带有Java 文件的递归文件夹。 binclass 文件具有相同的结构。

【问题讨论】:

    标签: java code-coverage jacoco eclemma


    【解决方案1】:

    据我所知,添加 java 代理的唯一地方是在单元测试的配置中。

    应将代理添加到执行被测应用程序的 JVM。 您的困惑可能来自这样一个事实,即通常单元测试与被测代码在同一个 JVM 中执行。

    根据您的描述,不清楚应用程序的 JVM 是如何启动的。

    不过,不妨以src/Main.java 为例:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class Main {
    
      public static void main(String[] args) throws Exception {
        String input;
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
          input = reader.readLine();
        }
        if ("hello".equals(input)) {
          System.out.println("Hello, World!");
        }
      }
    
    }
    

    编译后

    javac -d classes src/Main.java
    

    此应用程序可以在 JVM 中执行,JaCoCo Java Agent 取自 JaCoCo zip distribution,如下所示

    java -javaagent:jacoco/lib/jacocoagent.jar -cp classes Main
    

    然后执行测试 - 例如在这种情况下手动输入“hello”。

    JVM 正常终止后,你会得到jacoco.exec 文件。

    通过将此jacoco.exec、源文件和类文件传递给JaCoCo Command Line Interface,您可以创建HTML 报告:

    java -jar jacoco/lib/jacococli.jar report jacoco.exec --classfiles classes --sourcefiles src --html report
    

    我应该使用哪个保险套餐?是 Eclemma 还是 Jacoco?

    EclEmma 是一个基于 JaCoCo 的 Eclipse IDE 插件。

    如果为了测试您从 Eclipse IDE 执行应用程序,那么您可以使用 EclEmma 使用 JaCoCo 启动它。这是在 Eclipse IDE 中执行的相同示例:

    但是这不适用于其他场景,例如 Ant 构建。

    如何使用覆盖率包运行该工具?我应该将它添加到 build.xml 文件中吗?我应该将它添加到命令行吗?

    这取决于你如何执行你的应用程序——如果你的应用程序是由 Ant 执行的测试,那么你可以使用JaCoCo Ant Tasks 来配置代理和生成报告。例如,Ant 的 build.xmlsrc/Example.java 生成与上述命令相同的报告:

    <project xmlns:jacoco="antlib:org.jacoco.ant" name="Example Ant Build with JaCoCo" default="rebuild">
    
      <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="jacoco/lib/jacocoant.jar"/>
      </taskdef>
    
      <target name="clean">
        <delete dir="classes"/>
        <delete dir="report"/>
        <delete file="jacoco.exec"/>
      </target>
    
      <target name="compile">
        <mkdir dir="classes"/>
        <javac srcdir="src" destdir="classes" debug="true" includeantruntime="false"/>
      </target>
    
      <target name="run" depends="compile">
        <jacoco:agent property="jacocoAgent" />
    
        <java classname="Main" fork="true">
          <classpath path="classes"/>
          <jvmarg value="${jacocoAgent}"/>
        </java>
      </target>
    
      <target name="report" depends="run">
        <jacoco:report>
          <executiondata>
            <file file="jacoco.exec"/>
          </executiondata>
          <structure name="JaCoCo Ant Example">
            <classfiles>
              <fileset dir="classes"/>
            </classfiles>
            <sourcefiles encoding="UTF-8">
              <fileset dir="src"/>
            </sourcefiles>
          </structure>
          <html destdir="report"/>
        </jacoco:report>
      </target>
    
      <target name="rebuild" depends="clean,report"/>
    
    </project>
    

    如果应用程序是由一些自定义的自制工具执行的,那么直接将代理添加到命令行可能会更好。

    【讨论】:

    • 嗨@Godin 我已经设法使用 CLI 创建了报告。但由于某种原因,显示(几乎)零覆盖率。你能看看我对这个问题的编辑吗?
    • "some reason" 是 IMO 在警告中明确说明的,您会得到 -“对于报告生成,必须使用与运行时相同的类文件”,即报告生成的 --classfiles 选项应该指向包含与执行时完全相同的类文件的目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2014-06-15
    • 2020-05-12
    • 2011-02-27
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多