Bagaimana cara mematikan output dari kait shutdown dalam tes boot gradle?

13

Anda dapat menghasilkan proyek dari start.spring.io untuk masalah ini dari https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&artifactId=demo&name = demo & deskripsi = Demo% 20proyek% 20untuk% 20Spring% 20Boot & packageName = com.example.demo & packaging = jar & javaVersion = 1.8 & dependensi = h2, data-jpa, web

Saya memiliki aplikasi springBoot multi-modul yang dibangun dengan gradle, ada banyak tes integrasi SpringBoot. Ketika saya melakukan build saya berakhir dengan beberapa output dari shutdown SpringBoot ke konsol seperti yang ditunjukkan di bawah ini. Bagaimana cara mematikan output ini?

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

Untuk referensi aplikasi yang dibuat dari start.spring.io dengan gradle tidak menghasilkan output di layar

./gradlew build

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

Sebagai gantinya output ditempatkan build/reports/

Dalam kasus saya, saya belum membuat perubahan pada konfigurasi logging yang datang dengan boot. Tidak ada logback.xml, atau perubahan pada application.yml untuk level logging. Saya berharap gradle menangkap sistem keluar dan kesalahan sistem dan mengirimkannya ke build/reports/tetapi beberapa output tampaknya lolos ke sistem keluar.

am
sumber
2
Menyesuaikan level logging untuk paket-paket atau kelas-kelas di bawah ini INFO(atau menghapus sepenuhnya).
Kayaman
2
Itu adalah INFOgaris level log. Mereka berasal dari kait shutdown seperti yang Anda lihat, dan mereka berakhir di mana pun logging dikonfigurasi. Saya kira secara teori pesan mungkin berakhir di tempat yang berbeda dari yang dimaksudkan, karena konfigurasi logging berubah dan kait dieksekusi secara asinkron sesudahnya. Jadi itu akan default garis-garis tersebut ke konsol, karena konfigurasi sebelumnya diturunkan. Mungkin.
Kayaman
1
Bisakah Anda menambahkan kelas tes Anda, dan kelas aplikasi utama Anda juga? Dan setiap application.properties/yml yang relevan yang dikaitkan dengan konfigurasi sumber data?
Darren Forsythe
3
Bisa jadi kait penghentian terjadi ketika proses pekerja uji Gradle ditolak setelah pengalihan outputnya dihancurkan. Itu mungkin bernilai masalah gradle / gradle untuk membuka diskusi.
eskatos
2
Idealnya spring boot adalah shutdown dalam pengujian Anda tanpa harus bergantung pada kait shutdown jvm, itu akan menjadi masalah pegas.
eskatos

Jawaban:

4

@ Eskatos benar. Manajer logging diruntuhkan setelah kasus uji dieksekusi sebelum mematikan proses pekerja. Semua kait pematian dieksekusi ketika proses pekerja dimatikan dan diarahkan kembali ke konsol.

Karena pesan-pesan ini dihasilkan oleh spring boot, tempat terbaik adalah memfilter pesan-pesan shutdown menggunakan konfigurasi tes logback xml.

Sesuatu seperti logback-test.xml di dalam src / test / resources

<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'
Sagar Veeram
sumber
1
IMO jawaban solusi terbaik sejauh ini.
Steffen Harbich
3

Satu dapat menonaktifkan output dengan atau memutuskan apa yang harus log dari tugas, untuk mengontrol stdout / stderr dari JVM uji: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)
    }
}

Aliran ini adalah TestLogEvent STANDARD_OUT& STANDARD_ERROR, yang berasal dari JVM. Ketika seseorang dapat menentukan suatu event.messagemengandung extShutdownHook, seseorang dapat melewati pencatatan.

Martin Zeitler
sumber
lihat Anda dapat menghasilkan proyek dari start.spring.io untuk masalah ini dari start.spring.io/… untuk mereproduksi masalah
ams
Ini mungkin bukan masalah, karena INFOini adalah level logging default untuk Spring; seseorang dapat mengatur level log lainnya, mis. logging.level.org.springframework=TRACEsebagai variabel lingkungan.
Martin Zeitler
1
Saya percaya log kait shutdown dihasilkan di luar tugas uji. Bisakah Anda memperbarui jawaban Anda untuk menunjukkan bagaimana seseorang dapat memfilter pesan kait penonaktifan? Saya pikir tempat terbaik untuk memfilter pesan-pesan ini adalah di mana mereka dihasilkan yang ada di spring boot.
Sagar Veeram
3

Saya bisa menyembunyikan data-logging khusus pegas-data (berdasarkan pegas-starter ini ) dengan menambahkan follwoing application.propertieske src / test / resources:

logging.level.root=ERROR

logging.level.org.springframeworktidak akan berpengaruh pada mis. com.zaxxer.hikarilogger, tetapi Anda memiliki opsi fleksibel di sini.

( root=ERRORseperti "pendekatan palu godam").

( src/main/resourcesjuga dimungkinkan tetapi memiliki efek tidak hanya pada pengujian tetapi juga saat runtime aplikasi) ( application.propertieshanya satu dari banyak "lokasi" yang mungkin untuk properti ini ... lihat juga: https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

Dengan ini saya mendapatkan output gradle "silent", juga pada clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed
xerx593
sumber
0

Gradle memiliki mode senyap.

./gradlew build -q

Tetapi Anda masih membutuhkan informasi tentang tes. Anda dapat menggunakan jacoco dan sonarqube. Ini bekerja untuk saya di sini dan di sini .

Abdysamat
sumber