Как предотвратить шум регистрации во время запуска в @SpringBootTest?

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
                    properties = "logging.level.root=OFF")
public class MyTest {
         @Test
         public void test() {}
}

В результате простого теста, приведенного выше, у меня регистрируется много шума при запуске. Этого не было до обновления до spring-boot-2.x. Как я могу предотвратить этот шум?

В частности, моя Intellij IDE регистрирует эти операторы красным, что еще больше сбивает с толку, поскольку сам тест проходит...

Jul 31, 2018 1:55:57 PM org.springframework.boot.test.context.SpringBootTestContextBootstrapper buildDefaultMergedContextConfiguration
INFO: Neither @ContextConfiguration nor @ContextHierarchy found for test class [MyTest], using SpringBootContextLoader
Jul 31, 2018 1:55:57 PM org.springframework.test.context.support.AbstractContextLoader generateDefaultLocations
INFO: Could not detect default resource locations for test class [MyTest]: no resource found for suffixes {-context.xml, Context.groovy}.
Jul 31, 2018 1:55:57 PM org.springframework.test.context.support.AnnotationConfigContextLoaderUtils detectDefaultConfigurationClasses
INFO: Could not detect default configuration classes for test class [MyTest]: MyTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
Jul 31, 2018 1:55:57 PM org.springframework.boot.test.context.SpringBootTestContextBootstrapper getOrFindConfigurationClasses
INFO: Found @SpringBootConfiguration MyApp for test class MyTest
Jul 31, 2018 1:55:58 PM org.springframework.boot.test.context.SpringBootTestContextBootstrapper getDefaultTestExecutionListenerClassNames
INFO: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener, org.springframework.security.test.context.support.ReactorContextTestExecutionListener]
Jul 31, 2018 1:55:58 PM org.springframework.boot.test.context.SpringBootTestContextBootstrapper getTestExecutionListeners
INFO: Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@1a4013, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@1b6e1eff, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@306f16f3, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@702b8b12, org.springframework.test.context.support.DirtiesContextTestExecutionListener@22e357dc, org.springframework.test.context.transaction.TransactionalTestExecutionListener@49912c99, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@10163d6, org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener@2dde1bff, org.springframework.security.test.context.support.ReactorContextTestExecutionListener@15bbf42f, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@550ee7e5, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@5f9b2141, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@247d8ae, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@48974e45, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@6a84a97d]

Может быть, это связано с использованием log4j2?

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>

person membersound    schedule 31.07.2018    source источник
comment
Используйте 1_   -  person Korashen    schedule 31.07.2018
comment
Я пытался, но безуспешно...   -  person membersound    schedule 31.07.2018
comment
Это странно. У меня работает с Spring Boot v2.0.4.RELEASE   -  person Korashen    schedule 31.07.2018
comment
Не могли бы вы в качестве теста добавить конфигурацию зависимостей log4j2, как указано выше? Может в этом причина?   -  person membersound    schedule 31.07.2018
comment
У меня такая же проблема. Вы пытались сообщить об этом с помощью Spring или добиться какого-либо другого прогресса? Я могу избавиться почти от всего вывода, указав вручную @ContextConfiguration(locations = ..., classes = ...) и @TestExecutionListeners(inheritListeners = true), но последняя строка все еще там. Кроме того, мне интересно, почему это регистрируется в stderr (красный) вместо stdout?   -  person Jodiug    schedule 15.07.2019
comment
@Jodiug, посмотрите мой последний ответ на этот вопрос :), надеюсь, это решит вашу проблему.   -  person Milan Desai    schedule 24.01.2020
comment
Помимо уровней логирования есть еще настройки: debug: false и trace: false в свойствах приложения, дополнительная информация в документации   -  person Aivaras    schedule 24.01.2020


Ответы (5)


Отредактировано

Создайте logback-test.xml в своем тестовом ресурсе (\test\resources), затем поместите в него приведенный ниже фрагмент.

<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="OFF"/>
</configuration>

Он печатает системную информацию по умолчанию, а не журналы шума при запуске. (Как вы хотели)

