2009-11-10 11 views
16

Cuando se ejecuta nosetests desde la línea de comandos, ¿cómo se especifica que "no ignorado las advertencias deben ser tratados como errores?Ejecutar nosetests con advertencias como errores?

Por defecto, las advertencias se imprimen, pero no cuentan como fracasos:

[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 para generar advertencias, no quiero que esta situación es OK.

Gracias!

Editar: Lo ideal sería que lo que me gustaría es una opción de línea de comandos nosetests que emite un warnings.simplefilter('error') antes de cada ensayo (y lo limpia a cabo después).

Cualquier solución que implica el uso del módulo de warnings en el código de prueba parece derrotar 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 pueda olvidarse de 'activar' los errores de advertencia.

+0

Usted puede ser capaz de escribir [un plugin de la nariz] (http://nose.readthedocs.org/en/latest/plugins/interface.html) para leer y analizar stderr. – dbn

Respuesta

0

No creo que la nariz puede controlar directamente la siguiente: el módulo de advertencias no plantea una excepción cuando se emite la advertencia. El módulo warnings le da control sobre las advertencias que deben plantearse como excepciones.

+0

Bueno nose nose puede y sin embargo el truco de khinsen lo hace. Por cierto., = Error nosetests '' PYTHONWARNINGS ... –

9

nosetests es un pequeño script en Python. Abrirlo con un editor, y añadir -W error al final de la primera línea. Esto le dice al intérprete de Python que convierta las advertencias en excepciones.

aún más simple es utilizar la variable de entorno Python para inyectar "el tratamiento de los avisos como errores" bandera:

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

impresionante, que hace lo correcto incluso con carreras complejas, por ejemplo,'nosetests -vx tests/*. py --pdb' –

3

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

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

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

Una nariz Plugin warnaserror

Al lado de los configure y options funciones, el plugin implementa prepareTestRunner, donde reemplaza a la TestRunner predeterminado por una clase que tiene un método run diferente:

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

tiendas Esta clase TestRunner el original y su run -Método llama al ori Método de ejecución de TestRunner de ginal con un 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) 
+1

¿Le importaría proporcionar instrucciones de instalación y uso? –

Cuestiones relacionadas