Тестирование вывода журнала Java SpringJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Тестирование вывода журнала Java Spring

Сообщение Anonymous »

У меня есть приложение Spring Boot 2, работающее на Java 10 с использованием SLF4J и входом в систему в качестве основного средства ведения журнала.

Учитывая следующий компонент Spring:

Код: Выделить всё

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class MyClass {

private static final Logger LOG = LoggerFactory.getLogger(MyClass.class);

public void hello() {
// more logic...
LOG.trace("World");
}
}
И тест, который хочет проверить выходные данные журнала (представьте себе более сложный сценарий, когда журнал будет содержать переменные и контекстную информацию) или факт создания сообщения журнала. считается критическим.

Код: Выделить всё

import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.test.rule.OutputCapture;

import static org.hamcrest.Matchers.containsString;

public class MyClassTest {

private final MyClass myClass = new MyClass();

@Rule
public final OutputCapture outputCapture = new OutputCapture();

@Test
public void successShouldLogSuccessMessages() {
myClass.hello();
outputCapture.expect(containsString("World"));
}
}
Чтобы этот тест прошел, уровень журнала должен быть установлен на TRACE. Я заметил непредсказуемое поведение, при котором тест либо проваливался, либо проходил успешно в зависимости от порядка выполнения тестов — см. «Казалось бы случайный сбой теста с Maven и Spring Boot 2 при внедрении WebFluxTest»

Я изучил несколько вариантов, ни один из которых не кажется «идеальным», но работает.
  • Предоставьте файл конфигурации обратного входа в путь к тестовому классу, который устанавливает уровень журнала для отслеживания хотя бы для этого одного класса. >
  • Установите уровень журнала этого класса на TRACE в классе свойств приложения Spring и запустите тест в контексте Spring.
  • Создайте настройку и снести тестовый класс, который программно изменяет уровень журнала во время выполнения теста, а затем сбрасывает его после.
В настоящее время у меня есть решение: позволить Spring выполнить работу по настройке регистратора и сделать тест контекстом Spring. протестируйте (и чтобы убедиться, что он работает быстро, загружайте только один интересующий меня bean-компонент) следующим образом:

Код: Выделить всё

@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
@ContextConfiguration(classes = MyClass.class)
public class MyClassTest {

private final MyClass myClass = new MyClass();

@Rule
public final OutputCapture outputCapture = new OutputCapture();

@Test
public void successShouldLogSuccessMessages() {
myClass.hello();
outputCapture.expect(containsString("World"));
}
}
Где находится содержимое application-test.properties:

Код: Выделить всё

logging.level.com.example.MyClass=TRACE
Это решение работает, оно не требует от меня программных экспериментов с регистраторами или размещения конфигурации журнала в пути к классам, что делает все совершенно независимым от базовой структуры журнала и сохраняет Конфигурация logback вне пути к тестовому классу также означает, что другие тесты, которые не заботятся о ведении журнала, не получают конфигурацию.

Тем не менее, это кажется «странным», я никогда не видел, чтобы кто-то использовал Spring-тесты таким образом (чтобы протестировать один bean-компонент без каких-либо зависимостей и без прямой зависимости от контекст). Тест начал свою жизнь как плановый тест POJO, не заботясь о весне, и он кажется более «чистым», поскольку остается таким.

Существует ли передовая практика, которая применима, когда пытаетесь проверить выходные данные журнала объекта через SLF4J?

Подробнее здесь: https://stackoverflow.com/questions/510 ... ava-spring
Ответить

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

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»