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

用Jacoco从Sonar的条件覆盖中排除groovy slf4j日志记录

萧永望
2023-03-14

我们正在将SonarQube 5.1与Jacoco maven插件0.7.4一起使用,我们所有的slf4j日志记录语句(如log.debug(“发生了一些事情”)都显示仅覆盖了2个分支中的1个。我知道这是因为slf4j在内部执行if调试,这很好,但我们不希望这抛弃我们的数字。我们对测试 slf4j 不感兴趣,我们宁愿不对不同的日志记录级别多次运行每个测试。

那么,我们如何告诉声纳和/或Jacoco将这些线路排除在覆盖范围之外呢?它们都有可配置的文件排除,但是据我所知,它们只是将您自己的类排除在覆盖范围之外(使用目标目录),而不是导入的库。我尝试将< code > groovy . util . logging . * ' 添加到排除列表中,但它没有任何作用。

logger.is德布吉启用()正在扼杀我的代码覆盖率。我计划在运行cobertura时将其排除,并建议对于Cobertura,应使用“忽略”属性而不是“排除”。我在设置或文档中没有看到雅各或声纳的类似内容。

编辑2:我们正在使用Slf4j注释。这里的文档:http://docs.groovy-lang.org/next/html/gapi/groovy/util/logging/Slf4j.html

此本地转换使用LogBack日志为程序添加了日志记录功能。对名为log的未绑定变量的每个方法调用都将映射到对记录器的调用。为此,将在类中插入日志字段。如果字段已存在,则使用此转换将导致编译错误。方法名称将用于确定在记录器上调用什么。

log.name(exp)

映射到

if (log.isNameLoggable() {
        log.name(exp)
     }

此处名称是信息,调试,警告,错误等的占位符。如果表达式 exp 是常量或仅变量访问,则不会转换方法调用。但这仍然会导致对注入的记录器的调用。

希望这能澄清正在发生的事情。我们的日志语句变成了2个分支ifs,以避免为未启用的日志级别构建昂贵的字符串(据我所知,这是一种常见的做法)。但这意味着,为了保证所有这些分支的覆盖范围,我们必须为每个日志记录级别重复运行每个测试。

共有1个答案

黄成荫
2023-03-14

我没有找到排除它的通用解决方案,但是如果您的代码库允许您这样做,您可以将您的日志记录语句包装在一个方法中,该方法的名称中包含“Generated”。

一个简单的例子:

package org.example.logging

import groovy.transform.Generated
import groovy.util.logging.Slf4j

@Slf4j
class Greeter {

    void greet(name) {
        logDebug("called greet for ${name}")
        println "Hello, ${name}!"
    }

    @Generated
    private logDebug(message) {
        log.debug message
    }
}

不幸的是,< code > javax . annotation . generated 并不合适,因为它只保留了< code>SOURCE,因此我(ab)在这里使用了< code > groovy . transform . generated ,但是可以很容易地为此创建自己的注释。

我在这里找到了解决方案:如何添加注释以从jacoco代码覆盖率报告中排除方法?

更新:在Groovy中,您可以使用以下特征最优雅地解决它:

package org.example.logging

import groovy.transform.Generated
import groovy.util.logging.Slf4j

@Slf4j
trait LoggingTrait {

    @Generated
    void logDebug(String message) {
        log.debug message
    }
}

...然后。。。

package org.example.logging

import groovy.util.logging.Slf4j

@Slf4j
class Greeter implements LoggingTrait {

    void greet(name) {
        logDebug "called greet for ${name}"
        println "Hello, ${name}!"
    }

}

不幸的是,属性日志被解释为 Greeter 的属性,而不是 LogTrait 的属性,因此您必须@Slf4j附加到特征和实现该特征的类。尽管如此,这样做会给你预期的记录器 - 实现类之一:

14:25:09.932[main]DEBUG org.example.logging。问候者-称为世界问候

 类似资料:
  • 我一直试图从生成的覆盖报告中删除某些文件。我尝试了以下事情: 修改代码: 也试过, 我试图找到解决方案时提到的许多链接中的一些: Maven Jacoco配置-从不工作的报告中排除类/包 Jacoco如何正确排除包 如何在子项目中添加更多Jacoco排除? http://tdongsi.github.io/blog/2017/09/23/jacoco-in-maven-project/ 但是每次我

  • Jacoco代码覆盖率报告还包括“系统路径jar”中的类,我在maven依赖项下面添加了这些类 我试图排除这个罐子的文件从Jacoco插件像这样: 但这种排斥并不奏效。它仍在显示jar中包含的文件的覆盖率报告。如图所示,文件位于org中。阿帕克。和组织。克洛布斯。报道中不应该有包裹。

  • 我想以某种方式使用Jacoco,这样它就排除了。为了实现这一点,我加入了

  • 当我的Jenkins管道失败时,试图从覆盖报告中排除包。我有一个包含所有POJO: s的子项目。我不想为所有这些编写uittest。因此,它们会拖累覆盖范围将低于阈值的分支/线路覆盖范围,并使我的构建失败。 应该可以排除一些包,但我无法让它工作。 我有以下雅各布.gradle文件: 以下是我的声纳.gradle文件中的内容: 在我的build.gradle中: 最后从我的詹金斯文件中: 但是,xx

  • 问题内容: 我使用了tomcat,并简单地覆盖了默认的日志系统。如何在我的Spring应用程序中启用Wildfly上的Logback日志记录? 我在tomcat上的Logback.xml 问题答案: 您可以使用logback来配置应用程序中的日志记录。您不能使用logback为服务器配置日志记录。 要在配置中使用logback,您需要将更改为false或创建一个不包含子系统的。您还需要在部署中包括

  • 如何排除来自jacoco code coverage,在pom中。xml还是java代码?