2010-07-14 51 views
6

我正在执行TestNG测试,并且日志记录输出设置为DEBUG,所以如果出现故障,我可以检查到底发生了什么问题。执行TestNG测试时捕获Log4j输出

问题是输出非常冗长,并且在运行时它会困扰每个人。我想捕获所有Log4J日志事件 - 这很容易 - 只有在测试失败时才打印它们。另外,我需要考虑@Before/@After方法并为它们打印输出。

假设我已经有Log4J的LoggingEvent s的名单,我怎么能打印这些只有在Test/After/Before方法失败?

回答

1

This site has a explanation on how to do it.。我在这里复制了代码部分以防链接死机。

Logger.getLogger(this.getClass()) 
log4j.rootLogger=ERROR,TESTAPPENDER 
log4j.appender.TESTAPPENDER=com.my.fantastic.MockedAppender 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

public class FooTest { 
    private Appender appenderMock; 
    @Before 
    public void setupAppender() { 
     appenderMock = mock(Appender.class); 
     Logger.getRootLogger().addAppender(appenderMock); 
    } 
    @After 
    public void removeAppender() { 
     Logger.getRootLogger().removeAppender(appenderMock); 
    } 
    @Test 
    public void testMethod() { 
     doStuffThatCausesLogging(); 
     verify(appenderMock).doAppend((LoggingEvent) anyObject()); 
    } 
} 

ArgumentCaptor arguments = ArgumentCaptor.forClass(LoggingEvent.class); 
verify(appenderMock).doAppend(arguments.capture()); 

assertThat(arguments.getValue()。getLevel(),is(Level.WARN));

+0

谢谢,它以某种方式有关,但不是我要找的。 – 2010-07-16 10:34:14

+1

不回答问题。 – user43685 2012-11-28 00:53:50

+0

@ user43685:你说得对,我添加了一些源代码,使其成为一个垃圾邮件的答案。 – Sardathrion 2014-03-11 07:24:04

4

使用Reporter.log(str)在报告上记录消息。

@AfterMethod 
public void printLOGonFailure(ITestResult result) { 
    if (result.getStatus() == ITestResult.FAILURE) { 
     String str = getLog(); 
     Reporter.log(str); 
    } 
} 
0

将JMockit放入依赖项中。随着它日志测试非常容易。

放在测试类:

 @Cascading 
final static Logger logging = Logger.getLogger(<some your>.class); 

测试认沽:

testedFunction(a, b, c); 
    new Verifications() {{ 
     logging.error("The message that should be output"); 
     logging.info("Another message"); 
    }};