Spring Boot Test ละเว้น logging.level


94

หนึ่งในโมดูล maven ของฉันไม่สนใจระดับการบันทึกของฉันเมื่อทำการทดสอบ

ในsrc/test/resourcesฉันมีapplication.properties:

app.name=bbsng-import-backend
app.description=Import Backend Module for Application
spring.profiles.active=test

# LOGGING
logging.level.root=error
logging.level.org.springframework.core =fatal
logging.level.org.springframework.beans=fatal
logging.level.org.springframework.context=fatal
logging.level.org.springframework.transaction=error
logging.level.org.springframework.test=error
logging.level.org.springframework.web=error
logging.level.org.hibernate=ERROR

application-test.propertiesฉันยังพยายาม

แอปพลิเคชันของฉันบันทึกข้อมูลจำนวนมากโดยเฉพาะอย่างยิ่งเมื่อโหลดบริบท ฉันพยายามlogback.xml, logback-test.xmlและlogback-spring.xmlแต่ไม่มีอะไรที่จะช่วยให้

ปอมของฉัน:

<parent>
    <groupId>at.company.bbsng</groupId>
    <artifactId>bbsng-import</artifactId>
    <version>0.1.0-SNAPSHOT</version>
</parent>

<artifactId>bbsng-import-backend</artifactId>
<name>bbsng-import-backend</name>

<properties>
    <start-class>at.company.bbsng.dataimport.ApplicationImportBackend</start-class>
</properties>


