Existe uma maneira simples de desativar o log de maneira global, para que os criadores de log específicos do aplicativo não gravem coisas no console quando executo testes?
As outras respostas evitam "gravar coisas no console", configurando globalmente a infraestrutura de log para ignorar qualquer coisa. Isso funciona, mas acho uma abordagem muito franca. Minha abordagem é executar uma alteração na configuração, que faz apenas o necessário para impedir que os logs saiam no console. Então, adiciono um filtro de log personalizado ao meu settings.py
:
from logging import Filter
class NotInTestingFilter(Filter):
def filter(self, record):
# Although I normally just put this class in the settings.py
# file, I have my reasons to load settings here. In many
# cases, you could skip the import and just read the setting
# from the local symbol space.
from django.conf import settings
# TESTING_MODE is some settings variable that tells my code
# whether the code is running in a testing environment or
# not. Any test runner I use will load the Django code in a
# way that makes it True.
return not settings.TESTING_MODE
E eu configuro o log do Django para usar o filtro:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'testing': {
'()': NotInTestingFilter
}
},
'formatters': {
'verbose': {
'format': ('%(levelname)s %(asctime)s %(module)s '
'%(process)d %(thread)d %(message)s')
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'filters': ['testing'],
'formatter': 'verbose'
},
},
'loggers': {
'foo': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
}
}
Resultado final: quando estou testando, nada vai para o console, mas todo o resto permanece o mesmo.
Por que fazer isso?
Projecto código que contém instruções de registro que são acionadas apenas em circunstâncias específicas e que devem gerar os dados exatos necessários para o diagnóstico, se algo der errado. Portanto, testo que eles fazem o que deveriam e, portanto, desativar completamente o log não é viável para mim. Não quero descobrir, depois que o software estiver em produção, que o que eu pensava que seria registrado não está registrado.
Além disso, alguns executores de teste (nariz, por exemplo) capturam logs durante o teste e emitem a parte relevante do log juntamente com uma falha no teste. É útil descobrir por que um teste falhou. Se o registro estiver completamente desativado, não há nada que possa ser capturado.