И зависимость теста может быть следующей

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
person Mehrdad HosseinNejad Yami    schedule 24.01.2020
comment
Спасибо за ваш ответ, и это способ отключить сообщения. Я все еще что-то упускаю - это также скрывает другие полезные сообщения. Журналы INFO обычно должны выводиться на стандартный вывод. Знаете ли вы, почему вывод журнала отображается красным (stderr), а не белым (stdout)? - person Jodiug; 24.01.2020
comment
^ Невозможно редактировать. Когда я указываю properties = ["logging.pattern.console="], сообщения журнала по-прежнему отображаются в stderr. То же самое для logback-test.xml. - person Jodiug; 24.01.2020
comment
Извините за недопонимание, вы имеете в виду, что вам нужны INFO в консоли, но в белом режиме? - person Mehrdad HosseinNejad Yami; 24.01.2020
comment
@membersound Отредактировано, пожалуйста, проверьте новый ответ и протестируйте его. - person Mehrdad HosseinNejad Yami; 24.01.2020
comment
Добавление строк в <module>/src/test/resources/logback-test.xml действительно меняет вывод теста: я вижу белые сообщения INFO или DEBUG от Spring, если я включаю его, и эти сообщения исчезают, когда я выключаю его. Однако красные информационные сообщения во время запуска теста по-прежнему отображаются независимо от настройки в файле logback-test.xml. Это наводит меня на мысль, что перед загрузкой logback-test.xml происходит некоторая фаза инициализации. - person Jodiug; 27.01.2020
comment
@Jodiug Я думаю, что журналы, о которых вы говорите, предназначены для инициализации журнала, с моим решением другие зашумленные журналы (например, в вопросе) будут игнорироваться (как вы и хотели) - person Mehrdad HosseinNejad Yami; 27.01.2020
comment
Красные информационные сообщения из Spring и точно такие же, как и в исходном вопросе. Первоначальный вопрос и мой вопрос заключаются в том, как подавить эти красные сообщения INFO stderr. Я очень ценю ваши усилия, но ваше решение не подавляет эти сообщения. - person Jodiug; 27.01.2020

Прежде всего: я знаю, что это не настоящий ответ, но он слишком длинный для комментария.

Использование зависимости log4j не сильно изменило мой вывод.

Мой ПОМ

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Мой application.properties пуст, поэтому там нет конфигурации журнала.

Мой тест

package com.example.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "logging.level.root=")
public class DemoApplicationTests
{

    @Test
    public void test()
    {
        System.out.println("Katzenbilder sind doof");
    }

}

Запуск тестов из IntelliJ с logging.level.root=OFF приводит к этому результату

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.4.RELEASE)

##### Optional[Hallo Welt]
##### Hallo Welt
Katzenbilder sind doof

Process finished with exit code 0

Две строки с #####являются System.out.println() из тестового компонента.

Выполняя тест с logging.level.root=INFO, я получаю ожидаемый беспорядок в сообщениях журнала Spring.

Я также, просто для проверки, поместил logging.level.root=INFO в свой application.properties и в тесте поставил OFF. Никакого беспорядка, только сообщения System.out.println().

person Korashen    schedule 31.07.2018
comment
Вы можете отключить баннер с помощью spring.main.banner-mode=off - person Selim; 31.07.2018

Вам нужно будет создать один logback-test.xml в вашем каталоге \test\resources, содержимое этого файла может быть следующим

<?xml version="1.0" encoding="UTF-8"?>
<configuration />

Почему пустой?

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

Если вы хотите узнать более конкретно, вы можете увидеть некоторые здесь

person Milan Desai    schedule 24.01.2020
comment
Я попробую это, хотя я все еще что-то упускаю - это заглушает вышеуказанные сообщения, но также может скрывать другие полезные сообщения. Журналы INFO обычно должны выводиться на стандартный вывод. Знаете ли вы, почему вывод журнала отображается красным (stderr), а не белым (stdout)? - person Jodiug; 24.01.2020
comment
^ Не могу редактировать, но этот способ у меня не работает. Я все еще получаю вывод INFO в stderr, хотя присутствует logback-test.xml - я подозреваю, что конфигурация журнала считывается только после появления этих сообщений. - person Jodiug; 24.01.2020

Похоже, это проблема конфигурации с log4j2. Пожалуйста, обратитесь к иерархии конфигурации log4j2 здесь.

