Ответ
На проекте по автоматизации тестирования REST API мы использовали связку SLF4J + Logback для структурированного логирования. Конфигурация была нацелена на отладку тестов и анализ падений.
Конфигурация Logback (logback-test.xml):
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>target/logs/automation.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %c{1} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.apache.http" level="DEBUG"/> <!-- Логирование HTTP-клиента -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
Использование в коде тестов (на примере TestNG):
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ApiUserTest {
private static final Logger LOG = LoggerFactory.getLogger(ApiUserTest.class);
@Test
public void testCreateUser() {
LOG.info("Начало теста: создание пользователя с email {}", testEmail);
UserRequest request = new UserRequest(testEmail, "John Doe");
Response response = given()
.spec(requestSpec)
.body(request)
.when()
.post("/users");
LOG.debug("Ответ API: статус {}, тело: {}", response.getStatusCode(), response.asString());
assertThat(response.statusCode()).isEqualTo(201);
LOG.info("Тест успешно завершен, создан пользователь с ID: {}", response.jsonPath().getInt("id"));
}
}
Что мы логировали и как использовали:
- INFO: Старт/финиш тест-сьюта, общие результаты.
- DEBUG: Детали HTTP-запросов и ответов (тело, заголовки), что критично для отладки падающих интеграционных тестов.
- ERROR: Стек-трейсы неожиданных исключений с прикреплением скриншота (для UI-тестов) или дампа состояния базы данных.
- Интеграция с Allure: Аннотации
@Stepи@Attachmentв Allure Reports дополняли логи, предоставляя бизнес-контекст шагов теста. Лог-файлы автоматически прикреплялись к отчету о падении.