2010-07-14 13 views
6

Ich führe TestNG Tests, und die Logging-Ausgabe wird auf DEBUG gesetzt, so dass ich im Falle eines Fehlers genau untersuchen kann, was schief geht.Capturing Log4j Ausgabe beim Ausführen von TestNG Tests

Das Problem ist, dass die Ausgabe sehr ausführlich ist, und es stört jeden, wenn es läuft. Ich möchte alle Log4J Logging-Ereignisse erfassen - was einfach ist - und sie nur ausdrucken, wenn der Test fehlschlägt. Außerdem muss ich @Before/@After Methoden berücksichtigen und auch die Ausgabe für sie drucken.

Unter der Annahme, dass ich bereits eine Liste der Log4J LoggingEvent s haben, wie kann ich die nur drucken, wenn die Test/After/Before Methoden versagen?

Antwort

1

This site has a explanation on how to do it.. Ich habe den Code-Teil hier kopiert, falls die Verbindung nicht mehr funktioniert.

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(), ist (Level.WARN));

+0

Dank, es ist irgendwie verwandt, aber nicht das, was ich suche. –

+1

Beantwortet die Frage nicht. – user43685

+0

@ user43685: Sie haben Recht, ich habe etwas Quellcode hinzugefügt, um es eine weniger Quatsch-Antwort zu machen. – Sardathrion

4

Verwenden Sie Reporter.log (str), um die Nachricht im Bericht zu protokollieren.

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

Setzen Sie JMockit in Abhängigkeiten. Damit ist das Protokollieren sehr einfach.

Put in Testklasse:

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

in Probe gestellt:

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