在单元测试中是否有任何简单的slf4j使用模式?

2022-09-02 20:45:08

我在我的项目中使用JUnit4和Hibernate3。Hibernate依赖于Slf4j,因此我的项目也包括这个库。现在我想在单元测试中使用Slf4j来记录补充测试信息。您能提供一个简短的示例,说明我的单元测试应该是什么样子的,以便只记录一行文本吗?最好在多个测试中没有代码重复


答案 1

为什么要在单元测试中记录内容?单元测试应为通过/失败,并应使用测试框架来指示这一点。您不希望通过读取输出来查看测试是通过还是失败。如果它失败了,在IDE/调试器中运行它是修复它的最佳方法。


答案 2

我也喜欢在我的DAO类的JUnit测试中使用slf4j。当您创建新测试或修改旧测试时,它确实很有帮助。我通常将旧的日志记录输出保留在调试级别,并在信息级别创建新的日志记录语句,而我仍然在该方法中积极处理代码。我的一个 JUnit 类看起来像这样:

package com.example.mydao;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// other imports not shown...

public class TestMyDAO extends TestCase {

    private static final Logger logger = 
        LoggerFactory.getLogger(TestMyDAO.class);


    public void testA() {
        logger.debug("Logging from testA() method");
    }

    public void testB() {
        logger.debug("Logging from testB() method");
    }

    public void testThatIAmWorkingOn() {
        logger.info("Logging from my new test method at INFO level");
    }

}

我使用log4j作为实际的日志记录提供程序,所以我的配置文件如下所示:log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
        </layout>
    </appender>

    <logger name="com.example.mydao" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="org.hibernate" additivity="false">
        <level value="WARN" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="org.hibernate.connection.DriverManagerConnectionProvider" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="org.hibernate.connection.C3P0ConnectionProvider" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="com.mchange" additivity="false">
        <level value="WARN" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="com.mchange.v2.resourcepool.BasicResourcePool" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <logger name="com.mchange.v2.c3p0.C3P0Registry" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender"/>
    </logger>

    <root>
        <priority value ="WARN" />
        <appender-ref ref="consoleAppender"/>
    </root>

</log4j:configuration>

这给了我来自JUnit类的信息级输出,以及来自Hibernate运行时和其他与Hibernate一起使用的库的一些有用的东西。根据自己的口味进行调整。

最后,我需要确保在执行 JUnit 测试时,以下所有库都在我的类路径中:

  • slf4j-api-1.6.0.jar
  • slf4j-log4j12-1.6.0.jar
  • log4j-1.2.16.jar
  • log4j.xml(我的配置文件,如上图所示)
  • JUnit 运行时 JAR 的某些版本
  • 在生产环境中运行应用程序时,所有 JAR 通常都存在

这就是我在使用log4j时所做的。如果使用不同的日志记录实现,请进行相应的调整。如果您使用的是不同版本的slf4j,这并不重要,只要“API”和实现JAR是相同的版本(我的都是1.6.0)。


推荐