当前位置: 首页 > 知识库问答 >
问题:

如何用Java正确运行Eclemma覆盖

袁晟
2023-03-14
  1. 我应该使用哪个保险套件?是Eclemma还是Jacoco?
  2. 如何使用覆盖包运行该工具?我应该把它添加到build.xml文件中吗?我应该把它添加到命令行吗?

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

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

gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData -configuration /ganduInternalConfig --session_id 1582722179
<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"/>
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文件的递归文件夹。bin对于文件具有相同的结构。

共有1个答案

韦原
2023-03-14

正如我所知,添加java代理的唯一位置是在单元测试的配置中。

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

从您的描述来看,不清楚JVM与应用程序是如何启动的。

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
java -javaagent:jacoco/lib/jacocoagent.jar -cp classes Main

在优雅地终止JVM之后,您将得到jacoco.exec文件。

通过将此JaCoCo.exec、源文件和类文件传递到JaCoCo命令行界面,可以创建HTML报表:

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

我应该使用哪个承保范围包?是Eclemma还是Jacoco?

<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>
 类似资料:
  • 问题内容: 我需要方法方面的帮助,这非常令人讨厌。我尝试在线查找,因为那是一个正在搞砸的地方,即使在那里,它也“找不到2号Kid构造函数”,我什至会做其他事情,但它不起作用。好了,所以这是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数已关闭,应该是String)已关闭。如果我在第三件事中硬编码一个值,它就会变成麻烦,并说找不到它(上面)。那么如何获取日期并将其拆分呢? 调用

  • 问题内容: 我们正在将EasyMock和PowerMock与JUnit一起使用。使用的覆盖率工具是ECLEmma。使用EasyMock,它会以绿色正确显示覆盖范围(已覆盖)。但是,对于使用PowerMock进行了单元测试的代码,覆盖范围显示为红色(未覆盖)。在网络上阅读过类似的问题。但是,只想检查是否有解决方案。 谢谢 Venkatesh 问题答案: 这是一个已知的问题:https : //git

  • 我在单元测试中使用ByteBuddy重新定义类。我在每次测试后重置类,以确保测试之间没有串扰。 只要在EclipseIDE中运行测试,或者使用maven命令行运行,ByteBuddy就可以正常工作。但如果它在Eclipse中运行并覆盖,重置该类会导致以下异常: 下面是一个示例测试,它通过默认的JUnit运行程序,但在Eclipse中使用代码覆盖运行时失败。下面是失败的完整堆栈跟踪。 我使用的是By

  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即Object)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对于我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。谢谢! 问题答案: 您绝对必须使用吗?大多数人都同意是坏的。 Josh Bloch谈设计-复制构造函数与克隆 如果您已经阅读了我书中

  • 我正在尝试重写方法。但我还是发现了错误: 马塞尔

  • 我是jUnit的新手,我试图加深我对它的了解。我在网上搜索了一下,但没有找到任何可以解决几个疑问的东西。 这是代码: 这是jUnit4测试用例: TestCase运行正常,没有任何问题,但我有两个简单的问题/问题: 1) 只测试方法的正确功能是正确的,还是应该同时测试值和/或任何特定异常? 2) 当我用EclEmma运行代码覆盖率时,它给了我75%的代码覆盖率,因为测试用例没有测试类的构造函数。测