Cómo suprimir las advertencias internas de desaprobación de py.test

94

¿Hay alguna manera de suprimir las advertencias internas de depreciación de Pytest?

Contexto: estoy buscando evaluar la dificultad de trasladar un conjunto de pruebas de nosea pytest. La suite es bastante grande y utiliza generadores de prueba basados ​​en muchos noseestilos yield.

Primero me gustaría asegurarme de que las pruebas existentes pasen con pytest, y luego tal vez cambiar los generadores de prueba a parameterized.

La ejecución $ pytest path-to-test-folderde pytest 3.0.4 está completamente dominada por páginas y páginas de

WC1 ~repos/numpy/numpy/lib/tests/test_twodim_base.py yield tests are deprecated, and scheduled to be removed in pytest 4.0

¿Hay alguna forma de desactivar estas advertencias?

ev-br
fuente

Respuestas:

85

De pytest --help:

--disable-pytest-warnings
                      disable warnings summary, overrides -r w flag
El compilador
fuente
4
Como dice el texto de ayuda, esto solo omitirá el resumen textual. El resultado seguirá siendo amarillo y mostrará que hay advertencias.
David Pärsson
Es mejor poner el archivo pytest.ini, como se muestra a continuación.
vy32
93

pytest -p no:warnings, o agregue lo siguiente a su pytest.ini o tox.ini:

[pytest]
addopts = -p no:warnings

El resultado será verde sin ninguna indicación de advertencias. Consulte la documentación en https://docs.pytest.org/en/latest/warnings.html#disabling-warnings-summary .

Este puede ser un caso de uso válido para un conjunto de pruebas en el que desea una salida limpia.

Tenga en cuenta que ocultar siempre todas las advertencias puede hacer que se pierda advertencias importantes. Si desea ocultar solo advertencias específicas, mire la respuesta de Cloc .

Blaise
fuente
2
addopts = -p no:warningses REALMENTE MALA idea, y la solución CloC es mucho más sensata, pero tuve que usar la tuya cuando ignore::InsecureRequestWarningno fue reconocida, así que obtienes +1 también
Peter M. - representa a Monica
Deshabilitar todas las advertencias de manera persistente (es decir, usar pytest.ini) casi nunca es una buena idea. Deshabilitar solo la advertencia de desaprobación (y por módulo) como describe CloC es la forma correcta de hacerlo.
Neowizard
71

Creo que no desea ocultar todas las advertencias, sino solo las que no son relevantes. Y en este caso, advertencias de depreciación de los módulos de Python importados.

Habiendo leído la documentación de Pytest sobre la captura de advertencias :

Tanto la opción de línea de comandos -W como la opción filterwarnings ini se basan en la opción -W y warnings.simplefilter de Python , así que consulte esas secciones en la documentación de Python para ver otros ejemplos y uso avanzado.

¡Entonces puedes filtrar las advertencias con la -Wopción de Python !

Parece que pytestelimina por completo los filtros, porque muestra todos esos DeprecationWarningcuando se ejecuta, y la documentación de Python sobre los filtros de advertencia predeterminados dice claramente:

En las versiones de versiones normales, el filtro de advertencia predeterminado tiene las siguientes entradas (en orden de prioridad):

default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning

Entonces, en su caso, si desea filtrar los tipos de advertencia que desea ignorar, como esos DeprecationWarning, simplemente ejecute el comando pytest con la -Wopción:

$ pytest path-to-test-folder -W ignore::DeprecationWarning

EDITAR : A partir del comentario de colini , es posible filtrar por módulo. Ejemplo para ignorar las advertencias de obsolescencia de todos los sqlalchemy:

ignore::DeprecationWarning:sqlalchemy.*:

A continuación, puede enumerar los módulos instalados que crean demasiado ruido en la salida de pytest

Úselo con un archivo en lugar de en la línea de comando:

Es posible que prefiera enumerar esos filtros en el archivo pytest.ini:

[pytest]
filterwarnings =
    ignore::DeprecationWarning
CloC
fuente
9
Para filtrar en el módulo, usa una expresión regular. Ejemplo para ignorar las advertencias de obsolescencia de todos los módulos de sqlalchemy:ignore::DeprecationWarning:sqlalchemy.*:
colini
@colini que me falló como argumento para la bandera -W, pero funcionó para mí en mi archivo pytest.ini.
WhiteHotLoveTiger
6

En el archivo pytest.ini puede agregar:

[pytest]
addopts = -p no:warnings

O pasar debajo de la línea en la línea de comandos. Esto puede resultar útil si sus conjuntos de pruebas manejan las advertencias mediante un sistema externo.

-p no: advertencias

O si solo desea ocultar alguna advertencia específica en desuso, agregue la siguiente declaración en su archivo pytest.ini

[pytest]
filterwarnings =
    ignore:.*U.*mode is deprecated:DeprecationWarning

Esto ignorará todas las advertencias de tipo DeprecationWarning donde el inicio del mensaje coincide con la expresión regular ". * U. * mode is deprecated".

O Aunque no se recomienda, puede utilizar el

--disable-warnings

opción de línea de comandos para suprimir el resumen de advertencia por completo de la salida de ejecución de prueba.

pk786
fuente
5

No quiero ocultar todas las advertencias, así que puse esto en pytest.ini

[pytest]
filterwarnings =
    ignore::DeprecationWarning
Polv
fuente