У меня есть специальный модуль добавления Log4j2, который используется во многих моих тестах JUnit5.
(Что бы это ни стоило, я наткнулся на код в паре статей и сделал лишь незначительные изменения. корректировки.)
При запуске в Surefire журналы, созданные как часть тестируемой системы, не дают ожидаемых значений, если я использую настройки плагина Surefire по умолчанию, поскольку он использует несколько потоков для ускорить работу.
В частности, выходной поток пользовательского приложения ровно один раз содержит то, что я ожидаю, и пуст в остальные дни.
Такое поведение отслеживается с распараллеливанием Surefire: если я устанавливаю для reuseForks значение false, все работает нормально, но, конечно, набор тестов работает намного медленнее.
Я пробовал синхронизировать методы в расширении журнала, но безрезультатно (что, я думаю, имеет смысл, учитывая, что я, вероятно, во власти LogManager и контекста, который он возвращает, тогда как каждый тест должен создавать экземпляр зарегистрированного расширения в своем собственном потоке ). Вероятно, я что-то неправильно понимаю или упускаю что-то очевидное - или, возможно, то, что я пытаюсь сделать, невозможно, и мне следует использовать Spring OutputCaptureExtension (что для меня было бы далеко не идеально).< /p>
Будем очень благодарны за любую помощь.
Заранее спасибо.
Класс LoggerExtension:
public class LoggerExtension implements BeforeEachCallback, AfterEachCallback {
private static final String APPENDER_NAME = "TestAppender";
private ByteArrayOutputStream outContent;
@Override
public void beforeEach(ExtensionContext context) {
if (outContent == null) {
outContent = new ByteArrayOutputStream();
} else {
outContent.reset();
}
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
loggerContext.getConfiguration().getRootLogger().setLevel(Level.INFO);
Appender appender = WriterAppender.newBuilder()
.setName(APPENDER_NAME)
.setTarget(new OutputStreamWriter(outContent))
.build();
appender.start();
loggerContext.getConfiguration().addAppender(appender);
loggerContext.getRootLogger().addAppender(loggerContext.getConfiguration().getAppender(appender.getName()));
loggerContext.updateLoggers();
}
@Override
public void afterEach(ExtensionContext context) {
LoggerContext loggerContext = (LoggerContext) LogManager.getContext();
Configuration configuration = loggerContext.getConfiguration();
configuration.getRootLogger().removeAppender(APPENDER_NAME);
}
public void verifyMessage(String message) {
// outContent is ony valid once; every other time it is empty
assertThat(outContent.toString(), containsString(message));
}
}
Пример тестового примера:
public class TestCase {
@RegisterExtension
public static LoggerExtension logVerifier = new LoggerExtension();
// ...
@Test
public void shouldDoSomething() {
// code that generates logs here
logVerifier.verifyMessage("match the log string");
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ss-threads
Пользовательское приложение Log4j2 в Maven Surefire: возможно ли повторное использование в потоках? ⇐ JAVA
Программисты JAVA общаются здесь
1715959122
Anonymous
У меня есть специальный модуль добавления Log4j2, который используется во многих моих тестах JUnit5.
(Что бы это ни стоило, я наткнулся на код в паре статей и сделал лишь незначительные изменения. корректировки.)
При запуске в Surefire журналы, созданные как часть тестируемой системы, не дают ожидаемых значений, если я использую настройки плагина Surefire по умолчанию, поскольку он использует несколько потоков для ускорить работу.
В частности, выходной поток пользовательского приложения ровно один раз содержит то, что я ожидаю, и пуст в остальные дни.
Такое поведение отслеживается с распараллеливанием Surefire: если я устанавливаю для reuseForks значение false, все работает нормально, но, конечно, набор тестов работает намного медленнее.
Я пробовал синхронизировать методы в расширении журнала, но безрезультатно (что, я думаю, имеет смысл, учитывая, что я, вероятно, во власти LogManager и контекста, который он возвращает, тогда как каждый тест должен создавать экземпляр зарегистрированного расширения в своем собственном потоке ). Вероятно, я что-то неправильно понимаю или упускаю что-то очевидное - или, возможно, то, что я пытаюсь сделать, невозможно, и мне следует использовать Spring OutputCaptureExtension (что для меня было бы далеко не идеально).< /p>
Будем очень благодарны за любую помощь.
Заранее спасибо.
[b]Класс LoggerExtension: [/b]
public class LoggerExtension implements BeforeEachCallback, AfterEachCallback {
private static final String APPENDER_NAME = "TestAppender";
private ByteArrayOutputStream outContent;
@Override
public void beforeEach(ExtensionContext context) {
if (outContent == null) {
outContent = new ByteArrayOutputStream();
} else {
outContent.reset();
}
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
loggerContext.getConfiguration().getRootLogger().setLevel(Level.INFO);
Appender appender = WriterAppender.newBuilder()
.setName(APPENDER_NAME)
.setTarget(new OutputStreamWriter(outContent))
.build();
appender.start();
loggerContext.getConfiguration().addAppender(appender);
loggerContext.getRootLogger().addAppender(loggerContext.getConfiguration().getAppender(appender.getName()));
loggerContext.updateLoggers();
}
@Override
public void afterEach(ExtensionContext context) {
LoggerContext loggerContext = (LoggerContext) LogManager.getContext();
Configuration configuration = loggerContext.getConfiguration();
configuration.getRootLogger().removeAppender(APPENDER_NAME);
}
public void verifyMessage(String message) {
// outContent is ony valid once; every other time it is empty
assertThat(outContent.toString(), containsString(message));
}
}
[b]Пример тестового примера:[/b]
public class TestCase {
@RegisterExtension
public static LoggerExtension logVerifier = new LoggerExtension();
// ...
@Test
public void shouldDoSomething() {
// code that generates logs here
logVerifier.verifyMessage("match the log string");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78493268/log4j2-custom-appender-in-maven-surefire-possible-to-reuse-across-threads[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия