[java] Gradle 부팅 테스트에서 종료 후크의 출력을 끄는 방법은 무엇입니까?

https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&artifactId=demo&name 에서 start.spring.io에서이 이슈까지 프로젝트를 생성 할 수 있습니다. = demo & description = Demo % 20project % 20for % 20Spring % 20Boot & packageName = com.example.demo & packaging = jar & javaVersion = 1.8 & dependencies = h2, data-jpa, web

gradle로 빌드 된 다중 모듈 springBoot 응용 프로그램이 있으며 SpringBoot 통합 테스트가 많이 있습니다. 빌드 할 때 아래 그림과 같이 SpringBoot 종료에서 콘솔로 출력됩니다. 이 출력을 어떻게 끄나요?

± |master 1 {1} S:3 U:10 ✗|  ./gradlew build

> Task :core:test
2020-02-01 11:20:33.529  INFO 24114 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:33.531  INFO 24114 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-02-01 11:20:33.538  INFO 24114 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

> Task :email:test
2020-02-01 11:20:43.820  INFO 24150 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:43.820  INFO 24150 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:43.822  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Shutdown initiated...
2020-02-01 11:20:43.822  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-02-01 11:20:43.830  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2020-02-01 11:20:43.830  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Shutdown completed.

> Task :security:test
2020-02-01 11:20:54.941  INFO 24188 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:54.944  INFO 24188 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-02-01 11:20:54.952  INFO 24188 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.1.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 46s
57 actionable tasks: 54 executed, 3 up-to-date

참조를 위해 gradle을 사용하여 start.spring.io에서 작성된 응용 프로그램은 화면에 출력을 생성하지 않습니다.

./gradlew build

BUILD SUCCESSFUL in 779ms
5 actionable tasks: 5 up-to-date

대신 출력은 build/reports/

필자의 경우 부트와 함께 제공되는 로깅 구성을 변경하지 않았습니다. logback.xml이 없거나 로깅 레벨을 위해 application.yml이 변경되었습니다. gradle이 시스템 및 시스템 오류를 캡처하여 시스템으로 보내는 것으로 예상 build/reports/하지만 일부 출력은 시스템 출력으로 빠져 나가는 것 같습니다.



답변

@eskatos가 맞습니다. 작업자 프로세스를 종료하기 전에 테스트 케이스가 실행 된 후 로깅 관리자가 해제됩니다. 작업자 프로세스가 종료되고 콘솔로 다시 리디렉션되면 모든 종료 후크가 실행됩니다.

이러한 메시지는 스프링 부트로 생성되므로 로그 백 테스트 구성 xml을 사용하여 종료 메시지를 필터링하는 것이 가장 좋습니다.

src / test / resources 내부의 logback-test.xml과 같은 것

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                <expression>return event.getThreadName().contains("ShutdownHook");</expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

build.gradle

testCompile 'org.codehaus.janino:janino'


답변

하나는과 출력을 비활성화 할 수 있습니다 또는 로그할지 결정 (A)의 테스트 JVM의 표준 출력 / 표준 에러를 제어하기 위해, 작업 :TestLoggingContainer testLogging.showStandardStreams = false onOutputTest

apply plugin: 'java'

test {

    // show standard out and standard error of the test JVM on the console
    // can be used to disable the console output:
    testLogging.showStandardStreams = true

    // listen to standard out and standard error of the test JVM
    // can be used to make the logging optional:
    onOutput { descriptor, event ->
        logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message)
    }
}

이 스트림은 TestLogEvent STANDARD_OUT& STANDARD_ERROR이며 JVM에서 제공됩니다. event.message포함을 결정할 수 있으면 extShutdownHook로깅을 건너 뛸 수 있습니다.


답변

src / test / resources에 다음 을 추가하여 스프링 데이터 특정 테스트 로깅 ( 이 스프링 스타터 기반)을 숨길 수 있습니다.application.properties

logging.level.root=ERROR

logging.level.org.springframeworkcom.zaxxer.hikari로거 에는 영향을 미치지 않지만 여기 에는 유연한 옵션이 있습니다.

( root=ERROR“썰매 망치 접근”과 같습니다).

( src/main/resources도 가능하지만 테스트에서뿐만 아니라 응용 프로그램 실행시뿐만 아니라 효과가 있습니다) ( application.properties중 하나입니다 많은 수 “위치” 참조 또한 …이 속성 : https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

이것으로 나는 “자동”gradle 출력을 얻습니다 clean build.

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed


답변

Gradle에는 조용한 모드가 있습니다.

./gradlew build -q

그러나 여전히 테스트에 대한 정보가 필요합니다. jacoco와 sonarqube를 사용할 수 있습니다. 여기여기 에 나를 위해 일 했다 .


답변