tutorial site para framework fra español python unit-testing warnings nose

site - framework django para python



¿Ejecutar pruebas con advertencias como errores? (3)

Cuando se ejecutan las nosetests de la línea de comandos, ¿cómo se especifica que las advertencias ''no ignoradas'' deben tratarse como errores?

De forma predeterminada, las advertencias se imprimen, pero no se cuentan como fallas:

[snip]/service/accounts/database.py:151: SADeprecationWarning: Use session.add() self.session.save(state) [snip]/service/accounts/database.py:97: SADeprecationWarning: Use session.add() self.session.save(user) ............ ---------------------------------------------------------------------- Ran 12 tests in 0.085s OK

Como no queremos que nuestro código genere advertencias, no quiero que esta situación sea OK .

¡Gracias!

Edición: Idealmente, lo que me gustaría es una opción de línea de comando nosetests que emita un filtro de warnings.simplefilter(''error'') antes de cada prueba (y luego la borra).

Cualquier solución que implique el uso del módulo de warnings en el código de prueba parece anular el punto. No quiero editar manualmente cada módulo de prueba para transformar las advertencias en errores. Además, no quiero que el autor de cada módulo de prueba se olvide de "activar" los errores de advertencia.


La respuesta de @khinsen ayuda mucho, pero hace que la ejecución de nosetests se detenga, si emite la siguiente advertencia durante el descubrimiento de prueba (que de lo contrario no es visible para el usuario): "ImportWarning: no importa el directorio ''XXX'': falta __init__.py

Además, las advertencias generadas durante la importación de un módulo (a diferencia de las advertencias generadas durante una prueba) no deben tratarse como errores.

Seguí el consejo de @dbw al escribir un complemento, que se puede encontrar en un github: https://github.com/Bernhard10/WarnAsError

Un plugin para la nariz WarnAsError

Junto a las funciones de configure y options , el complemento implementa prepareTestRunner , donde reemplaza el TestRunner predeterminado por una clase que tiene un método de ejecución diferente:

def prepareTestRunner(self, runner): return WaETestRunner(runner)

Esta clase almacena el TestRunner original y su run . El método llama al método de ejecución original del TestRunner con un filtro de warnings.simplefilter diferente.

class WaETestRunner(object): def __init__(self, runner): self.runner=runner def run(self, test): with warnings.catch_warnings(): warnings.simplefilter("error") return self.runner.run(test)


No creo que la nariz pueda controlar esto directamente: el módulo de advertencias no genera una excepción cuando se emite la advertencia. El módulo de warnings le da control sobre qué advertencias se deben presentar como excepciones.


nosetests es un pequeño script de Python. Ábralo con un editor y agregue el -W error al final de la primera línea. Esto le indica al intérprete de Python que convierta las advertencias en excepciones.

Aún más simple es usar la variable de entorno Python para inyectar el indicador "tratar las advertencias como errores":

PYTHONWARNINGS=error nosetests test/test_*.py --pdb