我正在执行TestNG测试,并且日志记录输出设置为DEBUG
,所以如果出现故障,我可以检查到底发生了什么问题。执行TestNG测试时捕获Log4j输出
问题是输出非常冗长,并且在运行时它会困扰每个人。我想捕获所有Log4J日志事件 - 这很容易 - 只有在测试失败时才打印它们。另外,我需要考虑@Before/@After
方法并为它们打印输出。
假设我已经有Log4J的LoggingEvent
s的名单,我怎么能打印这些只有在Test
/After
/Before
方法失败?
我正在执行TestNG测试,并且日志记录输出设置为DEBUG
,所以如果出现故障,我可以检查到底发生了什么问题。执行TestNG测试时捕获Log4j输出
问题是输出非常冗长,并且在运行时它会困扰每个人。我想捕获所有Log4J日志事件 - 这很容易 - 只有在测试失败时才打印它们。另外,我需要考虑@Before/@After
方法并为它们打印输出。
假设我已经有Log4J的LoggingEvent
s的名单,我怎么能打印这些只有在Test
/After
/Before
方法失败?
执行并注册一个org.testng.ITestListener并对回调方法作出反应。
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));
使用Reporter.log(str)在报告上记录消息。
@AfterMethod
public void printLOGonFailure(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
String str = getLog();
Reporter.log(str);
}
}
将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");
}};
谢谢,它以某种方式有关,但不是我要找的。 – 2010-07-16 10:34:14
不回答问题。 – user43685 2012-11-28 00:53:50
@ user43685:你说得对,我添加了一些源代码,使其成为一个垃圾邮件的答案。 – Sardathrion 2014-03-11 07:24:04