Kepçe önyükleme testlerinde kapatma kancalarından çıkış nasıl kapatılır?


13

Https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&artifactId=demo&name adresinden bu soruna bir proje oluşturabilirsiniz. = demo ve açıklama Deneme% 20project% 20for% 20Spring% 20Boot ve packagename = com.example.demo ve ambalaj = kavanoz ve javaVersion = 1.8 ve bağımlılıklar = h2, veri JPA, ağ-=

Gradle ile inşa edilmiş bir çok modüllü SpringBoot uygulaması var, bir sürü SpringBoot entegrasyon testi var. Bir derleme yaptığımda, SpringBoot kapanışından konsola bazı çıktılar aşağıda gösterildiği gibi çıkıyor. Bu çıkışı nasıl kapatabilirim?

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

Referans olarak, start.spring.io öğesinden dereceli olarak oluşturulan bir uygulama ekranda çıktı üretmez

./gradlew build

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

Bunun yerine çıktı build/reports/

Benim durumumda, önyükleme ile birlikte gelen günlük yapılandırmasında herhangi bir değişiklik YAPMADIM. Günlük düzeyleri için logback.xml veya application.yml dosyasında değişiklik yoktur. Gradle'ın sistem ve sistem hatasını yakalayıp beklediğini bekliyorum, build/reports/ancak bazı çıkışlar sistemden kaçıyor gibi görünüyor.


2
Bu paketler veya sınıflar için kayıt seviyesinin aşağıya ayarlanması INFO(veya tamamen kaldırılması).
Kayaman

2
Bunlar INFOseviye log hatlarıdır. Gördüğünüz gibi kapatma kancalarından kaynaklanırlar ve günlüklemenin yapılandırıldığı her yerde sonuçlanırlar. Teorik olarak mesajların, konfigürasyonun değişmesi ve kancaların daha sonra eşzamansız olarak çalıştırılması nedeniyle mesajların amaçlanandan farklı bir yerde olabileceğini düşünüyorum. Bu nedenle, önceki yapılandırma kaldırıldığı için bu satırları konsola varsayılan olarak ayarlar. Olabilir.
Kayaman

1
Test sınıfınızı ve ana uygulama sınıfınızı da ekleyebilir misiniz? Ve veri kaynağı yapılandırma ile ilgili herhangi bir ilgili application.properties/yml?
Darren Forsythe

3
Gradle test worker (Çıktı testi) işçi süreçleri, çıktı yönlendirmeleri bozulduktan sonra kapatıldığında kancalar olabilir. Tartışmayı açmak için bir not / not seviyesi sorunu olabilir.
eskatos

2
İdeal olarak bahar önyükleme, jvm kapatma kancalarına güvenmek zorunda kalmadan testlerinizde kapanır, bu bir bahar sorunu olacaktır.
eskatos

Yanıtlar:


4

@eskatos haklı. Günlük durumu, çalışan işlem kapatılmadan önce test durumu yürütüldükten sonra kaldırılır. Tüm kapatma kancaları, çalışan işlem kapatıldığında yürütülür ve konsola yeniden yönlendirilir.

Bu mesajlar bahar önyükleme ile üretildiğinden, en iyi yer kapatma mesajlarını logback test yapılandırması xml kullanarak filtrelemek olacaktır.

Src / test / resources içindeki logback-test.xml gibi bir şey

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

1
IMO şimdiye kadarki en iyi geçici çözüm cevabı.
Steffen Harbich

3

Test JVM'sinin stdout / stderr'ını kontrol etmek için çıktıyı devre dışı bırakabilir veya bir görevin ne günlüğe kaydedileceğine karar verilebilir :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)
    }
}

Bu akışlar JVM'den gelen TestLogEvent STANDARD_OUT& STANDARD_ERROR. Birinin bir belirleyebilir zaman event.messageiçeren extShutdownHook, tek bir günlük atlayabilir.


Sen bu konuya start.spring.io gelen bir proje üretebilir bkz start.spring.io/... sorunu yeniden oluşturmak için
AMS

Muhtemelen sorun değil, çünkü INFOBahar için varsayılan günlük kaydı seviyesi; biri diğer günlük seviyelerini ayarlayabilir, örn. logging.level.org.springframework=TRACEçevresel değişken olarak.
Martin Zeitler

1
Kapanma kanca günlüklerinin test görevinin dışında üretildiğine inanıyorum. Kapatma kanca mesajlarını nasıl filtreleyebileceğini göstermek için cevabınızı güncelleyebilir misiniz? Bu iletileri filtrelemek için en iyi yer, zaten bahar önyüklemesinde üretilen nerede olduğunu düşünüyorum.
Sagar Veeram

3

Ben follwoing src / test / kaynaklarına ekleyerek bahar verilerine özgü test günlüğü ( bu bahar başlatıcı dayalı) gizleyebilirsiniz :application.properties

logging.level.root=ERROR

logging.level.org.springframeworkörneğin com.zaxxer.hikarikaydedici üzerinde bir etkisi olmaz , ancak burada esnek seçenekleriniz vardır .

( root=ERROR"kızak çekiç yaklaşımı" gibidir).

( src/main/resourcesayrıca mümkündür ancak yalnızca testte değil, uygulama çalışma zamanında da etkilidir) ( bu özellik için olası birçok "konumdan"application.properties yalnızca biridir ... ayrıca bkz: https://docs.spring.io/spring-boot/ dokümanlar / current / reference / html / appendix-application-properties.html )

Bununla bir "sessiz" gradle çıktı, ayrıca bir clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed

0

Gradle'ın sessiz bir modu vardır.

./gradlew build -q

Ancak testler hakkında hala bilgiye ihtiyacınız var. jacoco ve sonarqube kullanabilirsiniz. Burada ve burada benim için çalıştı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.