Estoy tratando de usar TDD (desarrollo basado en pruebas) con pytest
.
pytest
No print
a la consola cuando lo uso print
.
Estoy usando pytest my_tests.py
para ejecutarlo.
El documentation
parece decir que debería funcionar por defecto: http://pytest.org/latest/capture.html
Pero:
import myapplication as tum
class TestBlogger:
@classmethod
def setup_class(self):
self.user = "alice"
self.b = tum.Blogger(self.user)
print "This should be printed, but it won't be!"
def test_inherit(self):
assert issubclass(tum.Blogger, tum.Site)
links = self.b.get_links(posts)
print len(links) # This won't print either.
No se imprime nada en mi consola de salida estándar (solo el progreso normal y cuántas pruebas pasaron / fallaron).
Y el script que estoy probando contiene print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
En el unittest
módulo, todo se imprime por defecto, que es exactamente lo que necesito. Sin embargo, deseo utilizarlo pytest
por otros motivos.
¿Alguien sabe cómo hacer que se muestren las declaraciones impresas?
python
unit-testing
python-2.7
pytest
BBedit
fuente
fuente
sys.stdout.write("Test")
? ¿Qué talsys.__stdout__.write("Test")
? Este último siempre debe escribir en el stdout definido por el sistema, que debe ser la consola. Si los dos comandos hacen cosas diferentes, entonces se está cambiando stdout; si hacen lo mismo, entonces el problema es otra cosa.Respuestas:
De forma predeterminada,
py.test
captura el resultado de la salida estándar para que pueda controlar cómo se imprime. Si no hiciera esto, arrojaría mucho texto sin el contexto de qué prueba imprimió ese texto.Sin embargo, si una prueba falla, incluirá una sección en el informe resultante que muestra lo que se imprimió según el estándar en esa prueba en particular.
Por ejemplo,
Resultados en la siguiente salida:
Tenga en cuenta la
Captured stdout
sección.Si desea ver las
print
declaraciones a medida que se ejecutan, puede pasar el-s
indicador apy.test
. Sin embargo, tenga en cuenta que esto a veces puede ser difícil de analizar.fuente
El uso de la
-s
opción imprimirá la salida de todas las funciones, lo que puede ser demasiado.Si necesita un resultado particular, la página de documentos que mencionó ofrece algunas sugerencias:
Inserte
assert False, "dumb assert to make PyTest print my stuff"
al final de su función, y verá su salida debido a una prueba fallida.PyTest le ha pasado un objeto especial y puede escribir el resultado en un archivo para inspeccionarlo más tarde, como
Puede abrir los archivos
out
yerr
en una pestaña separada y dejar que el editor lo actualice automáticamente, o hacer un simplepy.test; cat out.txt
comando de shell para ejecutar su prueba.Esa es una forma bastante complicada de hacer cosas, pero puede ser que sea lo que necesita: después de todo, TDD significa que se mete con cosas y lo deja limpio y silencioso cuando está listo :-).
fuente
print()
función, debe colocar la variable o el mensaje que desea imprimir después de la coma en la declaración de aserción. Por ejemploassert False, what_are_you
, "imprimirá" el valor dewhat_are_you
en el informe de pytest.Respuesta corta
Usa la
-s
opción:Respuesta detallada
De los documentos :
pytest
tiene la opción--capture=method
en la quemethod
es per-test captura de método, y podría ser una de las siguientes:fd
,sys
ono
.pytest
también tiene la opción-s
que es un acceso directo para--capture=no
, y esta es la opción que le permitirá ver sus declaraciones de impresión en la consola.Establecer métodos de captura o deshabilitar la captura
Hay dos formas de
pytest
realizar la captura:captura de nivel del descriptor de archivo (FD) (predeterminado): se capturarán todas las escrituras que se dirijan a los descriptores de archivo 1 y 2 del sistema operativo.
captura de nivel sys : solo se capturarán las escrituras en archivos Python sys.stdout y sys.stderr. No se realiza la captura de escrituras en descriptores de archivos.
fuente
Necesitaba imprimir una advertencia importante sobre las pruebas omitidas exactamente cuando estaba
PyTest
silenciado, literalmente, todo .No quería fallar una prueba para enviar una señal, así que hice un truco de la siguiente manera:
El
atexit
módulo me permite imprimir cosas después dePyTest
lanzar las secuencias de salida. El resultado es el siguiente:El mensaje se imprime incluso cuando
PyTest
está en modo silencioso, y no se imprime si ejecuta cosaspy.test -s
, por lo que todo ya está bien probado.fuente
Según los documentos de pytest ,
pytest --capture=sys
debería funcionar. Si desea capturar el estándar dentro de una prueba, consulte el accesorio capsys.fuente
Originalmente vine aquí para encontrar cómo
PyTest
imprimir en la consola de VSCode mientras ejecutaba / depuraba la prueba de la unidad desde allí. Esto se puede hacer con la siguientelaunch.json
configuración. Dada.venv
la carpeta del entorno virtual.fuente