Spring Boot Test ігнорує logging.level


91

Один із моїх модулів maven ігнорує мої рівні реєстрації під час запуску тестів.

У src/test/resourcesмене є application.properties:

app.name=bbsng-import-backend
app.description=Import Backend Module for Application
spring.profiles.active=test

# LOGGING
logging.level.root=error
logging.level.org.springframework.core =fatal
logging.level.org.springframework.beans=fatal
logging.level.org.springframework.context=fatal
logging.level.org.springframework.transaction=error
logging.level.org.springframework.test=error
logging.level.org.springframework.web=error
logging.level.org.hibernate=ERROR

Я теж намагався application-test.properties.

Моя програма багато реєструє, особливо під час завантаження контексту. Я спробував logback.xml, logback-test.xmlі , logback-spring.xmlале нічого не допомагає.

Мій пом:

<parent>
    <groupId>at.company.bbsng</groupId>
    <artifactId>bbsng-import</artifactId>
    <version>0.1.0-SNAPSHOT</version>
</parent>

<artifactId>bbsng-import-backend</artifactId>
<name>bbsng-import-backend</name>

<properties>
    <start-class>at.company.bbsng.dataimport.ApplicationImportBackend</start-class>
</properties>


<dependencies>

    <!-- APPLICATION ... -->
    <dependency>
        <groupId>at.company.bbsng</groupId>
        <artifactId>bbsng-app-domain</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- SPRING ... -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</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-data-jpa</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- JAVAX ... -->
       ...

    <!-- COMMONS ... -->
       ...

    <!-- LOMBOK ... -->
       ...

    <!-- DB -->
       ...

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${org.springframework.boot-version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Один простий тестовий клас:

@ContextConfiguration(classes = { ApplicationImportBackend.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {

    @Autowired
    private JobLauncher jobLauncher;

    @Test
    public void testSimpleProperties() throws Exception {
        assertNotNull(jobLauncher);
    }

}

Журнали програм перебувають у режимі ВИРОБНИЦЯ.

І так, application.propertiesбуде завантажено. Я вже намагався зламати програму помилковим конфігурацією.

Дякую за будь-які підказки.

Відповіді:


90

Добре, що я зробив зараз, у всіх модулях я налаштував так:

SRC / основні / ресурси:
Я використовую конфігурацію протоколювання в application.properiesяк , logging.level.*як описано в цьому питанні.

src / test / resources:
Я використовую logback-test.xmlяк:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="*.myapp" level="error" />
    <logger name="org.springframework.core " level="error" />
    <logger name="org.springframework.beans" level="error" />
    <logger name="org.springframework.context" level="error" />
    <logger name="org.springframework.transaction" level="error" />
    <logger name="org.springframework.web" level="error" />
    <logger name="org.springframework.test" level="error" />
    <logger name="org.hibernate" level="error" />
</configuration>

Але я все ще не розумію, чому в декількох модулях я міг би використовувати application.properties, а в іншому модулі він ігнорує ... Але наразі він працює для мене як є.

Але, можливо, небагато підказок з попередніми знаннями все ж вітаються.

Я не позначаю свою відповідь як рішення, тому що вона все ще відчуває себе як обхідний шлях.


7
Я припускаю, що application.propertiesаналіз проводиться пізніше, ніж ініціалізація тесту. Ось чому org.springframework.testне впливає на початкове тестування журналу.
Ельнур Абдуррахімов

те саме питання, також із використанням logback-test.xml
radistao

3
Це круто. Я додав <logger name="org.springframework.boot" level="warn" />і <logger name="org.eclipse.jetty" level="warn" />дійсно мінімізував шум. Якщо ви використовуєте розмах, ви також можете додати <logger name="springfox" level="warn" />. Молодці. Майте щедроту!
Богемський

1
Це допомогло, хоча після того, як я спробував додати logback-test.xmlфайл , я почав бачити купу журналів із самого журналу . Щоб вимкнути їх, я дотримувався головної відповіді з цього допису StackOverflow - і BAM, мені вдалося позбутися всіх попередніх журналів під час запуску тестів.
Денні Булліс,

1
Та сама проблема. 2 Модулі з точно однаковою конфігурацією (базовий клас). Один веде журнал під час створення контексту, інший ні. Зміни в application.properties (logging.level) набувають чинності. Використання вищезгаданих logback-test.xmlробіт працює, як очікувалося. (+1) подяка
Торстен

27
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

Для швидкого виправлення я помістив logback.xmlфайл із зазначеним вище вмістом src/test/resourcesі він працює.


3
Приємне, чисте рішення. Файл також може бути названий "logback-test.xml" і для ясності його слід розмістити у розділі 'src / test / resources'.
Кшиштоф Томашевський

Так, ясність є причиною, чому я назвав йогоlogback-text.xml
Майкл

яка різниця до моєї відповіді?
Michael

22

Щоб увімкнути application.propertiesнеобхідність додавання анотації @SpringBootTestдо тестового класу, читайте більше тут .


2
@SpringBootTest призначений для тестів інтеграції, і тому буде завантажено application.properties. Але для модульних тестів це не правильна відповідь.
Tobsch

11

Я також шукаю рішення цього, тим часом я використовую таке рішення:

це не найкраще, але це працює

@BeforeClass
public static void setErrorLogging() {
   LoggingSystem.get(ClassLoader.getSystemClassLoader()).setLogLevel(Logger.ROOT_LOGGER_NAME, LogLevel.ERROR);
}

LoggingSystem: загальна абстракція над лісозаготівельними системами.

->

get: Виявлення та повернення використовуваної системи реєстрації. Підтримує реєстрацію та реєстрацію Java

setLogLevel: Встановлює рівень реєстрації для даного реєстратора.

Не забудьте змінити рівень журналу для всіх інших тестових класів.

Сподіваюся, це допоможе тобі, удача


2
Це єдиний спосіб, коли я коли-небудь змушував журналювання зупинятися. Дякую
RobOhRob

Це звичайний біт коду, який потрібно знати на випадок, якщо вам доведеться перевірити, що реєструється, не маючи купу конфігураційних файлів реєстратора.
Xenson

7

Якщо до тестів додано примітки, @DataJpaTestви можете вимкнути вихід із режиму Hibernate SQL за допомогою:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}

Дякую Це, безумовно, найкраща відповідь. Дякую тонна.
Doogle

2

Спробуйте це:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}

Дякуємо за відповідь, але результати налагодження все ще є. Ще якийсь клей, можливо?
Michael Hegner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.