วิธีการปิดการส่งออกจาก hooks ปิดในการทดสอบการไล่ระดับบูต?


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 = สาธิตและคำอธิบาย = สาธิต% 20project% 20for% 20Spring% 20Boot & packageName = com.example.demo และบรรจุภัณฑ์ขวด = & javaVersion = 1.8 และอ้างอิง = H2, ข้อมูล JPA เว็บ

ฉันมีแอพพลิเคชั่น 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(หรือลบออกอย่างสมบูรณ์)
Kayaman

2
นั่นคือINFOบรรทัดบันทึกระดับ พวกมันมาจาก hooks การปิดเครื่องตามที่คุณเห็นและจะจบลงด้วยการกำหนดค่าการบันทึก ฉันคิดว่าในทางทฤษฎีแล้วข้อความอาจจะจบลงในสถานที่ที่แตกต่างจากที่ตั้งใจไว้เนื่องจากการเปลี่ยนแปลงการกำหนดค่าการบันทึกและขอให้ดำเนินการแบบอะซิงโครนัสหลังจากนั้น ดังนั้นมันจะเริ่มต้นบรรทัดเหล่านั้นไปยังคอนโซลเนื่องจากการตั้งค่าก่อนหน้านี้ถูกยกเลิกการโหลด อาจจะ.
Kayaman

1
คุณสามารถเพิ่มคลาสการทดสอบของคุณและคลาสแอปพลิเคชันหลักของคุณด้วยได้ไหม และ application.properties/yml ที่เกี่ยวข้องใด ๆ ที่สอดคล้องกับการกำหนดค่าแหล่งข้อมูล?
Darren Forsythe

3
อาจเป็นไปได้ว่าการปิดการทำงานเกิดขึ้นเมื่อกระบวนการผู้ทดสอบของ Gradle ถูกปิดลงหลังจากที่การเปลี่ยนเส้นทางเอาต์พุตถูกฉีกลง นั่นอาจจะคุ้มค่ากับปัญหาการไล่ระดับ / การไล่ระดับเพื่อเปิดการสนทนา
eskatos

2
การบูตแบบสปริงจะเป็นการปิดระบบในการทดสอบของคุณโดยไม่ต้องอาศัยการปิดระบบ jvm ซึ่งจะเป็นปัญหาของสปริง
eskatos

คำตอบ:


4

@eskatos ถูกต้อง ตัวจัดการการบันทึกถูกฉีกลงหลังจากกรณีทดสอบถูกดำเนินการก่อนที่จะปิดกระบวนการของผู้ปฏิบัติงาน ตะขอสำหรับปิดเครื่องทั้งหมดจะทำงานเมื่อกระบวนการของผู้ปฏิบัติงานถูกปิดและถูกเปลี่ยนเส้นทางกลับไปที่คอนโซล

เนื่องจากข้อความเหล่านี้ถูกสร้างขึ้นโดย spring boot สถานที่ที่ดีที่สุดคือการกรองข้อความการปิดระบบโดยใช้การกำหนดค่าการทดสอบการย้อนกลับ

สิ่งที่ชอบ logback-test.xml ภายใน 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'

1
IMO เป็นวิธีแก้ปัญหาที่ดีที่สุดในตอนนี้
Steffen Harbich

3

หนึ่งสามารถปิดการใช้งานเอาท์พุทด้วยหรือตัดสินใจว่าจะเข้าสู่ระบบของงานเพื่อควบคุม stdout / stderr ของการทดสอบ 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)
    }
}

สตรีมเหล่านี้คือTestLogEvent STANDARD_OUT& STANDARD_ERRORซึ่งมาจาก JVM เมื่อหนึ่งสามารถกำหนดevent.messageที่มีextShutdownHookหนึ่งสามารถข้ามการบันทึก


ดูคุณสามารถสร้างโครงการจาก start.spring.io ถึงปัญหานี้ได้จากstart.spring.io/เพื่อสร้างปัญหาอีกครั้ง
ams

อาจเป็นปัญหาที่ไม่ใช่เพราะINFOระดับการบันทึกเริ่มต้นสำหรับ Spring; หนึ่งสามารถตั้งค่าระดับล็อกอื่น ๆ เช่น logging.level.org.springframework=TRACEเป็นตัวแปรด้านสิ่งแวดล้อม
Martin Zeitler

1
ฉันเชื่อว่าบันทึกของ hook ปิดถูกสร้างขึ้นนอกงานทดสอบ คุณสามารถอัปเดตคำตอบของคุณเพื่อแสดงว่ามีวิธีใดที่จะกรองข้อความขอปิดระบบได้ ฉันคิดว่าสถานที่ที่ดีที่สุดในการกรองข้อความเหล่านี้คือที่ที่พวกเขาถูกสร้างขึ้นในฤดูใบไม้ผลิอย่างไรก็ตาม
Sagar Veeram

3

ฉันสามารถซ่อนบันทึกการทดสอบเฉพาะข้อมูลสปริง (ตามสปริงเริ่มต้นนี้ ) โดยเพิ่มการ follwoing application.propertiesไปยัง src / test / resources:

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 )

ด้วยสิ่งนี้ฉันได้รับผลลัพธ์การ "ไล่ระดับสี" ที่เงียบเช่นclean buildกันใน:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed

0

Gradle มีโหมดเงียบ

./gradlew build -q

แต่คุณยังต้องการข้อมูลเกี่ยวกับการทดสอบ คุณสามารถใช้ jacoco และ sonarqube จะทำงานให้ฉันที่นี่และที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.