2010-07-14 12 views
6

Sto eseguendo test TestNG e l'uscita di registrazione è impostata su DEBUG, quindi in caso di errore è possibile controllare esattamente cosa va storto.Acquisizione dell'uscita Log4j durante l'esecuzione dei test TestNG

Il problema è che l'output è estremamente dettagliato e infastidisce tutti quando viene eseguito. Vorrei catturare tutti gli eventi di log Log4J - che è facile - e stamparli solo quando il test fallisce. Inoltre, ho bisogno di prendere in considerazione i metodi @Before/@After e stampare anche l'output per loro.

Supponendo che ho già una lista di Log4J LoggingEvent s, come posso stampare quelle solo quando i Test/After/Before metodi non riescono?

risposta

1

This site has a explanation on how to do it.. Ho copiato la parte del codice qui nel caso in cui il collegamento si spegne.

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

+0

Grazie, è in qualche modo legata, ma non quello che sto cercando. –

+1

Non risponde alla domanda. – user43685

+0

@ user43685: hai ragione, ho aggiunto qualche codice sorgente per renderlo una risposta meno spazzatura. – Sardathrion

4

Utilizzare Reporter.log (str) per registrare il messaggio nel report.

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

Mettere JMockit nelle dipendenze. Con esso il test di registrazione è molto semplice.

Put in classe di test:

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

Mettere in prova:

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