Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Интерцепт логирования 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.

Кинга Идем в IT: пошаговый план для смены профессии

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

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

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

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

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

Для формирования более читабельных утверждений можно воспользоваться такими библиотеками, как 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
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой метод удобно применять для перехвата логов SLF4J в JUnit-тестах?
1 / 5