В вашем случае log4j2 изначально настроен с использованием log4j2.properties или log4j2.xml, доступных в src/main/resources, и, следовательно, журналы INFO печатаются на консоли. Уровень ведения журнала будет изменен на OFF только при загрузке тестового класса, что делается только после того, как шум ведения журнала запуска уже напечатан.

Чтобы избежать шума в журнале при запуске, добавьте log4j2.properties или log4j2.xml под src/test/resources с уровнем ведения журнала root в качестве ERROR (я бы не предпочел установить для него значение OFF, так как это также подавляет любые ошибки).

Мне не удалось воспроизвести ошибку, когда журналы запуска записывались в stderr. Пожалуйста, проверьте, установили ли вы для свойства dest значение err в конфигурации log4j2. Это может привести к записи журналов запуска в stderr.

ИЗМЕНИТЬ №1

Делюсь своей log4j2.xml конфигурацией, помещенной под src/main/resources для справки.

Под src/test/resources <Root level="info"> заменяется на <Root level="error">.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="0">

  <Properties>
    <Property name="LOG_PATTERN">
      %d | %5p | [%t] | %c:%M(%L) | %m %n
    </Property>
  </Properties>

  <Appenders>
    <Console name="ConsoleAppender">
      <PatternLayout pattern="${LOG_PATTERN}" />
    </Console>
  </Appenders>

  <Loggers>
    <Root level="info">
      <AppenderRef ref="ConsoleAppender" />
    </Root>
  </Loggers>

</Configuration>
person Dhaval Shewale    schedule 28.01.2020
comment
Я попытался добавить log4j2.xml, logj4.xml, log4j2-test.xml, log4j-test.xml в папку тестовых ресурсов с приложениями журнала и разными уровнями корневого журнала. К сожалению, это не имеет никакого эффекта. Вот как выглядит неудачный тест: i.imgur.com/xNlj9Pu.jpg - person Jodiug; 29.01.2020
comment
Не могли бы вы поделиться своей конфигурацией log4j2.xml. Позвольте мне проверить с точно такой же конфигурацией. Я не сталкивался с проблемами записи журналов в stderr. - person Dhaval Shewale; 29.01.2020
comment
Я нашел это в Интернете и добавил несколько AAAAAAA в формат журнала, чтобы убедиться, что я заметил, изменится ли он: pastebin. com/raw/D7Nfspmj - person Jodiug; 30.01.2020
comment
Я попытался использовать вашу конфигурацию в src/test/resources, изменив уровень ведения журнала root на info, и у меня все работает нормально. Журналы записываются в stdout, а не в stderr. :) - person Dhaval Shewale; 30.01.2020
comment
К сожалению, я все еще вижу те же журналы INFO красным цветом, используя вашу конфигурацию в src/test/resources/log4j2.xml. Я провел поиск по слову dest в нашей кодовой базе, и он также оказался пустым... Думаю, пришло время опубликовать минимальный пример и начать A/B-тестирование. - person Jodiug; 30.01.2020
comment
@Jodiug Думаю, нам придется это сделать. Кстати, какую версию IntelliJ вы используете? Мне интересно, может ли это быть ошибкой в ​​IntelliJ. Хотя маловероятно, но просто мысль. Я использую IntelliJ IDEA 2019.3.2 (Community Edition) и весеннюю версию 2.0.4.RELEASE - person Dhaval Shewale; 30.01.2020

Спокойной ночи, здесь много ответов. Что касается конфигурации уровня журнала - все кажется правильным. Но ваша проблема может заключаться в том, что сборка maven будет шумной - почему бы вам не попытаться перенаправить вывод теста surefire в отдельные файлы, по одному для каждого теста?

https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#redirectTestOutputToFile

https://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html#redirectTestOutputToFile

Это может быть хорошо сделано глобально, как:

<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <redirectTestOutputToFile>true</redirectTestOutputToFile>
      </configuration>
  </plugin>
</pluginManagement>
person Diogo Quintela    schedule 30.01.2020
comment
Привет, Диого, спасибо за твой ответ, я еще не пробовал. Когда вывод теста перенаправляется в файл, вывод фактического теста исчезает, но красные сообщения INFO при инициализации SpringBootTest все еще присутствуют! - person Jodiug; 31.01.2020