【问题标题】:Jacoco is analysing class twice and failingJacoco 分析了两次课堂,但都失败了
【发布时间】:2021-05-25 19:43:42
【问题描述】:

我目前在我的 pom.xml 中有 JaCoCo 的这个配置:

<plugin> 
            <!-- Maven JaCoCo Plugin configuration for Code Coverage Report -->
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <inherited>true</inherited>
            <configuration>
                <excludes>
                    <exclude>**/*Test.class</exclude>
                </excludes>
            </configuration>

当我运行 mvn clean verify site 时,我得到一个失败的构建,基于此警告(重要的是:我只有 1 个类,SayHello.scala):

Analyzed bundle 'dummy-project' with 2 classes
[WARNING] Rule violated for bundle dummy-project: classes missed count is 1, but expected maximum is 0
Failed to execute goal org.jacoco:jacoco-maven-plugin:0.8.5:check (default-check) on project dummy-project: Coverage checks have not been met. See log for details.

最后,当我检查报告时,它正在分析同一个类(唯一的区别是第二行中额外的“.”),其中一个失败了:

更新

SayHello.scala

package com.dummy

object SayHello {

def sayIt: String = "hello, world"

}

SayHelloTest.scala

package com.dummy

import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should.Matchers

class SayHelloTest extends AnyFunSuite with Matchers {

test("SayHello says hello") {
  SayHello.sayIt shouldBe "hello, world"

}

}

有人遇到过类似的问题吗?谢谢。

【问题讨论】:

    标签: scala jacoco jacoco-maven-plugin


    【解决方案1】:

    JaCoCo 分析.class 文件,而不是源文件。 Scala 编译器可以从单个源文件生成多个.class 文件。您的SayHello.scala 类很可能包含一个同伴object。一个object总是被编译成一个以$结尾的同名类,它实现了字节码级别的伴生对象单例。如果您转到 target/classes 目录,您很可能会在那里看到这两个文件 - SayHello.classSayHello$.class

    JaCoCo 报告中的两条记录对应于这两个类文件。末尾的点而不是 $ 很可能是 jacoco 报告呈现问题。

    要跳过伴随对象类的分析,只需将其添加到您的排除列表中:

    <configuration>
      <excludes>
        <exclude>**/*Test.class</exclude>
        <exclude>**/*$.class</exclude>
      </excludes>
    </configuration>
    

    然而,伴随对象中方法的覆盖似乎归因于SayHello$.class,而不是SayHello.class,因此通过从列表中删除$ 类,您基本上失去了覆盖。

    我不知道 Maven+JaCoCo 设置的任何解决方法,显然 jacoco-maven-plugin 并不是真正支持 Scala。然而,sbt 插件似乎已经解决了这些问题,参见例如https://blog.developer.atlassian.com/using-jacoco-a-code-coverage-tool-for-scala/

    如果切换到 sbt 不是一个选项,您可以查看一些 Scala 特定的代码覆盖工具,例如 scoverage,它也有一个 maven plugin

    【讨论】:

    • 谢谢你,@Sergei,这很有意义。应用您建议的更改后,这确实减少了分析的文件。但是,现在它说我没有任何测试覆盖率(那个“绿色”的测试覆盖率 100% 消失了)。有什么想法吗?
    • @JuliaBel 那个绿色的应该已经消失了,因为它的末尾有一个点。 “常规”(不带点)应保留在报告中。如果你有一个覆盖SayHello 类的测试,那么它应该有覆盖率,但是很难说它为什么是红色的,不看它的来源和它的测试的来源。您能否将来源添加到问题中?
    • 当然,刚刚包括在内。谢谢。
    • 我相信 jacoco-maven-plugin 并不是真正的 scala 感知,所以我的建议是要么切换到 sbt,要么选择另一个覆盖工具。我已经更新了答案。
    • 感谢您提供宝贵的信息。 Scoverage 是一种魅力
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 2012-09-06
    • 2014-02-03
    • 1970-01-01
    • 2020-11-30
    • 2020-08-30
    • 2023-02-19
    • 2019-03-04
    相关资源
    最近更新 更多