<dependencies>

    <!-- APPLICATION ... -->
    <dependency>
        <groupId>at.company.bbsng</groupId>
        <artifactId>bbsng-app-domain</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- SPRING ... -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- JAVAX ... -->
       ...

    <!-- COMMONS ... -->
       ...

    <!-- LOMBOK ... -->
       ...

    <!-- DB -->
       ...

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${org.springframework.boot-version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

คลาสทดสอบง่ายๆหนึ่งคลาส:

@ContextConfiguration(classes = { ApplicationImportBackend.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {

    @Autowired
    private JobLauncher jobLauncher;

    @Test
    public void testSimpleProperties() throws Exception {
        assertNotNull(jobLauncher);
    }

}

บันทึกแอปพลิเคชันอยู่ในโหมดดีบัก

และใช่application.propertiesจะถูกโหลด ฉันพยายามทำลายแอปพลิเคชันโดยกำหนดค่าไม่ถูกต้อง

ขอบคุณสำหรับคำแนะนำใด ๆ

คำตอบ:


94

ตกลงสิ่งที่ฉันทำตอนนี้ในโมดูลทั้งหมดที่ฉันกำหนดค่าดังนี้:

src / main / resources:
ฉันใช้การกำหนดค่าการบันทึกในapplication.properieslike logging.level.*ตามที่อธิบายไว้ในคำถาม

src / test / resources:
ฉันใช้logback-test.xmlเช่น:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="*.myapp" level="error" />
    <logger name="org.springframework.core " level="error" />
    <logger name="org.springframework.beans" level="error" />
    <logger name="org.springframework.context" level="error" />
    <logger name="org.springframework.transaction" level="error" />
    <logger name="org.springframework.web" level="error" />
    <logger name="org.springframework.test" level="error" />
    <logger name="org.hibernate" level="error" />
</configuration>

แต่ฉันยังไม่เข้าใจว่าทำไมในไม่กี่โมดูลที่ฉันสามารถใช้ application.properties ได้ แต่ในโมดูลอื่นมันไม่สนใจ ... แต่ตอนนี้มันใช้ได้กับฉันเหมือนเดิม

แต่อาจมีคำแนะนำเล็กน้อยที่มีความรู้พื้นฐาน

ฉันไม่ได้ทำเครื่องหมายคำตอบของฉันว่าเป็นวิธีแก้ปัญหาเพราะยังคงรู้สึกเหมือนเป็นวิธีแก้ปัญหา


7
สมมติฐานของฉันapplication.propertiesคือถูกแยกวิเคราะห์ช้ากว่าการเริ่มต้นทดสอบ นั่นเป็นเหตุผลที่org.springframework.testไม่มีผลต่อการบันทึกการทดสอบเบื้องต้น
Elnur Abdurrakhimov

3
นี่มันเจ๋งมาก. ฉันเพิ่ม<logger name="org.springframework.boot" level="warn" />และ<logger name="org.eclipse.jetty" level="warn" />ลดเสียงรบกวนให้เหลือน้อยที่สุด <logger name="springfox" level="warn" />หากคุณกำลังใช้ผยองคุณยังสามารถเพิ่ม ทำได้ดี. มีค่าหัว!
โบฮีเมียน

1
สิ่งนี้ช่วยได้แม้ว่าฉันจะเริ่มเห็นบันทึกจำนวนมากจากการล็อกแบ็คเองหลังจากที่ฉันพยายามเพิ่มlogback-test.xmlไฟล์ ในการปิดสิ่งเหล่านั้นฉันทำตามคำตอบหลักจากโพสต์ StackOverflow นี้ - และ BAM ฉันได้จัดการเพื่อกำจัดการบันทึกเบื้องต้นทั้งหมดเมื่อเรียกใช้การทดสอบ
Danny Bullis

1
logback-test.xmlไฟล์ของฉันเรียบง่ายอย่างนี้: <? xml version = "1.0" encoding = "UTF-8"?> <configuration> <statusListener class = "ch.qos.logback.core.status.NopStatusListener" /> <รวมทรัพยากร = "org / springframework / boot / logging / logback / base.xml" /> <logger name = "org.springframework" level = "error" /> </configuration>
Danny Bullis

1
ปัญหาเดียวกัน. 2 โมดูลที่มีการกำหนดค่าเดียวกันทุกประการ (คลาสพื้นฐาน) มีการบันทึกระหว่างการสร้างบริบทและอีกอันไม่มี การเปลี่ยนแปลงใน application.properties (logging.level) จะมีผล การใช้logback-test.xmlงานข้างต้นได้ผลตามที่คาดไว้ (+1) ขอบคุณ
Torsten

28
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

ในการแก้ไขอย่างรวดเร็วฉันใส่logback.xmlไฟล์ที่มีเนื้อหาข้างต้นsrc/test/resourcesและใช้งานได้


3
ทางออกที่ดีและสะอาด ไฟล์นี้สามารถตั้งชื่อว่า "logback-test.xml" ได้เช่นกันและควรอยู่ใน "src / test / resources" เพื่อความชัดเจน
Krzysztof Tomaszewski

ใช่ความชัดเจนคือเหตุผลที่ฉันตั้งชื่อนี้logback-text.xml
Michael Hegner

คำตอบของฉันแตกต่างกันอย่างไร
Michael Hegner

22

ต้องการเปิดใช้งานapplication.propertiesจำเป็นที่จะต้องเพิ่มคำอธิบายประกอบ@SpringBootTestการเรียนการทดสอบอ่านรายละเอียดเพิ่มเติมที่นี่


2
@SpringBootTest ใช้สำหรับการทดสอบการรวมดังนั้น application.properties จะถูกโหลด แต่สำหรับการทดสอบหน่วยนี่ไม่ใช่คำตอบที่ถูกต้อง
Tobsch

12

ฉันกำลังมองหาวิธีแก้ปัญหาในขณะที่ฉันใช้วิธีแก้ปัญหาต่อไปนี้:

นี่ไม่ใช่สิ่งที่ดีที่สุด แต่ได้ผล

@BeforeClass
public static void setErrorLogging() {
   LoggingSystem.get(ClassLoader.getSystemClassLoader()).setLogLevel(Logger.ROOT_LOGGER_NAME, LogLevel.ERROR);
}

LoggingSystem: สิ่งที่เป็นนามธรรมที่พบบ่อยเกี่ยวกับระบบบันทึก

->

get: ตรวจหาและส่งคืนระบบบันทึกที่ใช้งาน รองรับ Logback และ Java Logging

setLogLevel: ตั้งค่าระดับการบันทึกสำหรับคนตัดไม้ที่กำหนด

อย่าลืมเปลี่ยนระดับการบันทึกย้อนกลับสำหรับคลาสทดสอบอื่น ๆ ทั้งหมด

หวังว่ามันจะช่วยคุณได้โชคดี


3
นี่เป็นวิธีเดียวที่ฉันจะหยุดการบันทึกได้ ขอบคุณ
RobOhRob

นี่เป็นรหัสปกติที่ควรทราบในกรณีที่คุณต้องทดสอบสิ่งที่จะเข้าสู่ระบบโดยไม่ต้องมีไฟล์กำหนดค่าตัวบันทึกจำนวนมาก
Xenson

สิ่งนี้ได้ผลเหมือนมีเสน่ห์ แค่อยากจะชี้ให้ใช้@BeforeAllถ้าใช้ JUnit5
batero เมื่อ

7

หากการทดสอบของคุณมีคำอธิบายประกอบ@DataJpaTestคุณสามารถปิดการล็อกไฮเบอร์เนต SQL ด้วย:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}

ขอบคุณนี่คือคำตอบที่ดีที่สุด ขอบคุณมาก
Doogle

2

ลองสิ่งนี้:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}

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