Yeda AI Tips · #083

English

Nunca desactives los warnings en Pytest

Silenciaste el warning que predijo tu caída en producción. Es una jugada común: la corrida de tests se pone ruidosa, alguien (o algún agente de IA) agrega --disable-warnings o -p no:warnings a la configuración, y la salida queda limpia. Los warnings no desaparecieron — solo dejaste de enterarte.

Por qué pytest muestra warnings

Python por sí solo ignora DeprecationWarning por defecto, salvo que el código que lo dispara viva en __main__: los autores de librerías te avisan y el intérprete se lo traga. Pytest invierte esto a propósito: desde la versión 3.1 captura los warnings durante la ejecución de los tests e imprime un resumen al final de la sesión, incluyendo DeprecationWarning y PendingDeprecationWarning de tu código y de las librerías que usas.

Eso no es ruido. Es el único lugar de tu flujo de trabajo donde las deprecaciones tienen garantía de aparecer. Un deprecation warning es el autor de una librería diciéndote, un release antes, exactamente cuál de tus llamadas se va a romper en la próxima actualización. Silencia el canal y la primera noticia será un stack trace — quizá en producción, quizá durante una actualización de seguridad urgente que no puedes postergar.

Los interruptores generales — y lo que hacen en realidad

OpciónQué haceVeredicto
--disable-warningsSuprime el resumen de warnings de la salidaLa propia documentación dice que no se recomienda
-p no:warningsDesactiva por completo la captura de warnings de pytestMismo problema, más a fondo
filterwarnings = ignoreIgnora todos los warnings vía configuraciónCeguera total, pero al menos visible en el repo
filterwarnings = errorConvierte los warnings en fallas de testEl default estricto al que hay que aspirar

Esto importa el doble cuando un agente de IA mantiene tu configuración. "Haz que los tests pasen limpios" es exactamente el tipo de instrucción que tienta a un agente a agregar una supresión general: cumple el pedido y esconde el costo. Revisa cualquier diff que toque filterwarnings, addopts o plugins de warnings como cualquier otro cambio de producción.

Filtra con bisturí, no con interruptor

La opción ini filterwarnings de pytest usa la misma gramática de filtros que el módulo warnings de Python, y cuando un warning coincide con varias líneas, gana la última coincidencia. Ese orden es todo el truco: empieza estricto y luego talla solo las excepciones que ya evaluaste:

[pytest]
filterwarnings =
    error
    ignore::UserWarning
    ignore:function ham\(\) is deprecated:DeprecationWarning

La línea 1 promueve cada warning a error, así las deprecaciones nuevas rompen el build el día que aparecen. Las líneas 2–3 son excepciones deliberadas y revisables: una categoría específica, o un regex de mensaje concreto de una dependencia contra la que ya abriste un issue. Cada línea ignore en la configuración es una decisión documentada, no un encogimiento de hombros.

Para una excepción de un solo test, acota aún más el alcance con el mark: @pytest.mark.filterwarnings("ignore:api v1:DeprecationWarning").

Jugadas avanzadas

Recursos

¿Construyes un flujo de ingeniería asistido por IA? Yeda AI diseña, audita y entrega sistemas LLM de producción.

Habla con nosotros · Lee el blog · Read in English