Захват вывода Log4j при выполнении тестов TestNG - PullRequest
6 голосов
/ 14 июля 2010

Я выполняю тесты TestNG, и вывод журнала устанавливается на DEBUG, поэтому в случае сбоя я могу точно проверить, что идет не так.

Проблема в том, что выходные данные очень многословны, и это беспокоит всех, когда они запускаются. Я хотел бы захватить все события регистрации Log4J - что легко - и распечатать их, только если тест не пройден. Кроме того, мне нужно принять во внимание @Before/@After методы, а также распечатать вывод для них.

Предполагая, что у меня уже есть список Log4J LoggingEvent с, как я могу распечатать их только в случае сбоя методов Test / After / Before?

Ответы [ 4 ]

4 голосов
/ 13 февраля 2016

Используйте Reporter.log (str) для записи сообщения в отчете.

@AfterMethod
public void printLOGonFailure(ITestResult result) {
    if (result.getStatus() == ITestResult.FAILURE) {
        String  str = getLog();
        Reporter.log(str);
    }
}
2 голосов
/ 15 июля 2010

Реализация и регистрация org.testng.ITestListener и реагирование на методы обратного вызова.

1 голос
/ 16 июля 2010

На этом сайте есть объяснение, как это сделать. . Я скопировал часть кода здесь на случай, если ссылка не работает.

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

0 голосов
/ 03 августа 2016

Поместите 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");
    }};
...