2011-12-15 6 views
6

Im usando unittest e imprime ".", "E" o "F" para "ok", "error" y "error" después de cada prueba. ¿Cómo lo apago? Estoy usando Python 2.7 y estas impresiones vienen de la clase de corredor que está incorporada. Parece muy difícil anular las clases porque está anidado.Desactivar algunas impresiones en python unittest

editar: Solo quiero quitar los caracteres E. y F porque no aparecen al mismo tiempo que otro registro en mis pruebas.

+0

¿Por qué quieres hacer esto? Sin duda, es útil ver el progreso de las pruebas? –

+0

En mi caso, agrega confusión ya que mis pruebas se ejecutan en paralelo, imprimo 1 mensaje de registro y estos mensajes de registro de prueba no están sincronizados con la "E" o la "F" correspondientes. . – swan

+0

¿Qué hay de ejecutar estas pruebas en procesos separados, que separarían los flujos de salida? –

Respuesta

1

Dependiendo del marco unittest que está utilizando (estándar, la nariz ...), tiene forma múltiple para disminuir el nivel de detalle:

python -m unittest -h 
... 
-q, --quiet  Minimal output 
... 
+1

* *. "," E "o" F "* aún se imprimen en el modo' -q'. – Constantinius

+0

No ejecuto mis pruebas a través del comando python -m unittest, sino que las ejecuto en paralelo usando esto: http://code.activestate.com/recipes/391414/ – swan

+0

En Python 3.6 el '-q' parece suprimir el cartas, pero supongo que es un error que se solucionó hace mucho tiempo. Las salidas completas de falla de prueba aún se imprimirán. – Erhhung

9

La salida de unittest se escribe en el flujo de error estándar, que puedes canalizar a otro lugar En un cuadro de * nix esto sería posible así:

python -m unittest some_module 2> /dev/null 

En las ventanas, esto debería tener este aspecto (gracias Karl Knechtel):

python -m unittest some_module 2> NUL 

Si ejecuta las pruebas de pitón , puede simplemente reemplazar la corriente stderr así:

import sys, os 

sys.stderr = open(os.devnull, 'w') 

... # do your testing here 

sys.stderr = sys.__stderr__ # if you still need the stderr stream 

Como solo desea desactivar las actualizaciones de los símbolos., F, E, también puede crear su propia clase TestResult anulando la predeterminada. En mi caso (Python 2.6), este sería el siguiente:

import unittest 

class MyTestResult(unittest._TextTestResult): 
    def addSuccess(self, test): 
     TestResult.addSuccess(self, test) 
    def addError(self, test, err): 
     TestResult.addError(self, test, err) 
    def addFailure(self, test, err): 
     TestResult.addFailure(self, test, err) 

Esto definitivamente desactiva la impresión de los caracteres, pero manteniendo la funcionalidad por defecto.

Ahora también necesitamos una nueva clase TestRunner y redefinir la _makeResult método:

class MyTestRunner(unittest.TextTestRunner): 
    def _makeResult(self): 
     return MyTestResult(self.stream, self.descriptions, self.verbosity) 

Con este corredor ahora se puede disfrutar de una prueba gratuita de registro.

Solo una nota: esto no es posible desde la línea de comando, desafortunadamente.

+0

'2> NUL' debería funcionar para Windows si estoy pensando claramente. –

+0

'os.devnull' es una cadena. ¿Querías decir 'open (os.devnull, 'w')'? – jcollado

+0

@jcollado: Sí, gracias, me lo perdí. – Constantinius

5

Una respuesta tardía, pero a alguien le puede resultar útil. Puedes activarlo. E y F fuera mediante el establecimiento de nivel de detalle a 0:

testRunner = unittest.TextTestRunner(verbosity = 0) 

todavía tendrá el resultado final y posibles errores/excepciones al final de las pruebas en el stderr.

Probado en Python 2.4 y 2.7.

Cuestiones relacionadas