Разделы портала

Онлайн-тренинги

.
Логирование тест-автоматизации при помощи Log4j
12.10.2021 00:00

Автор: Корина Пип (Corina Pip)
Оригинал статьи
Перевод: Ольга Алифанова

Мы запускаем наши автотесты или на локальных машинах, или в CI-системах. В некоторых случаях мы неспособны наблюдать, что делают наши тесты. Если это API-тест, то если он не дает результат в консоли, мы не можем узнать, что он делает, пока тест не закончится. Если это UI-тест, то пока мы не увидим, что происходит в браузере, мы не поймем, что там творится. Поэтому в некоторых случаях нам нужно выводить информацию в консоль. Эта информация даст нам понять состояние теста или данные, используемые тестом. Одна из возможностей записывать ход теста в консоль предоставлена библиотекойApache Log4j.

Простейшее использование этой библиотеки в проекте тест-автоматизации – это логирование информации, которую мы приказали фиксировать. Это очень похоже на выполнение System.out, но позволяет более тонкую настройку. Результат можно настроить для следования определенным шаблонам, чтобы мы могли легко найти определенные действия.

Какую информацию мы хотим фиксировать? Если речь о длинных UI-тестах, мы можем записывать в консоль старт определенного шага или его успешное завершение. Если мы используем случайную генерацию данных вроде дат или имен, мы можем выводить их в консоль. Эта информация поможет вручную воспроизводить упавший сценарий.

Чем больше информации мы выводим, тем лучше понимаем, что делают наши тесты. Однако избыток информации сильно затруднит ее чтение, и мы начнем что-то пропускать или просто перестанем видеть нужное. Поэтому важно логировать только то, что относится к прогону и возможному падению теста.

Импорт Log4j в проект Maven

Если у вас проект Maven, вам нужно перейти на сайт репозитория Maven и найти ‘log4j-core’. Выберите последний релиз. На данный момент зависимость, которую вам нужно добавить в pom.xml, выглядит так:

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>

Не забудьте выполнить операцию "clean install" в вашем проекте перед началом использования этой библиотеки.

Конфигурационный файл

Прежде чем начать использовать библиотеку, нужно создать файл конфигурации. Единственное требование для его размещения – находиться в classpath. Так как эта конфигурация используется в тестах, рекомендую разместить ее в src\test\resources. Имя файла должно быть 'log4j2.xml'.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss} %-5level %class.%method{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="all">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

В секции Appenders настраивается шаблон для системных результатов. Это значит, что каждый раз, когда что-то логируется, в консоль будет выводиться информация о времени, состоящая из часа, минут и секунд, уровень (про который я расскажу ниже), имена класса и метода, для которых ведется логирование, собственно само сообщение как строка, и затем новая строка. Пример форматированного результата:

22:05:05 INFO com.imalittletester.log4j.Log4jTest.firstTest - This is a message of type: info

В теге 'Root' мы устанавливаем уровень логирования. В примере выше это уровень 'all'.

Уровни логирования

Как я уже упоминала ранее, избыточная логируемая информация затрудняет ее чтение, однако было бы здорово логировать наиболее важную информацию. Или, если уж мы логируем все, как минимум иметь возможность игнорировать нерелевантную для определенного прогона информацию. С этим нам помогут уровни.

По умолчанию Log4j поддерживает ряд стандартных уровней. По нисходящему уровню критичности это FATAL, ERROR, WARN, INFO, DEBUG, TRACE. При логировании информации FATAL должен использоваться для наиболее критичной. Когда уровни используют разработчики, то FATAL сигнализирует, что в ходе работы приложения возникла серьезнейшая ошибка. ERROR тоже говорит об ошибке, но менее влиятельной по сравнению с FATAL. Конечно, наименее серьезная проблема – это TRACE.

Как мы увидим в разделе "Настройка уровня логирования", мы можем конфигурировать уровни – и можем ограничить прогон теста только самой релевантной информацией, или же всей вообще. Следовательно, разделяйте эти уровни, логируя результаты тестов.

Логирование в тестах

Сначала нам нужно инициализировать логгер. Мы можем сделать это в тест-классе напрямую, или в классе, расширяемом тестами (базовом классе). Допустим, что все тесты расширяют базовый класс. В этом случае мы инициализируем защищенную переменную:

protected static final Logger LOGGER = LogManager.getLogger();

The required imports for our logging are:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Теперь каждый тест-класс может логировать информацию о прогоне, используя переменную LOGGER. Логирование проводится путем вызова метода для переменной LOGGER в соответствии с уровнем логирования. Вывод в консоли подсвечивается разными цветами в зависимости от уровня логирования. В тестах нам может потребоваться всего 2-3 уровня, но давайте разберемся, как логируется каждый возможный. Мы передаем простую строку как параметр – это сообщение, которое будет отображаться в консоли.

  • trace:
LOGGER.trace("This is a message of type: trace");
  • debug:
LOGGER.debug("This is a message of type: debug");
  • info:
LOGGER.info("This is a message of type: info");
  • warn:
LOGGER.warn("This is a message of type: warn");
  • error:
LOGGER.error("This is a message of type: error");
  • fatal:
LOGGER.fatal("This is a message of type: fatal");

Результат команд выше при запуске тестов из IntelliJ будет выглядеть так:

 

Как можно видеть на скриншоте, INFO выглядит так же, как обычный System.out. Остальные детали логирования раскрашены в зависимости от "критичности". Логирование FATAL подсвечено красным и указывает на крайне важную информацию. Схожим образом ERROR подсвечен оранжевым. Это второй по важности тип логируемой информации.

Думайте о логировании разного уровня в следующем ключе: детали, чье присутствие не помешает, должны быть на уровне низкой серьезности вроде INFO. Самая важная информация, которая должна сразу бросаться в глаза при прогоне тестов – это уровни ERROR или FATAL.

Примечание: в некоторых CI-системах цвета не появляются в консоли. При запуске тестов из IDE вроде IntelliJ цвета будут присутствовать. В этом случае в CI можно искать конкретную информацию по имени уровня.

Настройка уровня логирования

В примерах выше все команды успешно запустились (все логирование было выведено в консоль). Это вызвано установкой тега Root в файле конфигурации на 'all'. Эта настройка помогает ограничить тип информации, которую вы хотите видеть при прогоне теста. Допустим, что для определенного прогона вам нужна только "обязательная" информация, без "дополнительной". В этой ситуации вам нужно установить другой, более жесткий уровень. К примеру, если вы хотите видеть только 'ERROR' и 'FATAL', установите тэг 'Root' на 'error'.

Дополнительная информация

У библиотеки log4j большой потенциал. О ее возможностях можно узнать в официальной документации.

Обсудить в форуме