2011-01-18 13 views
5

Estoy usando py.test para probar algunos módulos míos que contienen un poco de stdlib logging. Por supuesto, me gustaría que el registro se registre en stdout, que es capturado por py.test, de modo que obtendré todos los mensajes de registro relevantes si falla una prueba.¿Cómo puedo combinar el registro de stdlib con py.test

El problema con esto es que el módulo de registro termina tratando de registrar mensajes al objeto 'stdout' proporcionado por py.test después de este objeto ha sido descartado por py.test. Es decir, me sale:

Traceback (most recent call last): 
    File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "/usr/lib/python2.6/logging/__init__.py", line 1508, in shutdown 
    h.flush() 
    File "/usr/lib/python2.6/logging/__init__.py", line 754, in flush 
    self.stream.flush() 
ValueError: I/O operation on closed file 

Si apago la captura con -s, no tengo ningún problema, pero por supuesto que hace que la salida de la prueba con el registro ilegibles irrelevante.

¿Alguien me puede decir la forma correcta de integrar el registro stdlib con py.test?

(I intentado buscar en this, donde parece que sólo debería funcionar sin problemas, por lo que no me ayuda mucho)

+0

¿Nos puede mostrar la forma de ejecutar su código py.test? Si eso sucede, debe ser que el registro esté configurado e inicializado ANTES de py.test, pero esto no debería ocurrir si ejecuta el código a través del ejecutable py.test. –

+0

Lo ejecuto usando la línea de comando básica 'py.test' y lo dejo recoger y ejecutar cosas como lo desee. – porgarmingduod

Respuesta

5

Registro/interacciones captura son para trabajar mejor con la próxima versión 2.0.1, que se puede instalar ya como una instantánea de desarrollo por:

pip install -i http://pypi.testrun.org pytest 

Usted debe obtener al menos "2.0.1.dev9" cuando escribe "py.test --version" después. Y el problema/error que publicó debería desaparecer.

Un poco de historia: el paquete de registro insiste en "ser dueño" de las transmisiones que utiliza, y de forma predeterminada toma sys.stderr e insiste en cerrarlo en la salida del proceso, registrado a través del módulo atexit. py.test sustituye a sys.stdout con un archivo temporal para obtener una salida de instantánea (incluida la salida en el nivel de descriptor de archivo para capturar también el resultado del subproceso). Entonces, Py.test evolucionó para tener mucho cuidado de usar siempre el mismo archivo temporal para no tener que quejarse por atexit-code.

No es que también pueda instalar el complemento [pytest-capturelog] [1], que le ayudará un poco más al tratar con la salida de registro.

[1] http://pypi.python.org/pypi/pytest-capturelog/0.7

+0

La nueva versión funcionó bien, gracias. Sin embargo, no pude hacer funcionar su comando' pip ... ', pero instalé los paquetes manualmente. – porgarmingduod

+0

me alegro de que funcionase. "pip" que falta? De lo contrario, tal vez agregar una "-U" ayudaría a asegurarse de que se actualizará. O use "easy_install" como una herramienta alternativa con las mismas opciones. – hpk42

+0

Instalé pip. No funcionó según lo prescrito. Probé easy_install, que estaba un poco confundido. Así que acabo de descargar los archivos zip para py y pytest manualmente y usé easy_install para instalarlos. – porgarmingduod

-2

Todo lo que necesita hacer es pasar la opción -s a py.test , para que no capture la salida estándar.

+0

"Si desactivo la captura con -s, no tengo ningún problema, pero por supuesto eso hace que la salida de prueba sea ilegible con el registro irrelevante." – porgarmingduod

+0

Lo siento, pensé que podría funcionar para usted – rubik

3

Si no le importa que el registro no vaya a ninguna parte después de que los objetos hayan sido descartados por py.test, puede establecer la variable de nivel de módulo logging.raiseExceptions en False en las primeras etapas de sus módulos o pruebas.

Esto hará que el módulo de registro trague las excepciones que se producen en el subsistema de registro. (También es una buena práctica para los sistemas de producción donde no desea que los errores en el registro fallen su sistema)

También puede usar logging.basicConfig() para configurar la salida de registro en un archivo separado. Pero esto probablemente no es lo que quieres.

Cuestiones relacionadas