2010-07-14 19 views
6

Estoy ejecutando pruebas TestNG y la salida de registro está configurada en DEBUG, por lo que en caso de error puedo inspeccionar exactamente qué es lo que falla.Captura de la salida de Log4j al ejecutar pruebas TestNG

El problema es que el resultado es extremadamente detallado, y molesta a todos cuando se ejecuta. Me gustaría capturar todos los eventos de registro de Log4J, lo cual es fácil, y solo imprimirlos cuando falla la prueba. Además, necesito tener en cuenta los métodos @Before/@After y también imprimir los resultados para ellos.

Asumiendo que ya tiene una lista de Log4J LoggingEvent s, ¿cómo puedo imprimir los sólo cuando los Test/After/Before métodos fallan?

Respuesta

1

This site has a explanation on how to do it.. Copié la parte del código aquí en caso de que el enlace se muera.

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

+0

Gracias, es de alguna manera relacionada, pero no lo que yo estoy buscando. –

+1

No responde la pregunta. – user43685

+0

@ user43685: Tiene razón, agregué un código fuente para que sea una respuesta menos basura. – Sardathrion

4

Use Reporter.log (str) para registrar el mensaje en el informe.

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

Ponga JMockit en dependencias. Con eso, la prueba de registro es muy fácil.

Poner en clase de prueba:

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

Poner en la prueba:

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