Як вимкнути вихід із гаків відключення в тестах завантаження gradle?


13

Ви можете створити проект із start.spring.io до цього випуску з 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 & залежності = h2, data-jpa, web

У мене багатомодульний додаток springBoot, побудований з gradle, є купа тестів інтеграції 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

Для довідки додаток, створений з start.spring.io з gradle, не видає виводу на екран

./gradlew build

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

Замість цього висновок розміщується в build/reports/

У моєму випадку я НЕ вносив жодних змін у конфігурацію журналу, що постачається із завантаженням. Для рівнів реєстрації немає logback.xml або змін у application.yml. Я сподіваюся, що gradle захоплює систему та системні помилки та надсилає їх, build/reports/але деякі результати виходять із системи.


2
Налаштування рівня журналу для цих пакетів або класів нижче INFO(або видалення повністю).
Каяман

2
Це INFOрівні журналу рівнів. Вони походять з гаків відключення, як ви бачите, і вони закінчуються там, де колись налаштовано ведення журналу. Я припускаю, що теоретично повідомлення можуть закінчуватися в іншому місці, ніж було призначено, через зміну конфігурації протоколу і гаки виконуються асинхронно після цього. Тож було б за замовчуванням ці рядки до консолі, оскільки попередній конфігурація була вивантажена. Можливо.
Каяман

1
Чи можете ви додати свій тестовий клас та ваш основний клас додатків? І будь-яке відповідне application.properties/yml, пов’язане з конфігурацією джерела даних?
Даррен Форсайт

3
Можливо, гачки відключення трапляються тоді, коли процеси перевірки працівника Gradle були відключені після того, як вимкнено їх перенаправлення на вихід. Для відкриття дискусії, можливо, варто поставити питання про градуси / граді.
eskatos

2
В ідеалі весняне завантаження - це відключення у ваших тестах, не покладаючись на гачки відключення jvm, це було б проблемою весни.
eskatos

Відповіді:


4

@eskatos має рацію. Диспетчер журналу відривається після виконання тестового випадку перед тим, як вимкнути робочий процес. Всі гачки відключення виконуються при відключенні робочого процесу і перенаправляються назад до консолі.

Оскільки ці повідомлення породжуються весняним завантаженням, найкращим місцем було б фільтрація повідомлень про відключення за допомогою тестування конфігурації тестування xml xml.

Щось на зразок logback-test.xml у src / test / ресурси

<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
ІМО - найкраща відповідь досі.
Стеффен Харбіч

3

Можна відключити висновок з або вирішити , що увійти з завдання, для того , щоб контролювати стандартний висновок / STDERR тестової віртуальної машини Java: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, що надходять від СВМ. Коли можна визначити event.messageвміст extShutdownHook, можна пропустити журнал.


см Ви можете створити проект з start.spring.io до цього питання від start.spring.io / ... відтворити проблему
Ams

Це, мабуть, не проблема, тому що INFOце рівень журналу за замовчуванням для Spring; можна встановити інші рівні журналів, наприклад. logging.level.org.springframework=TRACEяк змінна середовище.
Мартін Цайтлер

1
Я вважаю, що журнали вимкнення гака створюються поза тестовим завданням. Чи можете ви оновити свою відповідь, щоб показати, як можна фільтрувати повідомлення про гачки відключення? Я думаю, що найкраще місце для фільтрації цих повідомлень - це те, де вони генеруються, це все одно у весняному завантаженні.
Сагар Веерам

3

Я можу приховати специфічний тестовий журнал весняних даних (заснований на цій весняній стартері ), додавши follwoing application.propertiesв src / test / ресурси:

logging.level.root=ERROR

logging.level.org.springframeworkне впливатиме, наприклад, на com.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

0

У Gradle працює тихий режим.

./gradlew build -q

Але вам все одно потрібна інформація про тести. можна використовувати і джакоко, і сонарква. Це працювало для мене тут і тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.