Как осуществлялось логирование на последнем проекте по тестированию?

«Как осуществлялось логирование на последнем проекте по тестированию?» — вопрос из категории Логирование и отчётность, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На проекте по автоматизации тестирования 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 дополняли логи, предоставляя бизнес-контекст шагов теста. Лог-файлы автоматически прикреплялись к отчету о падении.