Spring Boot Test ignora logging.level

94

Um dos meus módulos maven ignora meus níveis de registro ao executar testes.

Em src/test/resourceseu tenho 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

Eu também tentei application-test.properties.

Meu aplicativo registra muito, especialmente ao carregar o contexto. Eu tentei logback.xml, logback-test.xmle logback-spring.xmlmas nada ajuda.

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

Uma classe de teste simples:

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

    @Autowired
    private JobLauncher jobLauncher;

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

}

Os logs do aplicativo estão no modo DEBUG.

E sim, o application.propertiesserá carregado. Já tentei quebrar o aplicativo com a configuração errada.

Obrigado por qualquer dica.

Michael Hegner
fonte

Respostas:

94

Ok, o que fiz agora, em todos os módulos configurei da seguinte maneira:

src / main / recursos:
Eu uso configuração de log em application.properiescomo logging.level.*como descrito na pergunta.

src / test / resources:
eu 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>

Mas ainda não entendi porque em alguns módulos eu poderia usar application.properties, mas em outro módulo ele ignora ... Mas por enquanto funciona para mim como está.

Mas talvez algumas dicas com conhecimento prévio ainda sejam bem-vindas.

Não marquei minha resposta como solução, porque ainda parece uma solução alternativa.

Michael Hegner
fonte
7
Minha suposição é que application.propertiesestá sendo analisado depois da inicialização do teste. É por isso org.springframework.testque não tem efeito no log de teste inicial.
Elnur Abdurrakhimov
3
Isso é incrível. Eu adicionei <logger name="org.springframework.boot" level="warn" />e <logger name="org.eclipse.jetty" level="warn" />para realmente minimizar o ruído. Se estiver usando arrogância, você também pode adicionar <logger name="springfox" level="warn" />. Bem feito. Tenha uma recompensa!
Boêmio
1
Isso ajudou, embora eu tenha começado a ver vários logs do próprio logback depois que tentei adicionar o logback-test.xmlarquivo. Para desligá-los , segui a resposta principal deste post StackOverflow - e BAM, consegui me livrar de todo o registro precursor ao executar testes.
Danny Bullis
1
Meu logback-test.xmlarquivo era tão simples quanto este: <? Xml version = "1.0" encoding = "UTF-8"?> <configuration> <statusListener class = "ch.qos.logback.core.status.NopStatusListener" /> <incluir recurso = "org / springframework / boot / logging / logback / base.xml" /> <logger name = "org.springframework" level = "error" /> </configuration>
Danny Bullis
1
Mesmo problema. 2 Módulos com exatamente a mesma configuração (classe base). Um tem registro durante a criação do contexto, o outro não. As mudanças em application.properties (logging.level) entram em vigor. Usar acima logback-test.xmlfunciona conforme o esperado. (+1) obrigado
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>

Como uma solução rápida, coloquei o logback.xmlarquivo com o conteúdo acima src/test/resourcese funciona.

dnocode
fonte
3
Solução agradável e limpa. O arquivo também pode ser denominado "logback-test.xml" e deve ser colocado em 'src / test / resources' para maior clareza.
Krzysztof Tomaszewski,
Sim, clareza é o motivo pelo qual o logback-text.xml
chamei
qual é a diferença para minha resposta?
Michael Hegner
22

Para ativar a application.propertiesnecessidade de adicionar uma anotação @SpringBootTestà classe de teste, leia mais aqui .

ksandr
fonte
2
@SpringBootTest é para testes de integração e, portanto, o application.properties será carregado. Mas, para testes de unidade, essa não é a resposta correta.
Tobsch
12

Também estou procurando uma solução para isso, entretanto, estou usando a seguinte solução:

isso não é o melhor, mas funciona

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

LoggingSystem: uma abstração comum sobre sistemas de registro.

->

get: Detecta e retorna o sistema de registro em uso. Suporta Logback e Java Logging

setLogLevel: Define o nível de registro para um determinado registrador.

Certifique-se de alterar o nível de registro anterior para todas as outras classes de teste.

Espero que ajude você, boa sorte

Idan
fonte
3
Esta é a única maneira de interromper o registro. Obrigado
RobOhRob
Este é um trecho de código comum para saber caso você precise testar o que está sendo registrado sem ter um monte de arquivos de configuração do logger.
Xenson de
Isso funcionou como um encanto. Só quero apontar para usar @BeforeAllse estiver usando JUnit5
batero
7

Se seus testes forem anotados com, @DataJpaTestvocê pode desligar o log do Hibernate SQL com:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}
uı6ʎɹnɯ ꞁəıuɐp
fonte
Obrigado Esta é de longe a melhor resposta. Muito obrigado.
Doogle
2

Experimente isto:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}
Luboskrnac
fonte
Obrigado pela resposta, mas a saída de depuração ainda está lá. Mais cola, talvez?
Michael Hegner