Czy istnieje prosty sposób na wyłączenie logowania w sposób globalny, tak aby rejestratory specyficzne dla aplikacji nie zapisywały informacji na konsoli, gdy uruchamiam testy?
Inne odpowiedzi zapobiegają „zapisywaniu rzeczy na konsolę” przez globalne ustawienie infrastruktury rejestrowania tak, aby cokolwiek ignorowała. To działa, ale uważam, że jest to zbyt tępe podejście. Moje podejście polega na wprowadzeniu zmiany konfiguracji, która robi tylko to, co jest potrzebne, aby zapobiec wydostawaniu się dzienników na konsolę. Dlatego dodaję niestandardowy filtr rejestrowania do mojego 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
I skonfigurowałem logowanie Django, aby użyło filtra:
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,
},
}
}
Wynik końcowy: kiedy testuję, nic nie trafia do konsoli, ale wszystko inne pozostaje takie samo.
Czemu to robić?
Projektuję kod, który zawiera instrukcje logowania, które są uruchamiane tylko w określonych okolicznościach i który powinien podawać dokładne dane potrzebne do diagnozy, jeśli coś pójdzie nie tak. Dlatego testuję , że robią to, co powinni, a zatem całkowite wyłączenie logowania nie jest dla mnie opłacalne. Nie chcę znaleźć, gdy oprogramowanie jest już w produkcji, że to, co myślałem, że zostanie zarejestrowane, nie jest rejestrowane.
Co więcej, niektóre programy uruchamiające testy (na przykład Nos) przechwytują dzienniki podczas testowania i wyświetlają odpowiednią część dziennika wraz z niepowodzeniem testu. Jest to przydatne w ustalaniu przyczyny niepowodzenia testu. Jeśli rejestrowanie jest całkowicie wyłączone, nic nie można przechwycić.