7

我正在执行 TestNG 测试,并且日志输出设置为DEBUG,因此如果发生故障,我可以准确检查出了什么问题。

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

假设我已经有一个 Log4JLoggingEvent的 List ,如何仅在Test//方法失败After时打印它们?Before

4

4 回答 4

4

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

@AfterMethod
public void printLOGonFailure(ITestResult result) {
    if (result.getStatus() == ITestResult.FAILURE) {
        String  str = getLog();
        Reporter.log(str);
    }
}
于 2016-02-12T22:03:44.830 回答
2

这个网站有一个关于如何做的解释。. 我在这里复制了代码部分,以防链接失效。

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));

于 2010-07-16T09:55:49.067 回答
1

实现并注册一个org.testng.ITestListener并对回调方法做出反应。

于 2010-07-15T09:09:04.453 回答
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");
    }};
于 2016-08-03T16:21:49.883 回答