logo

Интерцепт логирования SLF4J и logback в тестах JUnit

Быстрый ответ

При работе с JUnit-тестами для перехвата логов SLF4J удобно применять Тестовый Appender Logback. Вот пример кода, демонстрирующего этот метод:

Java
Скопировать код
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.classic.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

class CapturingAppender extends AppenderBase<ILoggingEvent> {
    List<ILoggingEvent> capturedEvents = new CopyOnWriteArrayList<>();

    @Override
    protected void append(ILoggingEvent eventObject) {
        capturedEvents.add(eventObject);
    }
    // Геттер для capturedEvents пропущен для упрощения
}

CapturingAppender captor = new CapturingAppender();
Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(captor);
captor.start();

// После выполнения кода, который производит логирование
assertThat(captor.capturedEvents, hasItem(hasProperty("message", is("Ожидаемое сообщение"))));

Для анализа захваченных логов используйте captor.capturedEvents.

Основы перехвата логирования SLF4J

Перед началом тестирования

Прежде чем приступить к использованию тестового Appender Logback, предлагается настроить тестовую среду. В logback-test.xml определите конфигурацию для тестов: уровни логирования и другие параметры.

Более понятные утверждения

Для формирования более читабельных утверждений можно воспользоваться такими библиотеками, как AssertJ или Hamcrest. Они значительно упростят тесты и облегчат анализ результатов.

Параллельные тесты – это особый случай

При многопоточных тестах главное обеспечить использование потокобезопасных коллекций, например, CopyOnWriteArrayList. Это поможет гарантировать повышенную консистентность данных.

Очистка после теста

Постарайтесь не забывать отключать и удалять Appenders методом @AfterEach. Это предотвратит воздействие на последующие тесты.

Подробнее о событиях логирования

Интерфейс ILoggingEvent содержит важную информацию, которая может быть полезна при анализе: сообщение, имя логгера, уровень логирования.

Просмотр других вариантов тестирования логов

Если прямое использование Logback не устроит, можно обратить внимание на slf4j-test и другие фреймворки.

Mockito может быть полезен

Если важным является проверка реакции на процесс логирования, можно использовать Mockito для создания mock-объектов SLF4J Appenders, игнорирую содержание логов.

Визуализация

Приведем наш Логгер и Тестовый Шпион:

Markdown
Скопировать код
Логгер: "Я сообщаю обо всем, что происходит!"
Тестовый Шпион: "Я тщательно отслеживаю все события!"

Тестовый Шпион осуществляет "прослушивание":

Java
Скопировать код
Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
logger.addAppender(listAppender);
listAppender.start();

После выполнения кода, который генерирует логи:

Java
Скопировать код
logger.info("Это тестовый лог");

Тестовый Шпион проверяет записи:

Java
Скопировать код
List<ILoggingEvent> logsList = listAppender.list;
assertThat(logsList.get(0).getMessage()).isEqualTo("Это тестовый лог");

Подгонка стратегий перехвата логирования под свои потребности

Не стоит забывать настраивать ваш тестовый Appender для тестирования более сложных сценариев, в частности, при фильтрации событий логирования.

Повышение производительности

Стоит учитывать производительность выбранного подхода при тестировании систем с интенсивным логированием.

Утверждения уровня эксперта

Применяйте продвинутые методы утверждения для проверки сложного порядка логов или соответствия шаблонам.

Полезные материалы

  1. Документация Logback о Appenders
  2. Как перехватить логирование SLF4J (с Logback) в JUnit-тесте? – Stack Overflow
  3. Руководство пользователя JUnit 5
  4. slf4jtesting на GitHub: тестирование SLF4J c оптимизированной поддержкой параллелизма и инъекций зависимостей
  5. Руководство SLF4J
  6. FAQ SLF4J