Làm cách nào để tắt đầu ra từ móc tắt máy trong kiểm tra khởi động lớp?


13

Bạn có thể tạo một dự án từ start.spring.io cho vấn đề này từ https://start.spring.io/starter.zip?type=gradle-project&lingu=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&art = = demo & description = Demo% 20project% 20for% 20Spring% 20Boot & packName = com.example.demo & đóng gói = jar & javaVersion = 1.8 & Depencies = h2, data-jpa, web

Tôi có một ứng dụng springBoot đa mô-đun được xây dựng với gradle, có một loạt các bài kiểm tra tích hợp SpringBoot. Khi tôi thực hiện một bản dựng, tôi kết thúc với một số đầu ra từ tắt máy SpringBoot đến bàn điều khiển như dưới đây. Làm cách nào để tắt đầu ra này?

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

Để tham khảo một ứng dụng được tạo từ start.spring.io với gradle không tạo ra đầu ra trên màn hình

./gradlew build

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

Thay vào đó, đầu ra được đặt trong build/reports/

Trong trường hợp của tôi, tôi KHÔNG thực hiện bất kỳ thay đổi nào đối với cấu hình ghi nhật ký đi kèm với khởi động. Không có logback.xml hoặc thay đổi cho application.yml cho các mức ghi nhật ký. Tôi hy vọng rằng gradle đang nắm bắt hệ thống và lỗi hệ thống và gửi chúng đến build/reports/nhưng một số đầu ra dường như đang thoát ra khỏi hệ thống.


2
Điều chỉnh mức ghi nhật ký cho các gói hoặc lớp đó bên dưới INFO(hoặc loại bỏ hoàn toàn).
Kayaman

2
Đó là những INFOdòng nhật ký cấp. Chúng bắt nguồn từ các móc tắt máy như bạn thấy, và chúng kết thúc ở bất cứ nơi nào đăng nhập được cấu hình. Tôi cho rằng về mặt lý thuyết, các tin nhắn có thể kết thúc ở một nơi khác so với dự định, do cấu hình ghi nhật ký thay đổi và các hook được thực thi không đồng bộ sau đó. Vì vậy, nó sẽ mặc định các dòng đó đến bàn điều khiển, vì cấu hình trước đó đã được tải. Có lẽ.
Kayaman

1
Bạn có thể thêm lớp kiểm tra của bạn, và lớp ứng dụng chính của bạn quá xin vui lòng? Và bất kỳ application.properIES/yml có liên quan với cấu hình nguồn dữ liệu?
Darren Forsythe

3
Có thể là các móc tắt máy xảy ra khi các quy trình nhân viên kiểm tra Gradle bị tắt sau khi chuyển hướng đầu ra của chúng bị phá hỏng. Đó có thể là giá trị một vấn đề cấp / lớp để mở cuộc thảo luận.
eskatos

2
Lý tưởng khởi động mùa xuân là tắt máy trong các thử nghiệm của bạn mà không phải phụ thuộc vào móc tắt máy jvm, đó sẽ là một vấn đề mùa xuân.
eskatos

Câu trả lời:


4

@eskatos nói đúng. Trình quản lý ghi nhật ký được xé sau khi trường hợp kiểm thử được thực thi trước khi tắt quy trình worker. Tất cả các móc tắt máy được thực thi khi quá trình worker tắt máy và được chuyển hướng trở lại console.

Vì các thông báo này được tạo bởi khởi động mùa xuân, vị trí tốt nhất sẽ là lọc các thông báo tắt máy bằng cách sử dụng cấu hình kiểm tra logback xml.

Một cái gì đó như logback-test.xml bên trong src / test / resource

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

xây dựng. nâng cấp

testCompile 'org.codehaus.janino:janino'

1
IMO câu trả lời giải pháp tốt nhất cho đến nay.
Steffen Harbich

3

Người ta có thể vô hiệu hóa đầu ra với hoặc quyết định ghi nhật ký của một tác vụ, để kiểm soát thiết bị xuất chuẩn / thiết bị xuất chuẩn của JVM thử nghiệm: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)
    }
}

Các luồng này là TestLogEvent STANDARD_OUT& STANDARD_ERROR, đến từ JVM. Khi người ta có thể xác định một event.messagechứa extShutdownHook, người ta có thể bỏ qua việc đăng nhập.


thấy Bạn có thể tạo một dự án từ start.spring.io đến vấn đề này từ start.spring.io/... để tạo lại vấn đề
AMS

Đây có thể không phải là vấn đề, vì INFOlà mức ghi nhật ký mặc định cho Spring; người ta có thể thiết lập các mức log khác, vd. logging.level.org.springframework=TRACEnhư biến môi trường.
Martin Zeitler

1
Tôi tin rằng nhật ký hook shutdown được tạo ra bên ngoài nhiệm vụ thử nghiệm. Bạn có thể cập nhật câu trả lời của mình để cho thấy cách người ta có thể lọc các thông báo hook tắt máy không? Tôi nghĩ rằng nơi tốt nhất để lọc các tin nhắn này là nơi chúng được tạo trong mùa xuân.
Sagar Veeram

3

Tôi có thể ẩn ghi nhật ký kiểm tra dữ liệu cụ thể của dữ liệu mùa xuân (dựa trên trình khởi động mùa xuân này ) bằng cách thêm tính năng theo dõi application.propertiesvào src / test / resource:

logging.level.root=ERROR

logging.level.org.springframeworksẽ không có hiệu lực trên ví dụ com.zaxxer.hikarilogger, nhưng bạn có các tùy chọn linh hoạt ở đây.

(root=ERROR giống như "cách tiếp cận búa tạ").

( src/main/resourcescũng có thể nhưng có hiệu lực không chỉ trong thử nghiệm mà còn ở thời gian chạy ứng dụng) ( application.propertieschỉ là một trong nhiều "vị trí" có thể có cho thuộc tính này ... xem thêm: https://docs.spring.io/spring-boot/ docs / current / Reference / html / appends-application-property.html )

Với điều này, tôi nhận được một đầu ra lớp "im lặng", cũng trên clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed

0

Gradle có một chế độ yên tĩnh.

./gradlew build -q

Nhưng bạn vẫn cần thông tin về các bài kiểm tra. bạn có thể sử dụng jacoco và sonarqube. Nó làm việc cho tôi ở đâyở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.