Spring Boot Test ignora logging.level

91

Uno de mis módulos de maven ignora mis niveles de registro al ejecutar pruebas.

En src/test/resourcestengo 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

También lo intenté application-test.properties.

Mi aplicación registra mucho, especialmente al cargar contexto. Probé logback.xml, logback-test.xmly logback-spring.xmlpero nada ayuda.

Mi pom:

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

Una clase de prueba simple:

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

    @Autowired
    private JobLauncher jobLauncher;

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

}

Los registros de la aplicación están en modo DEBUG.

Y sí, application.propertiesse cargará. Ya intenté romper la aplicación con una configuración incorrecta.

Gracias por cualquier sugerencia.

Michael Hegner
fuente

Respuestas:

90

Está bien lo que hice ahora, en todos los módulos configuré de la siguiente manera:

src / principales recursos /:
I utilizan configuración de registro en application.properiescomo logging.level.*como se describe en la pregunta.

src / test / resources:
uso logback-test.xmlcomo:

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

Pero todavía no entiendo, por qué en pocos módulos pude usar application.properties, pero en otro módulo ignora ... Pero por ahora me funciona tal como está.

Pero quizás todavía sean bienvenidos algunos consejos con conocimientos previos.

No marco mi respuesta como solución, porque todavía se siente como una solución.

Michael Hegner
fuente
7
Mi suposición es que application.propertiesse analiza después de la inicialización de la prueba. Es por eso que org.springframework.testno tiene ningún efecto en el registro de prueba inicial.
Elnur Abdurrakhimov
mismo problema, también usando logback-test.xml
radistao
3
Esto es asombroso. Agregué <logger name="org.springframework.boot" level="warn" />y <logger name="org.eclipse.jetty" level="warn" />realmente minimicé el ruido. Si usa swagger, también puede agregar<logger name="springfox" level="warn" /> . Bien hecho. ¡Ten una recompensa!
Bohemio
1
Esto ayudó, aunque comencé a ver un montón de registros del propio logback después de intentar agregar el logback-test.xmlarchivo. Para desactivarlos , seguí la respuesta principal de esta publicación de StackOverflow , y BAM, me las arreglé para deshacerme de todos los registros precursores al ejecutar las pruebas.
Danny Bullis
1
El mismo problema. 2 módulos con exactamente la misma configuración (clase base). Uno tiene registro durante la creación del contexto, el otro no. Los cambios en application.properties (logging.level) entran en vigor. El uso de arriba logback-test.xmlfunciona como se esperaba. (+1) gracias
Torsten
27
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

Como solución rápida, coloco el logback.xmlarchivo con el contenido anterior src/test/resourcesy funciona.

dnocode
fuente
3
Solución limpia y agradable. El archivo también puede llamarse "logback-test.xml" y debe colocarse debajo de 'src / test / resources' para mayor claridad.
Krzysztof Tomaszewski
Sí, la claridad es la razón por la que lo nombrélogback-text.xml
Michael Hegner
¿Cuál es la diferencia con mi respuesta?
Michael Hegner
22

Para habilitar la application.propertiesnecesidad de agregar una anotación @SpringBootTesta la clase de prueba, lea más aquí .

ksandr
fuente
2
@SpringBootTest es para pruebas de integración y, por lo tanto, se cargará application.properties. Pero para las pruebas unitarias, esta no es la respuesta correcta.
Tobsch
11

También estoy buscando una solución para eso, mientras tanto estoy usando la siguiente solución:

esto no es lo mejor pero funciona

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

LoggingSystem: una abstracción común sobre los sistemas de registro.

->

get: Detecta y devuelve el sistema de registro en uso. Admite Logback y Java Logging

setLogLevel: Establece el nivel de registro para un registrador determinado.

Asegúrese de cambiar el nivel de registro anterior para todas las demás clases de prueba.

Espero que te ayude, buena suerte

Idan
fuente
2
Esta es la única forma en que logré detener el registro. Gracias
RobOhRob
Este es un fragmento de código habitual que debe conocer en caso de que tenga que probar lo que se está registrando sin tener un montón de archivos de configuración del registrador.
Xenson
7

Si sus pruebas están anotadas con @DataJpaTest, puede desactivar el cierre de sesión de Hibernate SQL con:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}
uı6ʎɹnɯ ꞁəıuɐp
fuente
Gracias Esta es, con mucho, la mejor respuesta. Gracias una tonelada.
Doogle
2

Prueba esto:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}
luboskrnac
fuente
Gracias por responder, pero la salida de depuración sigue ahí. ¿Quizás más pegamento?
Michael Hegner