Estoy usando un simple corredor de prueba basado en pruebas unitarias para probar mi aplicación Django.
Mi aplicación está configurada para usar un registrador básico en settings.py usando:
logging.basicConfig(level=logging.DEBUG)
Y en mi código de aplicación usando:
logger = logging.getLogger(__name__)
logger.setLevel(getattr(settings, 'LOG_LEVEL', logging.DEBUG))
Sin embargo, cuando ejecuto las pruebas unitarias, me gustaría deshabilitar el registro para que no sature la salida del resultado de mi prueba. ¿Hay una manera simple de desactivar el registro de manera global, de modo que los registradores específicos de la aplicación no escriban cosas en la consola cuando ejecuto las pruebas?
python
django
unit-testing
logging
shreddd
fuente
fuente
Respuestas:
desactivará todas las llamadas de registro con niveles menos severos o iguales
CRITICAL
. El registro se puede volver a habilitar confuente
logging.disable
(desde la respuesta aceptada) en la parte superior detests.py
su aplicación que está haciendo el registro.tearDown()
método:logging.disable(logging.NOTSET)
vuelve a colocar el registro en su lugar perfectamente.tests
módulo es muy útil.Como estás en Django, puedes agregar estas líneas a tu settings.py:
De esa manera, no tiene que agregar esa línea en cada una
setUp()
de sus pruebas.También podría hacer un par de cambios útiles para sus necesidades de prueba de esta manera.
Hay otra forma "más agradable" o "más limpia" de agregar detalles a sus pruebas y es hacer su propio corredor de pruebas.
Solo crea una clase como esta:
Y ahora agregue a su archivo settings.py:
Esto le permite hacer una modificación realmente útil que el otro enfoque no hace, que es hacer que Django solo pruebe las aplicaciones que desea. Puede hacerlo cambiando la
test_labels
adición de esta línea al corredor de prueba:fuente
Las otras respuestas evitan "escribir cosas en la consola" al configurar globalmente la infraestructura de registro para ignorar cualquier cosa. Esto funciona pero me parece un enfoque demasiado contundente. Mi enfoque es realizar un cambio de configuración que solo haga lo necesario para evitar que los registros salgan de la consola. Entonces agrego un filtro de registro personalizado a mi
settings.py
:Y configuro el registro de Django para usar el filtro:
Resultado final: cuando estoy probando, nada va a la consola, pero todo lo demás permanece igual.
¿Por qué hacer esto?
Diseño un código que contiene instrucciones de registro que se activan solo en circunstancias específicas y que deberían generar los datos exactos que necesito para el diagnóstico si las cosas salen mal. Por lo tanto, pruebo que hacen lo que se supone que deben hacer y, por lo tanto, deshabilitar completamente el registro no es viable para mí. No quiero encontrar una vez que el software esté en producción que lo que pensé que se registraría no se registra.
Además, algunos corredores de prueba (Nose, por ejemplo) capturarán registros durante la prueba y mostrarán la parte relevante del registro junto con una falla de prueba. Es útil para descubrir por qué falló una prueba. Si el registro está completamente desactivado, entonces no hay nada que pueda capturarse.
fuente
test_settings.py
archivo que se encuentra al lado de mi proyectosettings.py
. Está configurado para cargarsettings.py
y hacer algunos cambios, como establecerTESTING_MODE
enTrue
. Mis corredores de prueba están organizados para quetest_settings
sea el módulo cargado para la configuración del proyecto Django. Hay muchas formas en que esto se puede hacer. Por lo general, voy con la configuración de la variable de entornoDJANGO_SETTINGS_MODULE
aproj.test_settings
.Me gusta la idea del corredor de pruebas personalizado de Hassek. Cabe señalar que
DjangoTestSuiteRunner
ya no es el corredor de prueba predeterminado en Django 1.6+, ha sido reemplazado por elDiscoverRunner
. Para el comportamiento predeterminado, el corredor de prueba debería ser más parecido a:fuente
helpers
, que solo tiene utilidades que no importan desde ningún otro lugar dentro del proyecto.He descubierto que para las pruebas dentro de
unittest
un marco o similar, la forma más efectiva de deshabilitar de forma segura el registro no deseado en las pruebas unitarias es habilitar / deshabilitar los métodossetUp
/tearDown
de un caso de prueba en particular. Esto permite un objetivo específico donde los registros deben estar deshabilitados. También puede hacer esto explícitamente en el registrador de la clase que está probando.fuente
Estoy usando un decorador de métodos simple para deshabilitar el registro solo en un método de prueba en particular.
Y luego lo uso como en el siguiente ejemplo:
fuente
Hay un método bonito y limpio para suspender el inicio de sesión en las pruebas con el
unittest.mock.patch
método.foo.py :
tests.py :
Y
python3 -m unittest tests
no producirá salida de registro.fuente
Algunas veces quieres los registros y otras veces no. Tengo este código en mi
settings.py
Entonces, si ejecuta su prueba con las
--no-logs
opciones, obtendrá solo loscritical
registros:Es muy útil si desea acelerar las pruebas en su flujo de integración continua.
fuente
Si no lo desea, enciéndalo / desactívelo repetidamente en setUp () y tearDown () para unittest (no veo el motivo), puede hacerlo una vez por clase:
fuente
En los casos en que deseo suprimir temporalmente un registrador específico, he escrito un pequeño administrador de contexto que he encontrado útil:
Luego lo usas como:
Esto tiene la ventaja de que el registrador se vuelve a habilitar (o se restablece a su estado anterior) una vez que se
with
completa.fuente
Puede poner esto en el directorio de nivel superior para el
__init__.py
archivo de pruebas unitarias . Esto deshabilitará el registro global en el conjunto de pruebas unitarias.fuente
En mi caso, tengo un archivo de configuración
settings/test.py
creado específicamente para fines de prueba, así es como se ve:Puse una variable de entorno
DJANGO_SETTINGS_MODULE=settings.test
a/etc/environment
.fuente
Si tiene diferentes módulos de inicialización para prueba, desarrollo y producción, puede deshabilitar cualquier cosa o redirigirla en el servidor inicial. Tengo local.py, test.py y production.py que todos heredan de common.y
common.py hace toda la configuración principal, incluido este fragmento:
Luego en test.py tengo esto:
Esto reemplaza el controlador de la consola con un FileHandler y significa que todavía tengo que iniciar sesión, pero no tengo que tocar la base del código de producción.
fuente
Si estas usando
pytest
:Dado que pytest captura mensajes de registro y solo los muestra para pruebas fallidas, por lo general, no desea deshabilitar ningún registro. En su lugar, use un
settings.py
archivo separado para las pruebas (por ejemplo,test_settings.py
) y agréguelo:Esto le dice a Django que omita la configuración del registro por completo. los
LOGGING
configuración se ignorará y se puede eliminar de la configuración.Con este enfoque, no obtiene ningún registro para las pruebas aprobadas, y obtiene todos los registros disponibles para las pruebas fallidas.
Las pruebas se ejecutarán utilizando el registro configurado por
pytest
. Se puede configurar a su gusto en lapytest
configuración (por ejemplo,tox.ini
). Para incluir mensajes de registro de nivel de depuración, uselog_level = DEBUG
(o el argumento de línea de comando correspondiente).fuente