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

通过共享日志和Log4j 2.0增强代码覆盖率

顾正初
2023-03-14

我目前正在从log4j1.2迁移到log4j2。我们使用ApacheCommonsLogging1.1(JCL),以Log4j2作为实现。

现在,当执行单元测试时,像这样的语句

 if (log.isInfoEnabled()) {
   log.info("example");
 }

如果日志级别过高(例如,在本例中为警告),则会在覆盖率报告中显示为未覆盖的行,因为不会执行if正文。

因此,在log4j1中,我公司的某个人编写了一个自定义记录器,它将为所有log返回true。isXXXEnabled()方法,如果它检测到它是从Maven Surefire运行的,如下所示:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.Log4JLogger;

public class Log4JEnhancedCoverage implements Log {

  private static final long serialVersionUID = -8715529047111858959L;

  private final Log logger;

  private final boolean mavenRun;

  public LogEnhancedCoverage(String name) {
    this.logger = new Log4JLogger(_name);
    this.mavenRun = TestsRunContext.isMavenSurefireRun();
  }

  @Override
  public boolean isTraceEnabled() {
    return (mavenRun) ? true : logger.isTraceEnabled();
  }

  @Override
  public void trace(Object message) {
   logger.trace(message);
  }

  // repeat for warn, info, etc
}

其效果是,每个isXXXEn的()块被执行,日志语句通过配置文件被重定向到log4j。Log4j本身将看到只显示指定日志级别的消息,而执行所有级别的代码块。老:问题是,您可以看到Log4j记录器实现是直接从JCL的impl包中实例化的。(是的,他们提供自己的适配器实现!)。

在我的新设置中,我使用log4j-jcl工件,我不知道如何在构造函数中正确创建Log4j2兼容的记录器。

更新:log4jjcl附带自己的日志工厂,该工厂加载特定于log4j2的日志实现。因此,对于特定记录器的commons logging配置根本不受尊重。

共有1个答案

嵇星海
2023-03-14

只需使用共享日志API获取记录器,而不是直接实例化它,你就可以了。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//REMOVE THIS: import org.apache.commons.logging.impl.Log4JLogger;

public class Log4JEnhancedCoverage implements Log {

    private static final long serialVersionUID = -8715529047111858959L;

    private final Log logger;

    private final boolean mavenRun;

    public Log4JEnhancedCoverage(String name) {
        //REMOVE THIS: this.logger = new Log4JLogger(name);
        this.logger = LogFactory.getLog(name);
        ...
 类似资料:
  • 我执行Jacoco单元测试代码覆盖,它显示了单元测试中需要覆盖的所有代码。 如何避免测试覆盖显示ui代码,比如onCreate()、onAttach()中的代码(fragment)。我不想要视图的代码覆盖率,但jacoco也给出了这一点。我有办法消除它吗?

  • 问题内容: 我正在使用Log4j2 ver 2.3 log4j2.xml看起来像: 当前一天的日志被当天的某些日志覆盖时,所有方法都可以正常工作到第二天。 示例:catalina.2018-03-21.log昨天(3月21日)很好,但是今天被2018-03-22的某些日志覆盖,当时catalina.2018-03-22.log包含了今天(3月22日)的其余日志) 有什么想法吗? 问题答案: Log

  • 代码覆盖是查找未被测试执行的代码区域的过程。不过要记住的是这并不能说明你测试代码的有效性。 在requirements.txt文件中添加依赖包: coverage==4.4.2 然后,我们在manage.py中新增一个命令: import coverage COV = coverage.coverage( branch=True, include='project/*',

  • 这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 bug 诅咒中。 那么在 OpenResty 里面如何看到代码覆盖率呢?其实很简单,使用 LuaCov 可以很方便的实现。 我们先了解下 LuaCov,这是一个针对 Lua 脚本的代码覆盖率工具,通过 luarocks 来安装: luarocks install l

  • 问题内容: 我碰到的SO这个线程,其讲述PHP代码覆盖工具-代码覆盖工具对PHP 我从未从事过PHP,并且一直在使用Java针对用PHP编写的应用程序编写Selenium UI测试。当我经过上面提到的线程时,我感到(可能是错误的)当那些用PHP Unit编写的单元测试并且想要找出单元测试覆盖应用程序的程度时,将使用那些PHP代码覆盖工具。 我正在寻找一种解决方案,在其中执行我编写的,用Java编写

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