Spring BootTestはlogging.levelを無視します


90

Mavenモジュールの1つが、テストの実行時にログレベルを無視します。

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.xmllogback-test.xmllogback-spring.xml何も助けません。

私のpom:

<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>

1つの簡単なテストクラス:

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

    @Autowired
    private JobLauncher jobLauncher;

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

}

アプリケーションログはDEBUGモードです。

そして、はい、application.propertiesがロードされます。私はすでに間違った設定でアプリケーションを壊そうとしました。

ヒントをありがとうございます。

回答:


89

さて、私が今やったことは、すべてのモジュールで次のように構成しました。

src / main / resources:質問で説明されているように
ロギング構成を使用します。application.properieslogging.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、最初のテストログには影響しません。
Elnur Abdurrakhimov 2016年

同じ問題、logback-test.xmlも使用
radistao 2016

3
これはすごいです。追加<logger name="org.springframework.boot" level="warn" /><logger name="org.eclipse.jetty" level="warn" />、ノイズを最小限に抑えました。swaggerを使用している場合は、を追加することもでき<logger name="springfox" level="warn" />ます。よくやった。賞金を!
ボヘミアン

1
logback-test.xmlファイルを追加しようとした後、ログバック自体から大量のログが表示されるようになりましたが、これは役に立ちました。それらをオフするために、私はこのStackOverflowの投稿からの主な答えに従いました-そしてBAM、私はテストを実行するときにすべての先行ログを取り除くことができました。
Danny Bullis 2018

1
同じ問題。まったく同じ構成(基本クラス)の2つのモジュール。1つはコンテキストの作成中にログを記録し、もう1つはログを記録しません。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」の下に配置する必要があります。
Krzysztof Tomaszewski 2018年

はい、わかりやすくするには、私はそれを名前の理由はあるlogback-text.xml
マイケルHegner

私の答えの違いは何ですか?
MichaelHegner19年

22

テストクラスにapplication.propertiesアノテーションを追加する必要性を有効にするには、ここで@SpringBootTest詳細をお読みください


2
@SpringBootTestは統合テスト用であるため、application.propertiesがロードされます。しかし、ユニットテストの場合、これは正しい答えではありません。
トブシュ

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場合は、次の方法でHibernateSQLログをオフに切り替えることができます。

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

ありがとうこれは断然最良の答えです。トンありがとう。
ドゥーグル

2

これを試して:

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

返信ありがとうございますが、デバッグ出力はまだあります。これ以上の接着剤は多分?
Michael Hegner 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.