Jak wyłączyć wyjście z haków zamykających w testach rozruchu stopniowego?

13

Możesz wygenerować projekt od start.spring.io do tego problemu z 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 i opis = demo% 20projekt% 20dla% 20Spring% 20Boot i nazwa_pakietu = com.example.demo i opakowanie = jar & javaVersion = 1.8 i zależności = h2, data-jpa, web

Mam wielomodułową aplikację SpringBoot zbudowaną z gradle, jest kilka testów integracji SpringBoot. Kiedy robię kompilację, kończę z pewnym wyjściem z zamykania SpringBoot do konsoli, jak pokazano poniżej. Jak wyłączyć to wyjście?

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

W celach informacyjnych aplikacja utworzona ze start.spring.io z gradle nie generuje danych wyjściowych na ekranie

./gradlew build

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

Zamiast tego wyjście jest umieszczane w build/reports/

W moim przypadku NIE wprowadziłem żadnych zmian w konfiguracji rejestrowania dołączonej do bootowania. Nie ma pliku logback.xml ani zmian w pliku application.yml dla poziomów rejestrowania. Spodziewam się, że grad przechwytuje system i błąd systemu i wysyła je do, build/reports/ale niektóre wyjścia wydają się uciekać do systemu.

ams
źródło
2
Dostosowanie poziomu rejestrowania dla tych pakietów lub klas poniżej INFO(lub całkowite usunięcie).
Kayaman
2
Są to INFOwiersze dziennika poziomu. Pochodzą one z haków zamykania, jak widać, i kończą się tam, gdzie skonfigurowano rejestrowanie. Przypuszczam, że teoretycznie komunikaty mogą skończyć się w innym miejscu niż zamierzone, ze względu na zmianę konfiguracji rejestrowania i późniejsze wykonywanie asynchronicznych haków. Więc domyślnie te wiersze byłyby w konsoli, ponieważ poprzednia konfiguracja została zwolniona. Może.
Kayaman
1
Czy możesz dodać swoją klasę testową, a także swoją główną klasę aplikacji? I jakieś odpowiednie application.properties/yml związane z konfiguracją źródła danych?
Darren Forsythe
3
Może się zdarzyć, że haki zamykania wystąpią, gdy procesy robocze testu Gradle zostaną odrzucone po usunięciu przekierowania danych wyjściowych. To może być warte oceny / oceny, aby otworzyć dyskusję.
eskatos
2
Idealnie, że wiosenny rozruch jest zamykany w twoich testach bez konieczności polegania na hakach zamykających jvm, co byłoby problemem wiosennym.
eskatos

Odpowiedzi:

4

@eskatos ma rację. Menedżer rejestrowania jest usuwany po wykonaniu przypadku testowego przed zamknięciem procesu roboczego. Wszystkie haki zamykania są wykonywane, gdy proces roboczy jest zamykany i są przekierowywane z powrotem do konsoli.

Ponieważ te komunikaty są generowane przez wiosenny rozruch, najlepszym miejscem byłoby filtrowanie komunikatów zamykania za pomocą xml konfiguracji testu logback.

Coś jak logback-test.xml wewnątrz 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
źródło
1
IMO najlepsza jak dotąd odpowiedź na obejście.
Steffen Harbich
3

Można wyłączyć dane wyjściowe za pomocą lub zdecydować, co należy zarejestrować w zadaniu, aby kontrolować stdout / stderr testowej maszyny 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)
    }
}

Te strumienie to TestLogEvent STANDARD_OUT& STANDARD_ERROR, które pochodzą z JVM. Gdy można określić event.messagezawartość extShutdownHook, można pominąć rejestrowanie.

Martin Zeitler
źródło
zobaczyć można wygenerować projekt z start.spring.io do tej kwestii z start.spring.io/... odtworzyć problem
AMS
Prawdopodobnie nie jest to problem, ponieważ INFOjest to domyślny poziom rejestrowania dla wiosny; można ustawić inne poziomy logów, np. logging.level.org.springframework=TRACEjako zmienna środowiskowa.
Martin Zeitler
1
Uważam, że dzienniki haka zamykania są generowane poza zadaniem testowym. Czy możesz zaktualizować swoją odpowiedź, aby pokazać, w jaki sposób można filtrować wiadomości haka zamykania? Myślę, że najlepszym miejscem do filtrowania tych wiadomości jest miejsce, w którym są generowane i tak są w rozruchu wiosennym.
Sagar Veeram
3

Mógłbym ukryć rejestrowanie testów specyficznych dla danych wiosennych (na podstawie tego wiosennego startera ), dodając następujące śledzenie application.propertiesdo src / test / resources:

logging.level.root=ERROR

logging.level.org.springframeworknie będzie miało wpływu na np. com.zaxxer.hikarirejestrator, ale masz tutaj elastyczne opcje .

( root=ERRORjest jak „podejście młota saneczkowego”).

( src/main/resourcesjest również możliwe, ale ma wpływ nie tylko na test, ale także na środowisko uruchomieniowe aplikacji) ( application.propertiesjest tylko jedną z wielu możliwych „lokalizacji” dla tej właściwości ... patrz także: https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

Dzięki temu otrzymuję „cichą” gradację, również na clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed
xerx593
źródło
0

Gradle ma tryb cichy.

./gradlew build -q

Ale nadal potrzebujesz informacji o testach. możesz użyć jacoco i sonarqube. To działało dla mnie tu i tutaj .

Abdysamat
źródło