Estoy escribiendo algunas pruebas unitarias de algún código que usa sys.stderr.write para informar errores en la entrada. Esto es como debería ser, pero esto anula la salida de prueba de la unidad. ¿Hay alguna manera de decirle a Python que no muestre mensajes de error para comandos individuales, a la 2> /dev/null
?Ocultar resultados de stderr en pruebas unitarias
Respuesta
Sugiero escribir un gestor de contexto:
import contextlib
import sys
@contextlib.contextmanager
def nostderr():
savestderr = sys.stderr
class Devnull(object):
def write(self, _): pass
def flush(self): pass
sys.stderr = Devnull()
try:
yield
finally:
sys.stderr = savestderr
Ahora, envuelva cualquier fragmento de código cuya stderr que desea suprimida en un with nostderr():
y usted tiene la localizada, reversible garantizada por supresión temporal, stderr que desea.
class DevNull(object):
def write(self, data): pass
sys.stderr = DevNull()
tener una solución menos permanente, se podría averiguar algo así como de la siguiente manera:
_stderr = None
def quiet():
global _stderr
if _stderr is None:
_stderr = sys.stderr
sys.stderr = DevNull()
def verbose():
global _stderr
if _stderr is not None:
sys.stderr = _stderr
_stderr = None
Los nombres de función probablemente puede ser mejor
Esperaba una solución menos permanente. ¿No hay forma de ajustar un comando como 'quiet (...)'? – l0b0
No es necesario almacenar una copia de seguridad. Python ya tiene un sys .__ stderr__ http://docs.python.org/library/sys.html#sys.__stderr__ –
El motivo para almacenar la copia de seguridad es para que nada sea absoluto: quién sabe si alguna otra entidad de código más grande cambió el sistema. .stderr antes de ser invocado? De esta manera, simplemente estás deshaciendo tu primera acción. –
Se puede crear un objeto de archivo ficticio que no hizo nada con su salida, y establecer stderr a eso:
class NullWriter:
def write(self, s):
pass
sys.stderr = NullWriter()
Si solo quieres calmar stde rr durante un tiempo determinado, puede utilizar una declaración with
así:
class Quieter:
def __enter__(self):
self.old_stderr = sys.stderr
sys.stderr = NullWriter()
def __exit__(self, type, value, traceback):
sys.stderr = self.old_stderr
with Quieter():
# Do stuff; stderr will be suppressed, and it will be restored
# when this block exits
Requiere Python 2.6 o superior, o se puede utilizar en Python 2.5 con un from __future__ import with_statement
.
Otra posibilidad (además de la asignación a sys.stderr
) es estructurar el código para escribir errores en un archivo proporcionado, pero a ese archivo por defecto a sys.stderr. Luego puede proporcionar un escritor DevNull durante la prueba.
Si desea reasignar sys.stderr, puede utilizar el marco unittest para manejarlo para usted:
class DevNull(object):
def write(self, data):
pass
class MyTestCase(unittest.TestCase):
def setUp(self):
self.old_stderr = sys.stderr
sys.stderr = DevNull()
def tearDown(self):
sys.stderr = self.old_stderr
De esta manera, todas las pruebas de stderr dev-nulo, pero luego lo restaura al final del examen.
Esto también tiene la ventaja de que puede verificar el resultado en su prueba si así lo desea. –
- 1. Pruebas unitarias para malloc()
- 2. Pruebas unitarias en C++
- 3. Pruebas unitarias en C++
- 4. Pruebas unitarias en Python
- 5. Pruebas unitarias en flex
- 6. Pruebas unitarias en CakePHP?
- 7. Pruebas unitarias en C++
- 8. ¿Pruebas unitarias o pruebas funcionales?
- 9. Pruebas unitarias Consultas de RavenDb
- 10. Pruebas unitarias API REST
- 11. Destructores de pruebas unitarias?
- 12. Pruebas unitarias y pruebas funcionales en CodeIgniter
- 13. Pruebas unitarias Fallas WCF
- 14. Pruebas de integración vs. Pruebas unitarias
- 15. ¿Pruebas unitarias o pruebas de integración?
- 16. Pruebas unitarias en XSB Prolog?
- 17. Pruebas unitarias Controladores MVC
- 18. Pruebas unitarias Scala actores
- 19. pruebas unitarias maven plugins
- 20. Pruebas unitarias Aplicaciones Dababase
- 21. Generando pruebas unitarias automáticamente
- 22. Comenzando con Pruebas unitarias
- 23. pruebas unitarias Organizador Django
- 24. Pruebas unitarias Wpf Bindings
- 25. Pruebas unitarias Scala
- 26. Pruebas unitarias y nhibernate?
- 27. Pruebas unitarias y SAP
- 28. Pruebas unitarias con Oracle
- 29. Pruebas unitarias DAO
- 30. Pruebas unitarias con Mockito
¡Guau! Esto es maravilloso. No estaba al tanto de contextlib antes porque aún uso Python 2.4. –
@shailesh, sí, contextlib facilita la escritura de la mayoría de los gestores de contexto simples (escribir una clase con '__enter__' y' __exit__' no es difícil por supuesto, pero de esta manera, para casos suficientemente simples, tiene incluso menos código repetitivo que escribir y leer;-). –
¿Por qué no 'sys.stderr = os.devnull' – Matt3o12