Comment désactiver la sortie des crochets d'arrêt dans les tests de démarrage Gradle?

13

Vous pouvez générer un projet à partir de start.spring.io vers ce problème à partir de 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 & description = Demo% 20project% 20for% 20Spring% 20Boot & packageName = com.example.demo & packaging = jar & javaVersion = 1.8 & dependencies = h2, data-jpa, web

J'ai une application SpringBoot multi-module construite avec gradle, il y a un tas de tests d'intégration SpringBoot. Quand je fais une construction, je me retrouve avec une sortie de l'arrêt SpringBoot vers la console comme indiqué ci-dessous. Comment désactiver cette sortie?

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

Pour référence, une application créée à partir de start.spring.io avec gradle ne produit aucune sortie à l'écran

./gradlew build

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

Au lieu de cela, la sortie est placée dans build/reports/

Dans mon cas, je n'ai PAS apporté de modifications à la configuration de journalisation fournie avec le démarrage. Il n'y a pas de logback.xml ou de modification du fichier application.yml pour les niveaux de journalisation. Je m'attends à ce que gradle capture le système et les erreurs système et les envoie au, build/reports/mais certaines sorties semblent s'échapper vers le système.

ams
la source
2
Ajuster le niveau de journalisation de ces packages ou classes au-dessous INFO(ou supprimer complètement).
Kayaman
2
Ce sont INFOdes lignes de journal de niveau. Ils proviennent des points d'arrêt comme vous le voyez, et ils finissent là où la journalisation est configurée. Je suppose qu'en théorie, les messages pourraient finir à un endroit différent de celui prévu, en raison de la modification de la configuration de l'enregistrement et des hooks exécutés de manière asynchrone par la suite. Donc, il faudrait par défaut ces lignes à la console, comme la configuration précédente a été déchargée. Peut être.
Kayaman
1
Pouvez-vous ajouter votre classe de test et votre classe d'application principale aussi? Et toute application.properties/yml pertinente associée à la configuration de la source de données?
Darren Forsythe
3
Il se peut que les crochets d'arrêt se produisent lorsque les processus de test Gradle sont arrêtés après la suppression de leur redirection de sortie. Cela pourrait valoir la peine de publier un numéro gradle / gradle pour ouvrir la discussion.
eskatos
2
Idéalement, la botte de printemps est arrêtée dans vos tests sans avoir à compter sur des crochets d'arrêt jvm, ce serait un problème de ressort.
eskatos

Réponses:

4

@eskatos a raison. Le gestionnaire de journalisation est supprimé après l'exécution du scénario de test avant l'arrêt du processus de travail. Tous les hooks d'arrêt sont exécutés lorsque le processus de travail est arrêté et sont redirigés vers la console.

Comme ces messages sont générés par Spring Boot, le meilleur endroit serait de filtrer les messages d'arrêt à l'aide du fichier XML de configuration du test de déconnexion.

Quelque chose comme logback-test.xml dans 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
la source
1
OMI la meilleure solution de contournement jusqu'à présent.
Steffen Harbich
3

On peut désactiver la sortie avec ou décider quoi enregistrer d'une tâche, afin de contrôler le stdout / stderr de la JVM de test: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)
    }
}

Ces flux sont TestLogEvent STANDARD_OUT& STANDARD_ERROR, qui proviennent de la JVM. Quand on peut déterminer un event.messagecontenant extShutdownHook, on peut sauter la journalisation.

Martin Zeitler
la source
Vous pouvez voir générer un projet de start.spring.io à cette question de start.spring.io/... de reproduire le problème
ams
Ce n'est probablement pas un problème, car il INFOs'agit du niveau de journalisation par défaut pour Spring; on peut définir d'autres niveaux de journalisation, par exemple. logging.level.org.springframework=TRACEcomme variable environnementale.
Martin Zeitler
1
Je pense que les journaux de hook d'arrêt sont générés en dehors de la tâche de test. Pourriez-vous mettre à jour votre réponse pour montrer comment filtrer les messages de hook d'arrêt? Je pense que le meilleur endroit pour filtrer ces messages est l'endroit où ils sont générés, c'est-à-dire au printemps de toute façon.
Sagar Veeram
3

Je pourrais masquer la journalisation de test spécifique aux données de printemps (basée sur ce démarreur de printemps ) en ajoutant le suivi application.propertiesà src / test / resources:

logging.level.root=ERROR

logging.level.org.springframeworkn'aura pas d'effet par exemple sur l' com.zaxxer.hikarienregistreur, mais vous avez ici des options flexibles .

( root=ERRORc'est comme "l'approche du marteau de traîneau").

( src/main/resourcesest également possible mais a un effet non seulement au test mais également au moment de l'exécution de l'application) ( application.propertiesn'est qu'un des nombreux "emplacements" possibles pour cette propriété ... voir aussi: https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

Avec cela, j'obtiens une sortie gradle "silencieuse", également sur clean build:

$ ./gradlew clean build

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

Gradle a un mode silencieux.

./gradlew build -q

Mais vous avez toujours besoin d'informations sur les tests. vous pouvez utiliser jacoco et sonarqube. Cela a fonctionné pour moi ici et ici .

Abdysamat
la source