A veces solo quiero insertar algunas declaraciones de impresión en mi código y ver qué se imprime cuando lo ejercito. Mi forma habitual de "hacer ejercicio" es con las pruebas pytest existentes. Pero cuando ejecuto estos, no puedo ver ninguna salida estándar (al menos desde PyCharm, mi IDE).
¿Hay una manera simple de ver la salida estándar durante una ejecución de pytest?
Respuestas:
El
-s
interruptor deshabilita la captura por prueba.fuente
-s
=--capture=no
En un comentario votado a la respuesta aceptada , Joe pregunta:
En UNIX, esto se conoce comúnmente como teeing . Idealmente, tee en lugar de capturar sería el valor predeterminado de py.test. De forma no ideal, ni py.test ni ningún complemento de py.test de terceros existente (... que yo sepa, de todos modos ) admite el teeing, a pesar de que Python admite trivialmente el tee -out-of-the-box .
Py.test parcheado de mono para hacer cualquier cosa sin soporte no es trivial. ¿Por qué? Porque:
_pytest
paquete privado que no está destinado a ser importado externamente. Intentar hacerlo sin saber lo que está haciendo generalmente da como resultado que elpytest
paquete público genere oscuras excepciones en tiempo de ejecución. Muchas gracias, py.test. Arquitectura realmente robusta que tienes allí._pytest
API de una manera segura, usted tiene que hacerlo antes de ejecutar el públicopytest
ejecute el paquete por el exteriorpy.test
de comandos. No puede hacer esto en un complemento (por ejemplo, unconftest
módulo de nivel superior en su conjunto de pruebas). En el momento en que py.test perezosamente importa dinámicamente su complemento, cualquier clase de py.test que quería parchear mono hace mucho tiempo que se ha instanciado, y no tiene acceso a esa instancia. Esto implica que, si desea que su parche de mono se aplique de manera significativa, ya no puede ejecutar con seguridad elpy.test
comando externo . En cambio, debe ajustar la ejecución de ese comando con herramientas de configuración personalizadastest
comando que (en orden):_pytest
API privada .pytest.main()
función pública para ejecutar elpy.test
comando.Esta respuesta mono-parches py.test
-s
y--capture=no
opciones para capturar stderr pero no stdout. Por defecto, estas opciones no capturan ni stderr ni stdout. Esto no es del todo bueno, por supuesto. Pero cada gran viaje comienza con una tediosa precuela que todos olvidan en cinco años.¿Por qué hacer esto? Ahora te lo diré. Mi conjunto de pruebas controladas por py.test contiene pruebas funcionales lentas. Mostrar el stdout de estas pruebas es útil y tranquilizador, evitando que leycec alcance
killall -9 py.test
cuando otra prueba funcional de larga duración no puede hacer nada durante semanas. Sin embargo, mostrar el stderr de estas pruebas evita que py.test informe rastreos de excepción en fallas de prueba. Lo cual es completamente inútil. Por lo tanto, obligamos a py.test a capturar stderr pero no stdout.Antes de llegar a él, esta respuesta asume que ya tiene un
test
comando de configuración personalizada que invoca py.test. Si no lo hace, consulte la subsección de Integración manual de la página de Buenas prácticas bien escrita de py.test .No , no instalar PYtest-corredor , un setuptools terceros plugin de proporcionar un setuptools personalizados
test
comando también invocando py.test. Si pytest-runner ya está instalado, probablemente deba desinstalar ese paquete pip3 y luego adoptar el enfoque manual vinculado anteriormente.Suponiendo que haya seguido las instrucciones en Integración manual resaltadas anteriormente, su base de código ahora debe contener un
PyTest.run_tests()
método. Modifique este método para parecerse a:Para habilitar este parche de mono, ejecute py.test de la siguiente manera:
Ahora se capturará Stderr pero no stdout. ¡Hábil!
Extender el parche de monos anterior a tee stdout y stderr se deja como un ejercicio para el lector con un barril lleno de tiempo libre.
fuente
Al ejecutar la prueba, use la
-s
opción. Todas las declaraciones de impresiónexampletest.py
se imprimirán en la consola cuando se ejecute la prueba.fuente
Según la documentación de pytest , la versión 3 de pytest puede desactivar temporalmente la captura en una prueba:
fuente
pytest captura el stdout de pruebas individuales y las muestra solo en ciertas condiciones, junto con el resumen de las pruebas que imprime por defecto.
Se puede mostrar información de resumen adicional usando la opción '-r':
muestra la salida capturada de las pruebas aprobadas.
muestra la salida capturada de las pruebas fallidas (comportamiento predeterminado).
El formato de la salida es más bonito con -r que con -s.
fuente
Intenta
pytest -s -v test_login.py
obtener más información en la consola.-v
es un corto--verbose
-s
significa 'deshabilitar toda captura'fuente
Si está utilizando PyCharm IDE, puede ejecutar esa prueba individual o todas las pruebas utilizando la barra de herramientas Ejecutar. La ventana de la herramienta Ejecutar muestra el resultado generado por su aplicación y puede ver todas las declaraciones de impresión allí como parte del resultado de la prueba.
fuente
pytest --capture=tee-sys
fue agregado recientemente. Puede capturar y ver la salida en stdout / err.fuente
Las otras respuestas no funcionan. La única forma de ver la salida capturada es utilizando el siguiente indicador:
fuente
--show-capture=all
es el valor predeterminado Agregarlo no afecta nada.