如何使用 Java 正确运行 Eclemma 覆盖

ves*_*sii 6 java code-coverage jacoco eclemma

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

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

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

我们用来执行工具的命令:

gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData -configuration /ganduInternalConfig --session_id 1582722179
Run Code Online (Sandbox Code Playgroud)

我应该添加一些选项吗?

内置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>
Run Code Online (Sandbox Code Playgroud)

我应该添加以下命令吗?

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

更新:感谢这两个答案,我设法使用 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
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

/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/
Run Code Online (Sandbox Code Playgroud)

输出:

[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.
Run Code Online (Sandbox Code Playgroud)

我很难理解如何classfilessourcefiles。我试图覆盖的文件是Application. 在binI have in some internal folderApplication.class和 in srcI have in some internal folder 中Application.java。我什至尝试为这些文件添加完整路径classfilessourcefiles但仍然没有覆盖(全部为红色)。可能是什么问题呢?工具的结构: 根包含很多包,每个包都有文件夹binsrc. 每个src文件夹都包含带有 Java 文件的递归文件夹。该bin具有相同的结构class文件。

God*_*din 5

据我所知,添加 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!");
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

编译后

javac -d classes src/Main.java
Run Code Online (Sandbox Code Playgroud)

这个应用程序可以在 JVM 中使用从JaCoCo zip 分发中获取的JaCoCo Java Agent执行,如下所示

java -javaagent:jacoco/lib/jacocoagent.jar -cp classes Main
Run Code Online (Sandbox Code Playgroud)

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

JVM 正常终止后,您将获得jacoco.exec文件。

通过将 this jacoco.exec、源文件和类文件传递给JaCoCo 命令行界面,您可以创建 HTML 报告:

java -jar jacoco/lib/jacococli.jar report jacoco.exec --classfiles classes --sourcefiles src --html report
Run Code Online (Sandbox Code Playgroud)

报告

我应该使用哪个覆盖包?是 Eclemma 还是 Jacoco?

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

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

艾玛

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

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

这取决于你如何执行你的应用程序——如果你的应用程序是由 Ant 执行的测试,那么你可以使用JaCoCo Ant Tasks来配置代理和生成报告。例如,这里build.xml的 Ant 生成与src/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>
Run Code Online (Sandbox Code Playgroud)

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