【问题标题】:Unit test coverage on java.lang classes with JaCoCo使用 JaCoCo 对 java.lang 类进行单元测试覆盖
【发布时间】:2021-07-18 23:39:52
【问题描述】:

我正在尝试使用 JaCoCo 对 java.lang 类进行单元测试覆盖率。

背景:目前有效

这不是真正的标准,但是很简单地将OpenJDK-8-sources(在Ubuntu上)中提供的源代码复制到${sourceDirectory}中,并将rt.jar中提供的类复制到 ${project.build.outputDirectory}中,然后JaCoCo maven 插件可以看到它们并为某些类生成合适的输出。

例如,我得到了一些关于sun.reflect.ByteVectorFactory 来源的报道。

但我无法覆盖java.lang 中的课程。调用Byte.toString()时,报告中不包含该函数,Byte.class不会出现在classDumpDir生成的数据中。

我查看了 JaCoCo 的源代码,看看 java.lang 是否被明确忽略,到目前为止我没有发现任何明显的东西,但我对 JaCoCo 源代码一点也不熟悉。

实际问题

可以做些什么来解决这个限制?我正在考虑以下可能性:

  • 这是 Java 的硬性限制,对此无能为力
  • java.lang 的排除在 JaCoCo 中是硬编码的,因为它是系统包名称,但可以更改
    • 通过设置一些隐藏选项或环境变量
    • 通过提供修改版本来覆盖类路径中的某些文件
    • 通过更改 JaCoCo 源代码

编辑

我似乎并不是唯一一个尝试做这种事情的人。

邮件列表线程: https://groups.google.com/g/jacoco/c/_tuoA7DHA7E/m/BQj53OvXoUsJ

GitHub 上的拉取请求: https://github.com/jacoco/jacoco/pull/49

在这中间的某个地方,有人提到了这一点

尤其是代理使用的 JDK 类 本身可能无法追踪。

所以它可以解释为什么有些类没有被检测。

【问题讨论】:

  • 尝试使用 inclbootstrapclasses 和 inclnolocationclasses (jacoco.org/jacoco/trunk/doc/agent.html)
  • 是的,我已经设置了这些选项。
  • 另外,一些方法实现可以在运行时被JVM替换为本地代码。这些被称为intrinsics

标签: java jacoco jacoco-maven-plugin


【解决方案1】:

我做了更多的测试,我看到了

  • java.lang.Byte 没有得到覆盖
  • java.lang.ProcessBuilder 获得覆盖
  • java.util.ArrayList 没有得到覆盖
  • java.util.Calendar 得到覆盖

因此,似乎无法以这种方式检测代理加载时已经加载的类。

我提取了 rt.jar 中的所有类,并使用离线检测对其进行检测,然后将 rt.jar 替换为其检测版本,并​​将 JaCoCo 代理包含在引导类路径中(使用 -Xbootclasspath)。

这样做,我得到以下无限递归:

        ...
        at java.lang.System.getProperties(System.java)
        at org.jacoco.agent.rt.internal_f3994fa.Offline.getRuntimeData(Offline.java:36)
        at org.jacoco.agent.rt.internal_f3994fa.Offline.getProbes(Offline.java:60)
        at java.lang.System.$jacocoInit(System.java)
        at java.lang.System.getProperties(System.java)
        at org.jacoco.agent.rt.internal_f3994fa.Offline.getRuntimeData(Offline.java:36)

应该可以捕获递归以防止这种情况发生,但这显然需要对 JaCoCo 源代码进行一些修改,因此目前无法检测这些类。

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2019-11-23
    • 1970-01-01
    • 2014-09-26
    相关资源
    最近更新 更多