在unit testing中是否有任何简单的slf4j用法模式?

我在我的项目中使用JUnit4和Hibernate3。 Hibernate依赖于Slf4j,因此我的项目也包含了这个库。 现在我想在unit testing中使用Slf4j来记录补充测试信息。 您能否提供一个简短的示例,说明我的unit testing应该如何只记录一行文本? 优选地在多个测试中没有代码重复

我也喜欢在我的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配置文件如下所示:

                                              

这给了我来自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)。

为什么要在unit testing中记录内容? unit testing应该通过/失败,并应使用测试框架来表明。 您不希望通过输出读取以查看测试是通过还是失败。 如果它失败了,在IDE /调试器中运行它是解决它的最佳方法。

另一种解决方案是将日志记录实现切换为仅用于测试的简单实现。

所以在你的pom.xml中

    org.slf4j slf4j-api 1.7.12    org.slf4j slf4j-simple 1.7.12 test    org.slf4j slf4j-log4j12 1.7.12 runtime  

SimpleLogger默认情况下只将所有内容记录到stderr,不需要任何配置文件

我们使用log4j作为输出记录器;

 private static Logger log = LoggerFactory.getLogger(MyClassHere.class); 

如果正确配置,slf4j应该找到并使用log4j而不会出现问题。 为了让生活更轻松,我会使用这个Eclipse模式,因为你将编写这段代码:

 private static Logger log = LoggerFactory.getLogger(${enclosing_type}.class); ${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)} 

对于测试,我建议你不要超过INFO级别,并将大部分内容保持为DEBUG。 如果您真的想要智能地捕获大量错误,那么我建议您查看PositronLogger,它是一个日志文件appender,它会默默地接收到TRACE的所有内容,但只有在捕获ERROR时才将其转储到文件中; 有点像时间旅行:)

http://github.com/andreaja/PositronLogger

在编写新测试时添加日志记录很有用。 同时,当在CI或CD管道中运行测试时,您希望禁用日志记录(或至少不再详细)。 有时故障是瞬态的,尤其是在端到端运行中,因此在CI作业的控制台日志上获得相关输出是有帮助的。 本文非常好地描述了它 – https://gualtierotesta.wordpress.com/2015/11/01/tutorial-logging-during-tests/

如果使用log4j 1作为底层的slf4j实现

默认情况下,log4j不记录任何内容,除非你,

  • 在类路径上有一个log4j.properties文件
  • set -Dlog4j.configuration=file:///path/to/log4j.properties 。 如果使用maven,可以在maven-surefire-plugin配置中完成。
  • 以编程方式设置log4j配置,比如@BeforeClass方法

     @BeforeClass public static void beforeClass() { BasicConfigurator.resetConfiguration(); BasicConfigurator.configure(); } 

    这只是有效,但它需要在每个unit testing上进行,这是一个痛苦。 所以我不建议,除非你暂时需要它来快速得到一些工作。

这对我来说似乎是一种难闻的气味。

您应始终避免手动检查或validationunit testing。

unit testing应该是自动化的,只有在构建工具告诉您某些测试失败时才需要人工干预,并且应该使用所有这些validation方法提供失败原因(例如assertEquals)